首页
社区
课程
招聘
[讨论]请问HOOK自己进程API写函数头写到一半,其他线程执行该API时怎么办?
发表于: 2014-2-1 19:11 5818

[讨论]请问HOOK自己进程API写函数头写到一半,其他线程执行该API时怎么办?

2014-2-1 19:11
5818
大家都知道往API函数头部写JMP XXXXXXXX,问题是正写到一半的时候,正有自己进程其他线程执行到该API,此时应该发生是什么样的情况呢?写自己进程的某API头部,不需要WriteProcessMemory吧?
直接rep movs应该可以吧?问题是正把前3个字节覆盖了,后面还有2个字节没覆盖,此时有其他线程调用该API会发生什么样的情况呢?
麻烦各位大神帮忙解释一下,或者如何避免这样的不安全的行为,谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (22)
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大家给点意见啊,别都看着啊
2014-2-1 19:13
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
各位大神指教一下啊....
2014-2-1 19:31
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
蓝呗,还会有神马情况?
2014-2-1 19:46
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
有条指令是原子操作:CMPXCHG8B.
有些人介绍貌似有效
但是我觉得还是可能会发生蓝屏。
最保险的方法应该是让其他所有的核都跑在你设定的一个安全死循环的线程。等你安全完成inline hook以后在开放其他核让其自由执行。但是这样,如果你不断的inline hook,然后又不断的把着8个字节改回原来的字节,那样的系统开销就太大了吧。
2014-2-1 19:50
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
就一个简单的注入目标进程之后,HOOK某个API,向这API开头处写JMP 0x12345678,用rep movs或者其他指令,问题是目标进程很多个线程,如果在覆盖头部写到一半时,其他线程执行到这API时..会不会不稳当啊
很容易找到如何HOOK系统API的资料,但是我没找到如何写入头部的资料,特别是线程很多的情况下,如何把JMPXXXXXXXX写入API头部.......
2014-2-1 19:57
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
如果设计好只写4个字节或者8个字节,那么出问题的概率低一些
2014-2-1 20:04
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
主要是JMPXXXXXXXX有5字节
2014-2-1 20:09
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
CMPXCHG8B,第一次见到,听起来不错,我去试试
2014-2-1 20:12
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
请问有这样的指令吗?这样算不算原子操作?lock rep movsb?
2014-2-1 20:13
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
算了,用最愚蠢的办法,0xEB 0xFE
2014-2-1 22:09
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
你想多了,这东西本来就是没救的……那些各种意淫方法,不过是脱了裤子放屁,多此一举而已

比如,之前有人说的,interlocked那一系列函数,那东西的前提是所有操作你要锁定的那些内存地址的操作,人家都和你一样用interlocked函数,光这个要求你就做不到……

其它不说了,再说一遍,纯粹是脱了裤子放屁,多此一举
2014-2-1 22:44
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
mccoysc 大神,求给个写E9 01 23 45 67进某API的方法.
2014-2-1 23:00
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
网上大篇大篇的都是WriteProcessMemory,难道正写到一半,其他线程刚好跑来执行时,不会出事吗?
2014-2-1 23:02
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
aait说的CMPXCHG8B我觉得最有用吧,不过我代码还没写完,
用这个指令的话,如果CPU刚好执行到3字节处,此时,其他线程刚好又来lock CMPXCHG8B此处,又会发生什么情况呢?
2014-2-1 23:06
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
r3hook的话,把所有线程挂起不就好了……
2014-2-1 23:18
0
雪    币: 116
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
微软库的做法是挂起所有当前线程
2014-2-2 02:51
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
WriteProcessMemory写hook被干扰的可能性微乎其微
CPU在执行的时候有缓存,叫TLB,普通的写内存并不会刷新TLB
反汇编WriteProcessMemory可以看到此函数调用了ZwFlushInstructionCache
而ZwFlushInstructionCache才会刷新TLB,此时指令已经写好了
个人见解
2014-2-2 05:27
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
x86上不需要用FlushInstructionCache,处理器会自动丢弃被污染的缓存,不用WriteProcessMemory用修改页面保护后直接写入试试就知道了
2014-2-2 09:33
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
还有一个问题啊。
假设你还没开始hook的时候,一个线程正好运行到你想要hook的第3个字节,这个时候被切换,那么系统中保存的是下次在调度运行这个线程的时候,从第3个字节开始运行。
然后你进行了hook,很显然第3个字节是不可运行的,是错误的指令。
然后系统又调度原来那个线程从第3字节开始恢复运行,然后就蓝屏了。
所以如何避免呢?
还要检查所有的被挂起的现成,检查这些线程将要被恢复的eip不是指向第3字节。如果真有某个线程eip恰好指向第3字节,那么先不要hook,先让这个线程再运行一段时间,eip已经经过了第3字节到了别的地方了,再挂起这个线程。再查看所有的线程,确保任何一个线程的将要恢复的eip不是指向第3字节。然后才开始hook。
2014-2-2 09:45
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
听说线程挂起是很危险的事情..
2014-2-2 15:09
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
.....................
2014-2-2 15:12
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
23
你可以把下面的汇编指令机器码提取出来,这个指令的机器码只有2个字节,然后你就让下钩线程的IRQ不在线程被切换状态,并屏蔽掉中断,你先往要下钩子处写入这2个字节的机器码,然后等修改完后面3字节数据后再修改前面2字节数据为钩子 jmp 指令的开头2字节数据 ........  我的这个办法是来自网络上,自己都没有亲自测试,但是我相信是可行的

LOOP000:
jmp LOOP000
2014-2-3 13:52
0
游客
登录 | 注册 方可回帖
返回
//