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

R3下HOOK CreateThread怎么会崩溃?

2021-4-14 01:21
3709
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);
 
 
}

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

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

正常输出

也没有崩


不过你为什么不用detours呢

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

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

你的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 


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