【新年礼物】Alps_SuperHook 骨灰级剖析
本帖最后由 Alps 于 2020-2-25 12:51 编辑定场诗:
道德三皇五帝,功名夏后商周。五霸七雄闹春秋,顷刻兴亡过手。
青史几行名姓,北邙无数荒丘。前人播种后人收,说甚龙争虎斗。
{:5_121:}各位看官猜猜看礼物是什么呢?....
3......
2.....
1...
书归正传
Alps_SuperHook(后文简称ASHook)是一个易语言的hook类模块
ASHook(Alps)与Hook4E(BaZzi)、超级Hook(某鬼作坊)的比较:
阿尔卑斯 ASHook HooK4E 超级Hook
读写寄存器 稳定高效 不支持 BUG多不稳定
Hook JCC 不支持 支持 不支持
Call原函数 支持 支持 不支持
读写方式 汇编 API API
接口hook 支持 支持 不支持
插入汇编代码 支持 不支持 支持
怎么样~ 心动了叭{:5_121:} 各位看官请留步,且听我娓娓道来...
ASHook由6个部分组成:第一部分是Start(开始hook)
Hook_Addr:提供被hook的地址
例如:
0040101A 8945 FC mov dword ptr ss:,eax0040101A是十六进制 把它转换成十进制 等于 4198426所以地址这里填写 4198426
CallBack:提供子程序指针,当程序走到被hook的地址后,会调用这个你用来打补丁的子程序。
例如:
0040101A 8945 FC mov dword ptr ss:,eax
当程序运行到0040101A的时候,想让他调用自己的子程序来执行补丁代码,这里就写你打补丁对应的子程序
Hook_Len:被占用的汇编代码的字节长度,这一点跟超级hook是一样的。
例如:
004C4B35 8915 D84B5600 mov dword ptr ds:,edx
89 15 D84B 56 00
1 2 3 4 5 6
在004C4B35这个地址hook, 此时长度应该填写6 因为mov dword ptr ds:,edx有6个字节
0040101A 8945 FC mov dword ptr ss:,eax
0040101D BB 06000000 mov ebx,0x6
89 45 FC BB 06 00 00 00
1 2 3 4 5 6 7 8
在0040101A这个地址hook, 此时长度应该填写8
因为0040101A 8945 FC mov dword ptr ss:,eax 不足5个字节
一个长的jmp占用5个字节 所以要占用两行代码这两行代码有8个字节
Hook_Index:这个序号对应的是寄存器的数组序号,用来读写对应的寄存器。
例如:
第一个hook 这里填1,第二个填2...后面读写寄存器 会用到这个序号 AsHook.ReadValue (1)
HookData .Reg.EAX = 1
AsHook.WriteValue (1)
Mode:ASHook提供两种模式的hook, 0是插入式,1是转接式。
区别:
0插入式:JMP进入中转站,中转站保存寄存器值,中转站Call CallBack,执行完CallBack恢复寄存器,执行被占用的汇编代码,JMP出中转站.
1转接式:JMP进入中转站,中转站保存寄存器值,中转站JMP CallBack.
补丁写法为:
InjectCode:模式0:在调用完Call Back后 被hook占用的代码之前,插入一段可以自定义的汇编代码。
例如:
当程序走到被hook的地址时,给EAX赋值为1
AsHook.Start (4198785, &修改登录结果2_模式0, 6, 2, 0, { 184, 1, 0, 0, 0 })' { 184, 1, 0, 0, 0 } = mov eax,1
模式1:Call原函数的时候,会先执行InjectCode,然后再执行原函数。
第二部分是Stop(停止hook)
恢复被hook占用的字节,不再继续hook。AsHook.Stop (1)这里的1 是Hook_Index 也就是前面Start设置的序号。
第三部分是Continue(继续hook)
之前Stop停止的hook 可以调用Continue 直接继续hook。AsHook.Continue (1)这里的1 是Hook_Index 也就是前面Start设置的序号。
第四部分是ReadValue(读寄存器值)
不论是要读或者写 寄存器 都要先调用该函数。
AsHook.ReadValue (1)
然后可以用HookData .Reg.XXX 来获取对应寄存器的值
这里的1 同样是Hook_Index
第五部分是WriteValue(写寄存器值)
需要先调用AsHook.ReadValue (1)
HookData .Reg.XXX = XXX // 对寄存器赋值
然后调用AsHook.WriteValue (1)
第六部分是Call原函数
用处在很多地方都能体现,例如抓某某验证的返回数据,找到他函数头,用模式1hook,然后调用它原函数,你就可以获取到他的参数和返回值了。
.子程序 接管登录子程序2_模式1, 逻辑型
.参数 登录密码, 文本型
.局部变量 ret, 整数型
ret = Alps_Call (HookData .FuncAddr, 取变量地址 (登录密码))
信息框 (“原函数执行结果:” + 到文本 (ret) + “获取到登录密码:” + 登录密码, 0, , )
返回 (真)
下载地址:https://www.lanzouw.com/i9njz5g
本帖最后由 Alps 于 2020-2-25 04:18 编辑
欢迎提出建议 就等你的下载地址了 Alps大佬牛批,小弟来占楼了 阿尔卑斯大佬把下载地址也补上吧 支持64位程序hookapi不? 我想要汉化版{:5_118:} 这贴精华顶了 阿尔卑斯大佬牛批!!! 你将受到所有人的崇拜!