程序发布:WatchU,一个用于监视Windows下系统、用户级API调用的工具程序
WatchU是一个用于监视Windows下系统、用户级API调用的工具程序,理论上可以监视所有非系统进
程里对绝大多数系统API和全部用户API的调用情况,包括调用参数和返回值。并可监视多线程进程。
由于监听原理的关系,如下API不要设定为监听:
EnterCriticalSection
LeaveCriticalSection
ReadProcessMemory
WriteProcessMemory
WatchU包括两部分,WatchU主程序和wiretap.dll监听库,两者必需放在同一目录下。除此之外,
还包括监听用配置文件,后缀为.xml。目前提供的包括:
ws2_32.xml 对应ws2_32.dll中几个主要的调用函数
user32.xml 对应user32.dll中几个主要的调用函数
kernel32.xml 对应kernel32.dll中几个主要的调用函数
配置文件可以根据需要自己增加或者修改。格式说明如下:
<DLL LIBNAME="ws2_32.dll">
<API APINAME="accept" ATTR="STDCALL" VIRGINCODELEN="8">
<PARAM PARAMNAME="s" ATTR="IN" TYPE="I4" LEN="0"/>
<PARAM PARAMNAME="addr" ATTR="OUT" TYPE="BUFFER" LEN="addrlen"/>
<PARAM PARAMNAME="addrlen" ATTR="OUT" TYPE="PI4" LEN="0"/>
</API>
<DLL>
<DLL>设定需要监视的DLL名称,如果dll不在搜索路径上,需要使用完整路径名;
<API>设定需要监视的函数名称,
ATTR属性设定函数属性,分为STDCALL/CDECL两种,区别就是STDCALL为被调用者清栈,CDECL为调用者清栈;
VIRGINCODELEN属性设定函数起始位置的代码长度,由于监听原理的关系,需要设定原API函数在起始位置处
的代码长度,要求VIRGINCODELEN必需大于等于6,且原函数在VIRGINCODELEN处恰好处于代码分界处。确定
VIRGINCODELEN的方法后面详述。
<PARAM>设定函数的输入参数,必须列举出该函数的全部函数,PARAMNAME只是用于输出监听报告;
ATTR属性设定参数的输入、输出属性,分为IN/OUT/INOUT三种
TYPE为参数类型,I1/I2/I4分别表示1、2、4个字节的整型,PI1/PI2/PI4表示指向I1/I2/I4的指针,
STRING表示为MULTIBYTES字符串,UNICODE表示为UNICODE字符串,BUFFER表示指向二进制数据区的指针,
LEN为参数长度,只有BUFFER属性需要设置该属性,如果BUFFER长度取决于另一个参数,则在该处填写该参数的
PARAMNAME
确定函数VIRGINCODELEN,目前还没有找到更好的方法,只能这样处理(以VC为例):
写这样一段代码,然后在jmp p处设定断点,运行到断点处时,F11单步运行一步,
这是就会看到send函数处的汇编代码,找到第一个代码边界处,使其前面代码的长
度大于等于6,这个长度就是VIRGINCODELEN。各API的VIRGINCODELEN在各WINDOWS版本
下都可能不一样,因此,建议各位都在自己机器上做这样一步工作。
VIRGINCODELEN错误,会导致被监视进程出现非法操作。
#include <windows.h>
#include <stdio.h>
int main()
{
FARPROC p;
HMODULE hLib = ::LoadLibrary("ws2_32.dll");
if (hLib != NULL)
{
p = ::GetProcAddress(hLib, "send");
_asm
{
jmp p
}
}
return 0;
}
监听时,主程序上会显示监听结果,包括每个函数的调用、返回,以及具体参数值;并同时
会将监听结果写入一个trace.log文件,该文件可以通过菜单命令设定路径名。
胡源
http://huyuan.nease.net
hu.yuan@tom.com
下载地址:
http://huyuan.nease.net/assault/WatchU20050622.zip