Bypass AV Hooking with Direct Syscall
Table of Content
- [Giới thiệu]
- [WinAPI Hooking]
- [Lấy mã máy syscall API]
- [Setup VS2022 để code ASM]
- [Code]
Giới thiệu
Khi viết mã độc trên Windows, điều chúng ta sử dụng các WinAPI là không thể tránh khỏi. Tuy nhiên việc sử dụng các API cần phải thực hiện 1 cách lén lút nếu không sẽ rất dễ dàng bị các trình AV phát hiện. Một trong những kĩ thuật để phát hiện hành vi của các API mà AV sử dụng đó là Hook API. Bài viết sẽ giải thích cách Hook API hoạt động và làm sao để bypass việc Hook của AV bằng Direct Syscall.
WinAPI Hooking
Khi 1 chương trình gọi đến API, nó thực hiện các bước theo sơ đồ dưới đây.
Tuy nhiên, 1 số API sử dụng cơ chế Hook để theo dõi xem API . Cơ chế hook API ở userland mình để link blog của iredteam tại đây: https://www.ired.team/offensive-security/code-injection-process-injection/how-to-hook-windows-api-using-c++.
Để bypass quá trình này, chúng ta có thể sử dụng kĩ thuật unhook dựa vào kĩ thuật hook của iredteam ở trên, hoặc gọi thẳng syscall tại kernelland.
Lấy mã máy syscall API
Để xem mã máy của API, mình mở 1 tiến trình bất kì rồi thực hiện debug tiến trình đấy, mình sẽ thử tìm mã máy của WriteProcessMemory, hay NtWriteVirtualMemory trong ntdll.dll
0:031> u NtWriteVirtualMemory
ntdll!NtWriteVirtualMemory:
00007fff`efd8d710 4c8bd1 mov r10,rcx
00007fff`efd8d713 b83a000000 mov eax,3Ah
00007fff`efd8d718 f604250803fe7f01 test byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007fff`efd8d720 7503 jne ntdll!NtWriteVirtualMemory+0x15 (00007fff`efd8d725)
00007fff`efd8d722 0f05 syscall
00007fff`efd8d724 c3 ret
00007fff`efd8d725 cd2e int 2Eh
00007fff`efd8d727 c3 ret
Thực tế chúng ta chỉ cần quan tâm đến phần mã sau, đây là phần mã gọi syscall để thực hiện API
mov r10,rcx
mov eax,3Ah
syscall
ret
Lưu ý: Tham số đầu vào của hàm sẽ lấy theo tham số của NtWriteVirtualMemory
Setup VS2022 để code ASM
Để có thể biên dịch và chạy mã máy trên VS2022 chúng ta cần setup 1 số thứ như sau:
Chuột phải vào Project -> Build Dependencies -> Build Customizations => Tích vào masm
Sau đó tạo 1 file .asm để lưu mã syscall, chuột phải vào file, chọn Properties, sửa Item type thành Microsoft Macro Assembler
Code
Đây là phần code của file syscall.asm
syscall.asm
.code SysNtWriteVirtualMemory proc mov r10,rcx mov eax,3Ah syscall ret SysNtWriteVirtualMemory endp
end
main.c
#include <Windows.h>
//Signature of NtWriteVirtualMemory
EXTERN_C NTSTATUS SysNtWriteVirtualMemory( HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG BufferLength, PULONG ReturnLength
); int main() { SysNtReadVirtualMemory(ProcessHandle, (PVOID)address2read, &buffer, 8, &byteRead); return 0;
}
Tham số của hàm trên là giả, nhưng cách sử dụng về cơ bản là như vậy. Sử dụng phương pháp sẽ giúp chúng ta bỏ qua được hook của 1 số AV. Tuy nhiên phương pháp này vẫn có thể bị phát hiện bởi kĩ thuật Nirvana Debugging mà mình sẽ nói đến tại phần sau.