ส่วนหัวเฉพาะไลบรารีที่ช่วยให้คุณสามารถสร้างคำแนะนำ SyScall โดยตรงในลักษณะที่เหมาะสมและใช้งานง่ายและใช้งานง่าย
สิ่งที่คุณต้องทำคือคัดลอกผ่านไฟล์ส่วนหัวและเรียกใช้ฟังก์ชั่นการเริ่มต้น init_syscalls_list ก่อนใช้ INLINE_SYSCALL(function_pointer) และ macros INLINE_SYSCALL_T(function_type)
// This header contains the initialization function.
// If you already initialized, inline_syscall.hpp contains all you need.
# include " inline_syscall/include/in_memory_init.hpp "
// Needs to be called once at startup before INLINE_SYSCALL is used.
jm::init_syscalls_list ();
// Usage of the main macro INLINE_SYSCALL
void * allocation = nullptr ;
SIZE_T size = 0x1000 ;
NTSTATUS status = INLINE_SYSCALL(NtAllocateVirtualMemory)((HANDLE)- 1 , &allocation, 0 , &size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);ในฐานะหนึ่งในเป้าหมายหลักของห้องสมุดนี้คือการปรับให้เหมาะสมที่สุดเท่าที่จะเป็นไปได้ที่นี่คือผลลัพธ์ของการสร้างที่ดีที่สุด
mov qword ptr [ rsp + 30h ], 0 ; void* allocation = nullptr
mov qword ptr [ rsp + 28h ], 1000h ; SIZE_T size = 0x1000;
mov eax , dword ptr [ entry ( 07FF683157004h ) ] ; syscall id is loaded
lea rdx , [ rsp + 30h ] ; BaseAddress = &allocation
lea r9 , [ rsp + 28h ] ; RegionSize = &size
mov r10 , 0FFFFFFFFFFFFFFFFh ; ProcessHandle = -1
xor r8d , r8d ; ZeroBits = 0
sub rsp , 40h ; preparing stack
mov qword ptr [ type ], 3000h ; AllocationType = MEM_RESERVE | MEM_COMMIT
mov qword ptr [ protect ], 4 ; Protect = PAGE_READWRITE
syscall ; syscall instruction itself
add rsp , 40h ; restoring stack ไลบรารีนี้ช่วยให้คุณสร้างรูทีนการเริ่มต้นที่กำหนดเองที่กำหนดเองซึ่งมีความยืดหยุ่นมากขึ้นต่อ SyScalls ที่ขาดหายไปหรือได้รับ SyScall IDs ด้วยวิธีอื่น
JM_INLINE_SYSCALL_ENTRY_TYPE สามารถกำหนดได้ด้วยประเภทรายการ SYSCALL ของคุณเองที่ต้องสร้างจากแฮช โดยค่าเริ่มต้น syscall_entry_small ถูกนำมาใช้ แต่ syscall_entry_full ก็ถูกจัดส่งด้วย
หากคุณต้องการใช้มาโคร INLINE_SYSCALL ที่ให้มาคุณจะต้องใช้ฟังก์ชัน jm::hash ที่ให้มา
ในการรับเริ่มต้นของรายการ syscall คุณต้องโทรหา jm::syscall_entries() และทำซ้ำจนกว่าคุณจะเข้าสู่รายการเป็นศูนย์