首页
论坛
课程
招聘
[原创]无需偷代码的API HOOK
2013-5-1 00:45 26038

[原创]无需偷代码的API HOOK

2013-5-1 00:45
26038

hook api 实现的无非就是实现几种组合:
1:hook api执行自己的函数  +  执行原API + 恢复hook
2:hook api执行自己的函数  + 不执行原API + 恢复hook
3:hook api执行自己的函数  +  执行原API + 不恢复hook
4:hook api执行自己的函数  + 不执行原API + 不恢复hook

你想到的肯定是直接把hook api头部的5个byte偷到自己的函数里执行,这种方法的确可以 不过会有几个问题 ,假设api头部 2 条指令 4byte  3条指令 6byte  你只偷了5个字节的话肯定是不行的  得偷6个字节,
方法就是用反汇编引擎确定字节, 用户层还好毕竟不差那么点代码,驱动层就麻烦了,哪经得起这种奢侈,所以用反汇编引擎始终不是办法

我的解决方法
1:hook前保存hook函数的5个byte  //无论什么方法hook 这步肯定是必须的
2:修改要hook的api第一个byte为0e9就是far jmp 其实也可以修改成0e8h 不过需要用汇编  
3:修改后面4字节为offset  需要计算   自己函数地址-API地址-5
4:现在已经完成hook了 可以在自己函数里解决上面那几种方法了
4.1: hook api执行自己的函数  +  执行原API + 恢复hook?
在自己的函数里首先恢复hook api头部的5个字节
执行自己的代码
执行原api
4.2:hook api执行自己的函数  + 不执行原API + 恢复hook?
在自己的函数里首先恢复hook api头部的5个字节
执行自己的代码
4.3:hook api执行自己的函数  +  执行原API + 不恢复hook?
在自己的函数里首先恢复hook api头部的5个字节
执行自己的代码
执行原api
hook原api
4.4:hook api执行自己的函数  + 不执行原API + 不恢复hook?
在自己的函数里首先恢复hook api头部的5个字节
执行自己的代码
执行原api
hook原api

可能我的表达能力有点让人无奈,看不懂我说的话没关系看代码,我尽量写的简洁了,只为了表达一个思路

