Hook接口 汇编取参数
一直疑惑用易语言Hook一个函数后接口的参数数量是不是一定要和原参数的数量相同?如图:但是如果Hook一些不知道参数信息的函数,该怎么办?设想的如图:但是具体怎么通过汇编取呢?通过mov ebx,(据说ebp+8是第一个参数 第二个参数是ebp+8的基础上+4以此类推) ?这就还有个问题了 看过一个游戏辅助的源码 对Hook一个地址的时候 他的构造是还有pushad 这样的汇编 我不明白为啥要将所有寄存器都压入栈(我不懂栈)为什么要把寄存器都压入栈中?书上说 栈是一种特殊访问方式的储存空间 我疑惑的是为啥要压入栈中? 如果我在接口 直接 mov ebp-4,ebx 这样取不到寄存器嘛?
pushad = 保存寄存器环境
可能是不想自己代码导致寄存器变动提前保护,然后结束的时候popad恢复
还有一个CALL指令调用,看这个CALL是哪个模式调用的就哪个模式读取参数,WINDOWS的API都是 stdcall也就传参都在栈,使用push ebp;mov ebp,esp,sub esp,xxx这类提升栈写法的CALL的写法的话
ebp + 0 =原EBP地址
ebp + 4 =CALL的返回地址
ebp + 8 =(如果有传入参数) 参数1
ebp + c = (如果有传入参数) 参数2 以此类推
还有你 'HOOK接口'这个函数,里面的HOOK参数1 HOOK参数2....都是局部变量....
如果不是静态局部变量,那么他们都是在栈里面开辟空间并且使用的 因为hook 后,他想执行自己的代码, 自己的代码可能会改变寄存器, 所以pushad pushfd 保存,
当自己代码执行完成后,跳回去,popfd popad 取出, 将寄存器还原,继续执行原先代码! 你与明日 发表于 2019-12-16 14:16
pushad = 保存寄存器环境
可能是不想自己代码导致寄存器变动提前保护,然后结束的时候popad恢复
还有你 'HOOK接口'这个函数,里面的HOOK参数1 HOOK参数2....都是局部变量....
如果不是静态局部变量,那么他们都是在栈里面开辟空间并且使用的
我想通过汇编代码将子程序的参数123 分别赋值给局部变量123.
好奇怎么取?通过汇编代码 如果可以麻烦可以给我写个例子看下吗? xlhwxyh 发表于 2019-12-16 14:20
因为hook 后,他想执行自己的代码, 自己的代码可能会改变寄存器, 所以pushad pushfd 保存,
当自己代 ...
如果我在PUSHAD 后 修改它的寄存器但是结尾POPAD是不是又将寄存器都还原成pushad之前的值了? 你与明日 发表于 2019-12-16 14:16
pushad = 保存寄存器环境
可能是不想自己代码导致寄存器变动提前保护,然后结束的时候popad恢复
如果我Hook一个程序中的函数 那个函数不是系统API函数
还有一个CALL指令调用,看这个CALL是哪个模式调用的就哪个模式读取参数,WINDOWS的API都是 stdcall也就传参都在栈,使用push ebp;mov ebp,esp,sub esp,xxx这类提升栈写法的CALL的写法的话
ebp + 0 =原EBP地址
ebp + 4 =CALL的返回地址
ebp + 8 =(如果有传入参数) 参数1
ebp + c = (如果有传入参数) 参数2 以此类推
这句话还适不适用? 帝爵 发表于 2019-12-17 00:20
如果我在PUSHAD 后 修改它的寄存器但是结尾POPAD是不是又将寄存器都还原成pushad之前的值了?
是的...其实这些汇编指令查一查就能查到的 帝爵 发表于 2019-12-17 00:24
如果我Hook一个程序中的函数 那个函数不是系统API函数
还有一个CALL指令调用,看这个CALL是哪个模式 ...
不太确定了,有人拿全局变量传参,有人会把参数放EAX,EBX这些寄存器
Delphi语言的传参模式好像就是前两个参数放 EAXECX,剩下的压入栈,
而C\C++的程序,可以设置 fastcall,也就是拿ecx,edx,剩下的压入栈
每个函数的传参你都需要自己去逆向分析 帝爵 发表于 2019-12-17 00:19
还有你 'HOOK接口'这个函数,里面的HOOK参数1 HOOK参数2....都是局部变量....
如果不是静态局部变量, ...
你得分析程序,看他有没有开辟 栈帧 ,然后分析下传入是放在哪里,你要通过什么方式去取,易语言最常见的就是ebp-8 , ebp-c, 但这个不太适用于其他编程语言,因为你不知道他们什么时候用什么特性 当然适用,pushad 就是保存原先的寄存器,popad 取出,
你hook 后,调用自己代码, 有时候会改变寄存器, 比如本来寄存器 ,esi = 5,你执行了自己代码,esi=7了,这个时候, 你在 jmp 回原先函数,数据都给你改了, 会发生什么情况谁也不知道!!!!!
页:
[1]