Skip to content

Commit 21d6a86

Browse files
committed
没啥好说的
1 parent 45dc3b9 commit 21d6a86

File tree

1 file changed

+47
-16
lines changed

1 file changed

+47
-16
lines changed

SRDI Asm/RDI_post.asm

Lines changed: 47 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,35 @@
66

77
.code
88

9-
main proc
9+
main proc
10+
11+
;-------------------------------------------------------------------
12+
; 保存非易失性寄存器
13+
;-------------------------------------------------------------------
14+
cld
15+
16+
push rbx
17+
push rbp
18+
push rsi
19+
push rdi
20+
push r12
21+
push r13
22+
push r14
23+
push r15
24+
25+
; [rbp+8] = 旧DOS头地址(基址)
26+
; [rbp+16] = 新DOS头地址(基址)
27+
; [rbp+24] = 新PE头地址
28+
mov rbp,rsp
29+
sub rsp,32
30+
mov [rbp+8],rcx
31+
1032
;-------------------------------------------------------------------
1133
; [rbp+8] = 旧DOS头地址(基址)
1234
; [rbp+16] = 新DOS头地址(基址)
1335
; [rbp+24] = 新NT头地址
1436
; LoadPEIntoMemory64
1537
;-------------------------------------------------------------------
16-
17-
push rax ; 对齐
18-
1938
; 获取 SizeOfImage
2039
mov rax, [rbp+8] ; 旧DOS头地址
2140
mov r12d, dword ptr [rax+3Ch] ; PE头RVA(原文件)
@@ -283,29 +302,41 @@ get_next_tlscallback:
283302
; GoToEntry
284303
;-------------------------------------------------------------------
285304
entry:
286-
mov rsi, [rbp+24] ; 获取PE头地址
287-
mov ax, word ptr [rsi+16h] ; 读取Characteristics字段
288-
test ax, 2000h ; 检查是否为DLL (0x2000)
289-
jz is_exe ; 非DLL则跳转EXE处理
305+
mov rsi, [rbp+24] ; 获取PE头地址
306+
mov ax, word ptr [rsi+16h] ; 读取Characteristics字段
307+
test ax, 2000h ; 检查是否为DLL (0x2000)
308+
jz is_exe ; 非DLL则跳转EXE处理
290309

291310
sub rsp,32
292-
mov ebx,dword ptr [rsi + 28h] ; 调用DLL入口点 RVA
293-
add rbx,[rbp+16] ; 调用DLL入口点 VA
311+
mov ebx,dword ptr [rsi + 28h] ; 调用DLL入口点 RVA
312+
add rbx,[rbp+16] ; 调用DLL入口点 VA
294313
mov rcx,[rbp+16]
295314
mov rdx,1
296315
xor r8d,r8d
297316
call rbx
298317

299-
add rsp,40
300-
ret
318+
add rsp,32
319+
jmp restore
301320

302321
is_exe:
303-
mov ebx,dword ptr [rsi + 28h] ; 调用EXE入口点 RVA
304-
add rbx,[rbp+16] ; 调用EXE入口点 VA
322+
mov ebx,dword ptr [rsi + 28h] ; 调用EXE入口点 RVA
323+
add rbx,[rbp+16] ; 调用EXE入口点 VA
305324
call rbx
306-
pop rax
307-
ret
308325

326+
;-------------------------------------------------------------------
327+
; 恢复到调用ReflectiveLoader之前的栈空间和寄存器状态
328+
;-------------------------------------------------------------------
329+
restore:
330+
add rsp,32
331+
pop r15
332+
pop r14
333+
pop r13
334+
pop r12
335+
pop rdi
336+
pop rsi
337+
pop rbp
338+
pop rbx
339+
ret
309340
main endp
310341

311342
GetProcAddressByHash proc

0 commit comments

Comments
 (0)