首页
社区
课程
招聘
[讨论]inline hook修改指令时多线程问题
发表于: 2013-7-16 15:53 10809

[讨论]inline hook修改指令时多线程问题

2013-7-16 15:53
10809
我发现在做inline hook时,很多人使用WriteProcessMemory来修改指令代码,这样会存在一个多线程安全问题,如果你在修改这段代码的同时,另一个线程刚好调用了同样的代码,这样应该会失败,
大家有没有什么好的办法能解决这样一个问题
这样好象没有什么好的解决办法 ,我想到的是找到一个e9开始的机器码,然后用原子操作将E9后面的4字节偏移改成目标地址.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 729
活跃值: (1195)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
EB FE
2013-7-16 16:02
0
雪    币: 535
活跃值: (245)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
3
可以在应用层自己写一个ExInterlockedCompareExchange64实现8字节原子操作
2013-7-16 16:37
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
0环就提升irql
3环的话.将其他线程暂停
2013-7-16 18:35
0
雪    币: 342
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
恩这个我等下来试试,如果能实现,算是最好的了
2013-7-17 08:48
0
雪    币: 342
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
暂停其它线程.........这种方法在有些特点的环境下是不行的,我说的是3环,不考虑0环
2013-7-17 08:49
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
HOOK是瞬时操作.如果通过汇编修改的话

如果那瞬间都会出问题.只能考虑暂停其他操作

除非是非常频繁的连续hook.

不过任何商业软件都不会这么干吧
2013-7-17 09:52
0
雪    币: 342
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
#include "stdafx.h"
#include <windows.h>
void SafeChange8Bit(PUCHAR puDst,PUCHAR puSrc)
{
        DWORD  dwDst1 = *(DWORD*)puDst;
        DWORD  dwDst2 = *(DWORD*)((DWORD*)puDst+1);
        DWORD  dwSrc1 = *(DWORD*)puSrc;
        DWORD  dwSrc2 = *(DWORD*)((DWORD*)puSrc+1);

        _asm
        {
                        mov edx,dwDst1
                        mov eax,dwDst2
                        mov ecx,dwSrc1
                        mov ebx,dwSrc2
                        cmpxchg8b puDst                          ;这里不会成功,不知道原因了,都是同一块同存
        }
}

int main(int argc, char* argv[])
{
    unsigned char szBuffer[8] = {0};
    szBuffer[0] = 1;
    szBuffer[4] = 1;
   
        unsigned char szSrcBuffer[8] = {1,2,3,4,5,6,7,8};
        DWORD  dwDst1 = *(DWORD*)szBuffer;  
        DWORD  dwDst2 = *(DWORD*)((DWORD*)szBuffer+1);
        DWORD  dwSrc1 = *(DWORD*)szSrcBuffer;
        DWORD  dwSrc2 = *(DWORD*)((DWORD*)szSrcBuffer+1);

        _asm
        {
                         mov edx,dwDst1
                        mov eax,dwDst2
                        mov ecx,dwSrc1
                        mov ebx,dwSrc2
                        lock cmpxchg8b szBuffer
        }
    //SafeChange8Bit(szBuffer,szSrcBuffer);
}
这样实现了8字节的原子操作
2013-7-17 11:32
0
雪    币: 342
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
恩,也有一定的道理,
2013-7-17 11:36
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
10
你可以看一下MHOOK的代码,它hook的时候会暂时把其他线程挂起。
2013-7-17 11:55
0
雪    币: 365
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
参考detours
2013-7-17 13:39
0
雪    币: 81
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
暂停其他线程
2013-7-17 19:16
0
雪    币: 342
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
MHOOK的代码看了一下,考虑的是很详細的,连暂停时线程上下文中EIP的指针停留位置都给予了处理,还是不错的,
2013-7-18 10:18
0
雪    币: 2271
活跃值: (2160)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
14
是的,还支持x64,普通用户足矣。
2013-7-18 11:55
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
如果用来挂钩CsrCreateProcess之类的api立马蛋碎……
2013-7-18 12:06
0
游客
登录 | 注册 方可回帖
返回
//