汇编怎么动态修改一段代码?

3m2u 2019-06-15 04:48:50
背景是要用c++ / asm 修改内存实现hook 的功能
一般遇到内存中代码
mov eax , 0xabcdef (1)
call addr
类似这样的 可以找个5字节的指令改成JMP myfunc 跳到自己函数的地址,然后读取相关数据再jmp回来。
问题是jmp代码+内存有3个字节的 5个字节 6字节的都有, mov一般都是5字节
改成跳自己函数还好,但是恢复现场能不能自动的来生成呢?
比如自己的函数是

VOID __declspec(naked) myfunc()
{
PUSH_DATA; ///备份各寄存器的值
ProcessData( (void*)dwESI); // 用esi的内容,自己处理相关数据

RESTORE_DATA; //恢复寄存器内容
__asm {
mov eax, 0xabcdef; // (2)
jmp dword ptr [lpBackAddr]; // (3)
}
}

为了解决call jmp长度《5的问题,可以在前面找个5的指令,改一下,跳myfunc 然后再myfunc最后(3)的地方跳回来就行
当然要在(3)之前把(1)的内容写在(2)这里。 对于简单的一个调用直接反汇编并把指令写上就行了。
如果有若干个这样的函数和地址要截获想做到自动一点的话,应该是:
另外字义一个函数sethook
a. (2)处先预留5字节
b. 把(1)处5字节的数据存起来, ReadProcessMemory或者直接内存访问
c. 找到2的偏移,把对应的内存用b得到的内容写进去。
d. 或者在(2)的地方设置 cs:ip 到 b读取出来内容(这应该是数据段,能设置执行么?) 在读取出来的内容后面加个跳转指令,即把(3)也放在上面,这样执行完后就自动跳回去了。

问题:
1. c++怎么能获取(2)的偏移呢?好像没有类似offset计算内存偏移一样,可以自动计算某行代码编译后相对函数起始地址的偏移。
2. (2)的地方内容是动态的 是不是可以?怎么实现 ?也就是说怎么在一个函数里去修改另一个函数指定的内容,或者在这个函数里怎么自己动态调整代码内容
3. 是不是可以搞个类似下面的函数 在myfunc里跳myfunc2 在初始化的时候可以把指令搞到这里?这样myfunc2的地址是知道的,就不需要知道具体某行代码的地址了
VOID __declspec(naked) myfunc2()
{
__asm {
NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
}
}

说得有点乱,希望有人能看明白指点一下。多谢。
...全文
684 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
3m2u 2019-06-17
  • 打赏
  • 举报
回复
引用 1 楼 WJN92 的回复:
1. ms的编译器不能用这个功能,gcc可以。
2.3. 你这个想法就是钩子


是钩子啊。只不过想找一段内存自动的把需要修改的一处指令自动复制过去,然后运行完自己的功能能自动恢复。
不知道怎么搞。
把主程序里的一些指令,放到另一个dll里会不会有问题。
zgl7903 2019-06-16
  • 打赏
  • 举报
回复
赵4老师 2019-06-16
  • 打赏
  • 举报
回复
WJN92 2019-06-16
  • 打赏
  • 举报
回复
1. ms的编译器不能用这个功能,gcc可以。
2.3. 你这个想法就是钩子

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