[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (61)
雪    币: 3
活跃值: 活跃值 (416)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yy大雄 活跃值 2013-5-1 01:13
2
0
在自己的函数里首先恢复hook api头部的5个字节
对于这点的话 你的HOOK 是一次性的? 其实直接 修改导入表就可以了 (不知道修改DLL的导出表可以行不)
雪    币: 200
活跃值: 活跃值 (100)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lwykj 活跃值 2013-5-1 01:24
3
0
很古老的方法了 呵呵
不过还是支持一下吧
雪    币: 2108
活跃值: 活跃值 (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wmbol 活跃值 1 2013-5-1 01:29
4
0
多线程还需要同步
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 01:40
5
0
你说和我的前几天一个朋友说的差不多,
假如多线程不同步完全是程序员的失误
否则微软能解决的话直接帮我们把问题解决就行了 , 互斥体.锁 这些东西也就没存在的必要了
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 02:36
6
0
1:hook前保存hook函数的5个byte  //无论什么方法hook 这步肯定是必须的
2:修改要hook的api第一个byte为0e9就是far jmp 其实也可以修改成0e8h 不过需要用汇编  
3:修改后面4字节为offset  需要计算   自己函数地址-API地址-5
4:现在已经完成hook了 可以在自己函数里解决上面那几种方法了

4.1: hook api执行自己的函数  +  执行原API + 不恢复hook
在自己的函数里首先恢复hook api头部的5个字节
执行自己的代码
执行原api
在跳到第二步
2:修改要hook的api第一个byte为0e9就是far jmp 其实也可以修改成0e8h 不过需要用汇编  
3:修改后面4字节为offset  需要计算   自己函数地址-API地址-5
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 03:56
7
0
直接修改IAT  达到  Hook  
上传的附件:
雪    币: 53
活跃值: 活跃值 (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
mccoysc 活跃值 2013-5-1 08:23
8
0
这种做法没任何实用意义

你把代码恢复回去的时候,这时可能正有线程执行到这段代码,这时你的hook就没任何意义
雪    币: 1619
活跃值: 活跃值 (61)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
hackerlzc 活跃值 10 2013-5-1 08:42
9
0
补充一种情况,如果API已经被HOOk,代码已经被偷,前几个字节是相对跳转。
雪    币: 2921
活跃值: 活跃值 (739)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
IamHuskar 活跃值 4 2013-5-1 08:45
10
0
多线程就有问题了
雪    币: 14
活跃值: 活跃值 (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
乐乐侠 活跃值 2013-5-1 08:51
11
0
只会InLine Hook的路过
雪    币: 939
活跃值: 活跃值 (434)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
elianmeng 活跃值 1 2013-5-1 09:07
12
0
楼上的那些情况还好说 如果遇到这种情况就死了,还说什么不要反汇编引擎 你hook能否找一些特殊的玩玩啊
比如 某函数开头是这样的 push ebp mov ebp,esp  call xxxxxx 你的这套还好使吗(还给我弄个 无论什么方法这不必须走) 反汇编引擎是确定特殊情况
雪    币: 1480
活跃值: 活跃值 (74)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2013-5-1 09:15
13
0
lz 会说,怕啥,不是有 hotpatch ,哈哈哈
雪    币: 661
活跃值: 活跃值 (620)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
qyc 活跃值 4 2013-5-1 10:44
14
0
我是直接用汇编实现!
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 18:26
15
0
无意冒犯,不会多线程同步最好别用多线程
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 18:27
16
0
我敢保证你没仔细看过代码,下次看清楚了在说吧   挺无奈的 现在咋都是这样的呢  非得做出一个演示 才行?
雪    币: 1034
活跃值: 活跃值 (69)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
boywhp 活跃值 12 2013-5-1 18:32
17
0
这蛋疼的做法还不如用反汇编引擎呢
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 18:33
18
0
好了 这俩个演示了上面所说的多线程问题 和 什么无法搞定 push ebp xxx call xxx 问题
好了 我不在回答傻问题了 会者自会吧   
上传的附件:
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 18:34
19
0
杀鸡非得用牛刀?   实现一个printf非得自己写一个系统?
雪    币: 397
活跃值: 活跃值 (709)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
KooJiSung 活跃值 2013-5-1 19:11
20
0
没意义的帖子,手贱回复了
雪    币: 2140
活跃值: 活跃值 (404)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
zhouws 活跃值 2 2013-5-1 19:13
21
0
我大胆一次吧,代码我就不看了。

我觉得楼主是不是理解错了呢?这HOOK都玩了这么久了,难道没人想出来?

另外楼主不会把别人提出的多线程问题理解成别人使用的多线程调用API前要按你的规定来吧?

不考虑其它极端问题,难道楼主是要排队所有线程的被HOOK的函数?
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 19:30
22
0
你还是看看代码吧

多线程什么的我不想解释了,现在才知道代码写的简单也会有人说

为什么你们都认为代码越复杂就越好呢?
雪    币: 939
活跃值: 活跃值 (434)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
elianmeng 活跃值 1 2013-5-1 19:44
23
0
你那样不停的恢复 不停的hook 再配合多线程 真是稳定啊 我佩服了 既然不扯了 那就不扯了
雪    币: 128
活跃值: 活跃值 (19)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
xiaoweime 活跃值 1 2013-5-1 19:51
24
0
你说特殊情况不行 我代码也给你了  你还想怎么样?
你说多线程不稳定 我代码也给你了  你还想怎么样?  
你说不停的恢复不停的hook在配合多线程不稳定   我给出的代码是 俩个线程循环  不停的恢复 不停的hook  不停的调用hook函数  你还说不稳定 你还想怎么样啊?   
要说不稳定起码也得拿出点信服力的吧?   光你动动嘴皮子我实在无话可说
雪    币: 939
活跃值: 活跃值 (434)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
elianmeng 活跃值 1 2013-5-1 19:54
25
0
我问你 A线程 在恢复到一半 B现在正好调用原始函数 此时程序是不是崩溃了 这样的代码你敢用吗?
游客
登录 | 注册 方可回帖
返回