首页
社区
课程
招聘
R3下HOOK CreateThread怎么会崩溃?
发表于: 2021-4-14 01:21 4769

R3下HOOK CreateThread怎么会崩溃?

2021-4-14 01:21
4769
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef HANDLE(WINAPI* EndCreateThread)(LPSECURITY_ATTRIBUTES, SIZE_T, LPTHREAD_START_ROUTINE, LPVOID, DWORD, LPDWORD);
EndCreateThread Original_EndCreateThread = nullptr;
 
 
HANDLE WINAPI NewCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId)
{
    return Original_EndCreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
}
 
void HOOK_CreateThread()
{
    MessageBoxA(NULL, "HOOK.. ", "", MB_OK);
 
    DWORD CreateThreadAddr = (DWORD)CreateThread;
 
    Original_EndCreateThread = (EndCreateThread)(CreateThreadAddr+5);
    VirtualProtect((LPVOID)CreateThreadAddr, 5, PAGE_EXECUTE_READWRITE, &oldPro1);
    *reinterpret_cast<byte*>(CreateThreadAddr) = 0xE9;
    *reinterpret_cast<DWORD*>(CreateThreadAddr + 1) = (DWORD)&NewCreateThread - (CreateThreadAddr + 5);
    VirtualProtect((LPVOID)CreateThreadAddr, 5, oldPro1, &oldPro1);
 
 
}

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

最后于 2021-4-14 01:23 被風輕澐淡编辑 ,原因: 代码不清晰
收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 733
活跃值: (1395)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
你覆盖的那两句语句好像没有执行,少了两条语句的2原因吧.这种东西用调试器调一下很快就解决了.
2021-4-14 10:13
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
狐臭 你覆盖的那两句语句好像没有执行,少了两条语句的2原因吧.这种东西用调试器调一下很快就解决了.
执行了的
2021-4-14 10:48
0
雪    币: 10251
活跃值: (4426)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
抛开环境讲问题。DWORD/DWORD_PTR是不一样的。
2021-4-14 13:04
0
雪    币: 3322
活跃值: (3918)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
你这太简单粗暴了,要想hook后不蹦必须处理好堆栈
2021-4-14 13:38
0
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你的NewCreateThread里调用了Original_EndCreateThread,而Original_EndCreateThread=(EndCreateThread)(CreateThreadAddr+5),(EndCreateThread)(CreateThreadAddr+5)并不是函数开始的地方,你要在NewCreateThread里先恢复CreateThreadAddr的前5个字节然后再call CreateThreadAddr
2021-4-14 13:48
0
雪    币: 772
活跃值: (3831)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
1. 你没有锁掉当前线程之外的其他线程。
2.   *reinterpret_cast<DWORD*>(CreateThreadAddr + 1) = (DWORD)JmpAddress - HookAddress - 5;
2021-4-14 15:15
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Mr.hack 你这太简单粗暴了,要想hook后不蹦必须处理好堆栈
NewCreateThread 按理说 这个子程序 内部 push ebp mov ebp,esp pop ebp jmp CreateThreadAddr+5是没问题吧
2021-4-14 18:03
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
函数我抄的MSDN的应该也是没错猜对啊
2021-4-14 18:04
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
superlover 抛开环境讲问题。DWORD/DWORD_PTR是不一样的。
函数我抄的MSDN的应该也是没错才对啊
2021-4-14 18:05
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
NewCreateThread 按理说 这个子程序 内部 push ebp mov ebp,esp pop ebp jmp CreateThreadAddr+5是没问题吧
2021-4-14 18:06
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
htpidk 你的NewCreateThread里调用了Original_EndCreateThread,而Original_EndCreateThread=(EndCreateThread)(CreateThre ...
NewCreateThread 按理说 这个子程序 内部 push ebp mov ebp,esp pop ebp jmp CreateThreadAddr+5是没问题吧
2021-4-14 18:06
0
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你的NewCreateThread里可没有 push ebp mov ebp,esp pop ebp jmp啊,你的是CALL Original_EndCreateThread
2021-4-14 20:02
0
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14

正常输出

也没有崩


不过你为什么不用detours呢

最后于 2021-4-14 20:26 被htpidk编辑 ,原因:
2021-4-14 20:22
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15

2021-4-15 13:08
0
雪    币: 7379
活跃值: (4086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
風輕澐淡

你的NewCreateThread是这样写的,

 HANDLE WINAPI NewCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId) {   

 return Original_EndCreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);

 } 


 为什么生成的代码是 

push ebp 

 mov ebp,esp 

 pop ebp 

 jmp CreateThreadAddr+5 


 是哪个版本的编译器生成的这个代码,还是NewCreateThread里的代码是你自己__asm内联写的而不是return Original_EndCreateThread(lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId); 如果是你内联写的NewCreateThread,你试试

push ebp 

 mov ebp,esp 

 jmp CreateThreadAddr+5 

去掉 pop ebp 


2021-4-15 13:28
0
雪    币: 0
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
htpidk 你的NewCreateThread是这样写的,&nbsp;HANDLE WINAPI NewCreateThread(LPSECURITY_ATTRIBUTES lpThreadAttribu ...
没使用asm生成就是这样的
2021-4-16 00:58
0
游客
登录 | 注册 方可回帖
返回
//