系统调用
R3函数执行底层操作时,需要调用可以syscall的位于Ntdll或User32的dll里的系统函数。
调试时跟踪系统函数,以creatreThread为例:
1 2 3 4 5
| 00007FFA5FEB1990 mov r10,rcx 00007FFA5FEB1993 mov eax,0C7h 00007FFA5FEB1998 test byte ptr [7FFE0308h],1 00007FFA5FEB19A0 jne 00007FFA5FEB19A5 00007FFA5FEB19A2 syscall
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ntdll.dll:00007FFA5FEB1990 loc_7FFA5FEB1990: ; CODE XREF: kernelbase_CreateRemoteThreadEx+298↑p ntdll.dll:00007FFA5FEB1990 ; DATA XREF: KERNELBASE.dll:off_7FFA5D9EF8A0↑o ntdll.dll:00007FFA5FEB1990 mov r10, rcx ntdll.dll:00007FFA5FEB1993 mov eax, 0C7h ntdll.dll:00007FFA5FEB1998 test byte_7FFE0308, 1 ntdll.dll:00007FFA5FEB19A0 jnz short loc_7FFA5FEB19A5 ntdll.dll:00007FFA5FEB19A2 syscall ; Low latency system call ntdll.dll:00007FFA5FEB19A4 retn ntdll.dll:00007FFA5FEB19A5 ; --------------------------------------------------------------------------- ntdll.dll:00007FFA5FEB19A5 ntdll.dll:00007FFA5FEB19A5 loc_7FFA5FEB19A5: ; CODE XREF: ntdll.dll:00007FFA5FEB19A0↑j ntdll.dll:00007FFA5FEB19A5 int 2Eh ; DOS 2+ internal - EXECUTE COMMAND ntdll.dll:00007FFA5FEB19A5 ; DS:SI -> counted CR-terminated command string ntdll.dll:00007FFA5FEB19A7 retn
|
我的系统版本是23H2,说明在23H2中NtCreateThreadEx系统调用号为C7
代码执行完之后,新线程就被创建了。但是控制权还没在新线程里,先把当前线程sleep或者getchar阻塞强制转换一下就可以看到输出
基本调用格式:(x64(x86还没看QAQ))
1 2 3 4 5 6
| mov r10,x mov r9,x mov r8,x mov rdx,x ;上面都是参数 mov rax, callNum ;系统调用号 syscall ;进入系统调用,汇编为 0F 05
|
上面也能看到int 2E是x32和dos的syscall进入方式