首页
社区
课程
招聘
[讨论]R3函数重写4-CreateThread
发表于: 2023-3-24 18:32 5422

[讨论]R3函数重写4-CreateThread

2023-3-24 18:32
5422

图片描述
原函数
handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start,(LPVOID)参数, 0, &ThreadId);

 

原函数参数
图片描述

 

调用了CreateRemoteThreadEx
图片描述
跟随
图片描述
调用了ntdll.NtCreateThreadEx
图片描述
进入
图片描述
下断
图片描述
NtCreateThreadEx第五个第六个参数为原函数的第三,第四个参数
图片描述
修改原函数参数
图片描述
图片描述
NtCreateThreadEx 第一个参数rcx未知类型,第二个参数固定1FFFFF(句柄权限),哪个进程创建了线程就有线程的句柄,这里描述句柄权限如何,R8跟原函数第一个参数有关,原函数这个参数设置为NULL的,意思子线程不继承创建后的线程的句柄权限,R9固定-1,意思是在本进程创建线程,[rsp+28],[rsp+30]是线程开始地址,以及给线程的参数,[rsp+48]为栈大小,一般为空,[rsp+38]为原函数倒数第二个参数,原本4是指创建线程后挂起线程,现在是1表示挂起,[rsp+40]固定是0未知参数。可得参数
图片描述
这个函数返回6的错误
图片描述
回到NtCreateThreadEx下断
图片描述
尝试增加一个参数[rsp+50],也就是未知参数3,传零
图片描述]
还是返回6.

 

再尝试增加一个参数[rsp+50],也就是未知参数4,传零
线程可以创建了,但是还有错误码.....

 

#include<Windows.h>

 

#include<stdio.h>
void funtion() {
printf("OK");
ExitThread(-1);

 

}
EXTERN_C HANDLE MyNtCreateThreadEx
(ULONG64 未知参数1, ULONG64 句柄权限,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
HANDLE 线程所属的进程的句柄, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
DWORD dwCreationFlags, ULONG64 未知参数2, SIZE_T dwStackSize,ULONG64 未知参数3, ULONG64 未知参数4);
int main() {

1
2
3
4
5
6
7
8
9
10
11
ULONG64 未知参数1 = 0;
ULONG64 未知参数4 = 0;
printf("MyNtCreateThreadEx %p\n", MyNtCreateThreadEx);
while (1) {
HANDLE a = MyNtCreateThreadEx((ULONG64)&未知参数1, 0x1FFFFF, NULL, (HANDLE)-1, (LPTHREAD_START_ROUTINE)funtion, 0, 0, 0, 0,0,未知参数4);
DWORD 错误码 = GetLastError();
printf("错误码%d\n", 错误码);
    CloseHandle((HANDLE)a);
    Sleep(1000);
}
getchar();

}
.CODE
MyNtCreateThreadEx proc
mov r10,rcx
mov eax,193
syscall
ret
MyNtCreateThreadEx endp
END
后面的参数是尝试出来的。对NtCreateThreadEx下断看到rsp+58(最后一个参数的值)不是零是一个地址,但是MyNtCreateThreadEx最后一个参数传地址时不能用,只能传零就奇怪。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//