起因是看到1年前的一个帖子
https://tieba.baidu.com/p/7278136876?pid=138522633377&cid=138557358445#138557358445
最近是闲的蛋痛,来验证一下我当时的回复
目标进程是64位,纯用VB6写是不可能使用DLL,本应该DLL干的活现在只能用64位汇编构建
开始是想用jmp跳转,结果发现很多地方不好下手,因指令字节限制,写跳转指令太麻烦
最后干脆一步到位 硬件断点+VEH异常处理
拦截原理,
在目标进程注册一个用汇编构建的VEH异常处理函数,在需要拦截的地址下硬件断点,目标代码执行到断点地址线程中断,进入VEH异常处理函数执行
VEH函数内并不处理异常,而是通过sendmessage把参数指针发给我们的VB6程序,同时sendmessage函数会堵塞当前线程等待结果返回才会继续运行。
VB6程序在收到消息后接管目标进程的异常处理,通过sendmessage发过来的参数指针从目标进程读出中断处的信息,包括CONTEXT(线程上下文)
有了这个线程上下文,就能拿到目标线程中断处所有继存器的值,如果是函数头下断,这里面包括函数调用的各种信息,参数,返回地址什么的
可以读出来,也可以修改再写回去,处理完后返回,让目标进程继续运行,这样拦截不需要修改原机器码,传说中的无痕HOOK,而且是垮进程处理异常也没谁了
下面是一些关键代码
https://tieba.baidu.com/p/7278136876?pid=138522633377&cid=138557358445#138557358445
最近是闲的蛋痛,来验证一下我当时的回复
目标进程是64位,纯用VB6写是不可能使用DLL,本应该DLL干的活现在只能用64位汇编构建
开始是想用jmp跳转,结果发现很多地方不好下手,因指令字节限制,写跳转指令太麻烦
最后干脆一步到位 硬件断点+VEH异常处理
拦截原理,
在目标进程注册一个用汇编构建的VEH异常处理函数,在需要拦截的地址下硬件断点,目标代码执行到断点地址线程中断,进入VEH异常处理函数执行
VEH函数内并不处理异常,而是通过sendmessage把参数指针发给我们的VB6程序,同时sendmessage函数会堵塞当前线程等待结果返回才会继续运行。
VB6程序在收到消息后接管目标进程的异常处理,通过sendmessage发过来的参数指针从目标进程读出中断处的信息,包括CONTEXT(线程上下文)
有了这个线程上下文,就能拿到目标线程中断处所有继存器的值,如果是函数头下断,这里面包括函数调用的各种信息,参数,返回地址什么的
可以读出来,也可以修改再写回去,处理完后返回,让目标进程继续运行,这样拦截不需要修改原机器码,传说中的无痕HOOK,而且是垮进程处理异常也没谁了
下面是一些关键代码