系统调用

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进入方式