Alps 发表于 2020-2-25 02:31

【新年礼物】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 02:39

本帖最后由 Alps 于 2020-2-25 04:18 编辑

欢迎提出建议

Crook 发表于 2020-2-25 02:37

就等你的下载地址了

sqxlac 发表于 2020-2-25 02:54

Alps大佬牛批,小弟来占楼了

sqxlac 发表于 2020-2-25 03:09

阿尔卑斯大佬把下载地址也补上吧

M赵山河W 发表于 2020-2-25 04:37

支持64位程序hookapi不?

四公子丶 发表于 2020-2-25 06:53

我想要汉化版{:5_118:}

Jewel 发表于 2020-2-25 08:02

这贴精华顶了

萌萌的小短腿 发表于 2020-2-25 12:52

阿尔卑斯大佬牛批!!!

chenyu520 发表于 2020-2-25 13:08

你将受到所有人的崇拜!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【新年礼物】Alps_SuperHook 骨灰级剖析