VC注入dll后,如何用代码实现inline hook?
最近在研究inlinehook,但是没找到合适的代码例子做参考。现在我在用植物大战僵尸这个小游戏做练习。现在的目标就是,在点击拾取阳光的时候,希望能随意控制拾取到的阳光值...
最近在研究inline hook,但是没找到合适的代码例子做参考。
现在我在用植物大战僵尸这个小游戏做练习。现在的目标就是,在点击拾取阳光的时候,希望能随意控制拾取到的阳光值,比如拾取到的阳光值翻一倍,两倍,这种。
现在我可以在OD下使用inline patch的方式实现这个,其实很简单,在阳光值修改位置写入一个jmp,然后跳到一个00填充的无用位置,写入汇编代码修改阳光值,比如 imul eax,eax,2这样,可以翻一倍。最后jmp回去,就OK了。
现在我想用代码实现这个过程,但是没搞过,不太懂。
详细点的要求就是,构造一个用于hook的结构体,大致是这样:
struct JmpHook
{
DWORD hookAddr //要hook的目标地址,会在此处写入jmp指令
DWORD hookProc //jmp的跳转位置,即hook挂接的处理函数
int[] code //hookAddr后的一段汇编指令,用于卸载inline hook时的恢复现场
}
这个结构体中的第三个数据成员 code,没太想好改怎么弄。我想的是通过这么一个结构来记录hook相关的信息,然后在卸载的时候进行恢复,在hook的时候,会读取hook点后面的指令填充到code中。jmp过去的会是一个函数。
求hook和unhook函数的写法。或者不用这个结构体也行,请给出合理的实现。
如果嫌麻烦,给点提示也可以不过我会追问。只要能帮我搞定这个问题就行了,这个具体的代码谁来写无所谓,给我说下关键点,我自己写也行。 展开
现在我在用植物大战僵尸这个小游戏做练习。现在的目标就是,在点击拾取阳光的时候,希望能随意控制拾取到的阳光值,比如拾取到的阳光值翻一倍,两倍,这种。
现在我可以在OD下使用inline patch的方式实现这个,其实很简单,在阳光值修改位置写入一个jmp,然后跳到一个00填充的无用位置,写入汇编代码修改阳光值,比如 imul eax,eax,2这样,可以翻一倍。最后jmp回去,就OK了。
现在我想用代码实现这个过程,但是没搞过,不太懂。
详细点的要求就是,构造一个用于hook的结构体,大致是这样:
struct JmpHook
{
DWORD hookAddr //要hook的目标地址,会在此处写入jmp指令
DWORD hookProc //jmp的跳转位置,即hook挂接的处理函数
int[] code //hookAddr后的一段汇编指令,用于卸载inline hook时的恢复现场
}
这个结构体中的第三个数据成员 code,没太想好改怎么弄。我想的是通过这么一个结构来记录hook相关的信息,然后在卸载的时候进行恢复,在hook的时候,会读取hook点后面的指令填充到code中。jmp过去的会是一个函数。
求hook和unhook函数的写法。或者不用这个结构体也行,请给出合理的实现。
如果嫌麻烦,给点提示也可以不过我会追问。只要能帮我搞定这个问题就行了,这个具体的代码谁来写无所谓,给我说下关键点,我自己写也行。 展开
2个回答
展开全部
最常用的DLL注入是借助CreateRemoteThread() 函数,把LoadLibrary()做为线程函数的地址实现注入,网上的大部代码都是这样的。早期有一款安全类的工具,叫mt.exe 它里面有一个mt.exe -su的命令,就是使用的这种方法,我找了一个我原来写的实例。我直接打包了。
另外一种是直接PE注入。这类似于病毒感染的方法,大体上的思维就是在游戏的可执行文件中寻找空段。写入类似于shellcode一段精简代码,这段代码实现你想要的功能,最后你修改pe文件的入口点即可。这样就实现了一种劫持。这个实例代码不知道放哪里去了,但是找到一个分析红客联盟创始人lion写的shellcode的一篇笔记,我一起打包了,应该会对你有所帮助。这方面的资料网上很多的,不是什么新东西了。
如果你要实现的代码很少,完全可以把指令当成一个char类型的数组,直接写入pe的空段就可以了,如果很多,可以新建立一个PE空段,再写入,或者直接将要执行的代码写入到一个DLL中封装。。
展开全部
关键点吗……
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地址上。
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地址上。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询