VC注入dll后,如何用代码实现inline hook?
发布网友
发布时间:2022-05-09 10:00
我来回答
共2个回答
热心网友
时间:2024-01-29 22:52
最常用的DLL注入是借助CreateRemoteThread() 函数,把LoadLibrary()做为线程函数的地址实现注入,网上的大部代码都是这样的。早期有一款安全类的工具,叫mt.exe 它里面有一个mt.exe -su的命令,就是使用的这种方法,我找了一个我原来写的实例。我直接打包了。
另外一种是直接PE注入。这类似于病毒感染的方法,大体上的思维就是在游戏的可执行文件中寻找空段。写入类似于shellcode一段精简代码,这段代码实现你想要的功能,最后你修改pe文件的入口点即可。这样就实现了一种劫持。这个实例代码不知道放哪里去了,但是找到一个分析红客联盟创始人lion写的shellcode的一篇笔记,我一起打包了,应该会对你有所帮助。这方面的资料网上很多的,不是什么新东西了。
如果你要实现的代码很少,完全可以把指令当成一个char类型的数组,直接写入pe的空段就可以了,如果很多,可以新建立一个PE空段,再写入,或者直接将要执行的代码写入到一个DLL中封装。。
热心网友
时间:2024-01-29 22:53
关键点吗……
1、恢复现场,要存多少字节根据你填入的jmp占用多少字节而定,jmp rel32是5个字节。
2、od找0那一段,程序操作的话你可以用malloc申请的内存来,而不一定是exe里的0
3、VirtualProtect调用可以使代码段可写(否则修改的时候会出现写入异常,程序崩溃)
4、jmp rel32指令的机器代码是 E9 rel32 一共5个字节。如果嫌计算相对地址麻烦你也可以用 jmp mem32,机器指令是FF 25 mem32(没记错的话……也有可能是FF 15)。但是我觉得这样更麻烦
5、jmp rel32指令中,rel32相对的是执行jmp之后的eip。例如
40000: E9 11 22 33 44
40005: ......
那么翻译过来就是
40000: jmp 44372216
6、不确定要hook的代码位置的指令多长的话,你可能需要一个反汇编库来确定,当然更容易(但是不通用)的方式是人工查看……跳转来跳转去记得一定要跳转到机器代码边界上,比如刚才那个
40000: E9 11 22 33 44
你不可以跳转到(40000, 40005)区间的任何一个地址上,但是可以跳转到40000或40005地址上。