吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2334|回复: 9
收起左侧

[讨论] Hook接口 汇编取参数

[复制链接]
帝爵 发表于 2019-12-16 13:33
一直疑惑用易语言Hook一个函数后接口的参数数量是不是一定要和原参数的数量相同?
如图:

1

1
但是如果Hook一些不知道参数信息的函数,该怎么办?设想的如图:

2

2
但是具体怎么通过汇编取呢?通过mov ebx,[ebp+8](据说ebp+8是第一个参数 第二个参数是ebp+8的基础上+4以此类推) ?这就还有个问题了 看过一个游戏辅助的源码 对Hook一个地址的时候 他的构造是还有pushad 这样的汇编 我不明白为啥要将所有寄存器都压入栈(我不懂栈)为什么要把寄存器都压入栈中?书上说 栈是一种特殊访问方式的储存空间 我疑惑的是为啥要压入栈中? 如果我在接口 直接 mov ebp-4,ebx 这样取不到寄存器嘛?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

你与明日 发表于 2019-12-16 14:16
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....都是局部变量....

如果不是静态局部变量,那么他们都是在栈里面开辟空间并且使用的
xlhwxyh 发表于 2019-12-16 14:20
因为hook 后,他想执行自己的代码, 自己的代码可能会改变寄存器, 所以  pushad pushfd     保存,
当自己代码执行完成后,跳回去,popfd popad    取出, 将寄存器还原,继续执行原先代码!
 楼主| 帝爵 发表于 2019-12-17 00:19
你与明日 发表于 2019-12-16 14:16
pushad = 保存寄存器环境

可能是不想自己代码导致寄存器变动提前保护,然后结束的时候popad恢复

还有你 'HOOK接口'这个函数,里面的HOOK参数1   HOOK参数2....都是局部变量....

如果不是静态局部变量,那么他们都是在栈里面开辟空间并且使用的

我想通过汇编代码将子程序的参数123 分别赋值给局部变量123.
好奇怎么取?通过汇编代码 如果可以麻烦可以给我写个例子看下吗?
 楼主| 帝爵 发表于 2019-12-17 00:20
xlhwxyh 发表于 2019-12-16 14:20
因为hook 后,他想执行自己的代码, 自己的代码可能会改变寄存器, 所以  pushad pushfd     保存,
当自己代 ...

如果我在PUSHAD 后 修改它的寄存器  但是结尾POPAD是不是又将寄存器都还原成pushad之前的值了?
 楼主| 帝爵 发表于 2019-12-17 00:24
你与明日 发表于 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 08:00
帝爵 发表于 2019-12-17 00:20
如果我在PUSHAD 后 修改它的寄存器  但是结尾POPAD是不是又将寄存器都还原成pushad之前的值了?

是的...其实这些汇编指令查一查就能查到的
你与明日 发表于 2019-12-17 08:06
帝爵 发表于 2019-12-17 00:24
如果我Hook一个程序中的函数 那个函数不是系统API函数  

还有一个CALL指令调用,看这个CALL是哪个模式 ...

不太确定了,有人拿全局变量传参,有人会把参数放EAX,EBX这些寄存器

Delphi语言的传参模式好像就是前两个参数放 EAX  ECX,剩下的压入栈,

而C\C++的程序,可以设置 fastcall,也就是拿ecx,edx,剩下的压入栈

每个函数的传参你都需要自己去逆向分析
你与明日 发表于 2019-12-17 08:15
帝爵 发表于 2019-12-17 00:19
还有你 'HOOK接口'这个函数,里面的HOOK参数1   HOOK参数2....都是局部变量....

如果不是静态局部变量, ...

你得分析程序,看他有没有开辟 栈帧 ,然后分析下传入是放在哪里,你要通过什么方式去取,易语言最常见的就是ebp-8 , ebp-c, 但这个不太适用于其他编程语言,因为你不知道他们什么时候用什么特性
xlhwxyh 发表于 2019-12-18 21:35
当然适用,  pushad   就是保存原先的寄存器,  popad 取出,   
你hook 后,调用自己代码,   有时候会改变寄存器,    比如本来寄存器 ,  esi = 5,  你执行了自己代码,  esi=7  了,  这个时候, 你在 jmp 回原先函数,数据都给你改了, 会发生什么情况谁也不知道!!!!!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-1 08:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表