|
Posted on 2010-02-02 22:03 S.l.e!ep.¢% 阅读(605) 评论(0) 编辑 收藏 引用 所属分类: RootKit
【原创】Hook Api lib 0.4 for C
|
|
标 题:
【原创】Hook Api lib 0.4 for C
作 者:
海风月影
时 间: 2008-01-11,13:51 链 接: http://bbs.pediy.com/showthread.php?t=58101
前一段时间,一位朋友提出了GetOpCodeSize计算不正确,小小更新了一下 现在用的是deroko 的LDEX86来取指令长度,比较通俗易懂 Stub也小小更新了一下,完善一些功能
HookAPILib 0[1].4.rar
2
2008-01-11, 17:55
|
|
看了下,没怎么看懂。感觉是很好,很强大!呵呵! GetOpCodeSize() 这个函数很有创意呀。以前也想写一个,根本不知道如何下手```呵呵
9 2008-01-13, 18:02 | |
HookApi.cpp里面有个例子 17 2008-03-31, 18:48 | |
请问你这个hook如何卸载? 能详细解释一下你的例子里的main函数里面的几条语句的含义嘛? 另外那两个stub的含义能一并解释一下嘛? 1,不能卸载,不考虑那个功能,因为可以重入(目前不是线程安全的,以后改进) 2, //Hook WriteProcessMemory,在调用完WriteProcessMemory时候执行我们的函数My_WriteProcessMemory SetOnAfter("Kernel32.dll","WriteProcessMemory",My_WriteProcessMemory); //hook ReadProcessMemory,在调用ReadProcessMemory前执行我们的函数My_WriteProcessMemory_1 SetOnBefore("Kernel32.dll","ReadProcessMemory",My_WriteProcessMemory_1); //下面是正常调用API WriteProcessMemory(GetCurrentProcess(), (LPVOID)0x40108f, JMPGate, sizeof(JMPGate), (DWORD*)RetSize); MessageBoxA(NULL,"Safe Here!!!","Very Good!!",NULL); 程序都退出了,还要Hook干嘛呢? 个人认为,一般来说卸载都是为了反检测,我这个HookLib没有反检测功能,自己随便用用的而已,不要见笑 我的意思是,假设一个软件A.exe调用了createfile这个函数,我想拦截这个程序对此函数的调用, 那么按照你的写法,我写了一个B.exeexe,里面的主要内容是下面: SetOnAfter("Kernel32.dll","CreateFileA",My_CreateFileA_After); SetOnBefore("Kernel32.dll","CreateFileA",My_CreateFileA_Before); DWORD __stdcall My_CreateFileA_After(........) { 记录参数到文件C.txt } DWORD __stdcall My_CreateFileA_Before(........) { 记录参数到文件C.txt } 运行这个B.exe后,那么系统里所有调用CreateFileA函数的进程或者模块(不仅仅是A.exe)都会被拦截,都会执行我们定义的那2个函数,对吧? 我的问题是: 1.B.exe运行起来后,任何系统中调用createfile的时候都会被记录到c.txt中,即使B.exe退出,也不能终止这种情况,是这样的嘛? 2.这个时候我再重新运行B.exe.会不会再次重复增加我们的代码在上次被HOOK了函数上? 另外,你的代码有两个警告,不知道有问题没? D:\work\HOOKAPI\HOOKAPI.cpp(343) : warning C4102: 'check_modrm' : unreferenced label D:\work\HOOKAPI\HOOKAPI.cpp(292) : warning C4101: 'tempopcode' : unreferenced local variable
经过测试,发现几个问题. 1.不能针对同一个函数调用前后HOOK,譬如 int main() { if(!SetOnBefore("Kernel3.dll","DeviceIoControl",DeviceIoControl_Before)) ::MessageBox(0,"Before","error",0);; if(!SetOnAfter("Kernel32.dll","DeviceIoControl",DeviceIoControl_After)) ::MessageBox(0,"After","error",0); DeviceIoControl(0,0,0,0,0,0,0,0); return 0; } 这样会出错,具体看附件的程序,用OD跟踪一下就明白,不知道是否有前后顺序没? 2.HOOK的函数只对本exe的进程空间有效,可以测试的是,开两个OD,一个跟踪这个exe,直到确认已经成功更改要HOOK的函数,然后此时打开另外一个OD,随便调试一个别的程序,会发觉前面HOOK的函数根本没有变化.... 3.关于多次调用SetOnBefore或者SetOnAfter函数,此情况跟第一种情况类似,会跑飞代码~~ int main() { if(!SetOnBefore("Kernel3.dll","DeviceIoControl",DeviceIoControl_Before)) ::MessageBox(0,"Before","error",0);; if(!SetOnBefore("Kernel3.dll","DeviceIoControl",DeviceIoControl_Before)) ::MessageBox(0,"Before","error",0);; DeviceIoControl(0,0,0,0,0,0,0,0); return 0; } 以上情况不知道是否跟我机器有关? 我的系统是XPsp2中文版,装有Returnil Virtual System Premium Edition Beta V2.1.0.5829,并且系统(C盘)处于保护模式. 此外没有安装任何别的主动防疫或者杀毒软件. 请作者多多改进~~
| |
| | |
|