-
-
[讨论]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最后一个参数传地址时不能用,只能传零就奇怪。
赞赏
- [讨论]这种call咋调用 3192
- [讨论]隐藏内存可执行属性问题 2454
- [讨论]注入的时候把分配地址拆分进行分配 1967
- VSbug,概率闪退 1940
- [讨论][讨论]Unity_Mono 子弹追踪分析1 2606