|
6 | 6 |
|
7 | 7 | .code |
8 | 8 |
|
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 | + |
10 | 32 | ;------------------------------------------------------------------- |
11 | 33 | ; [rbp+8] = 旧DOS头地址(基址) |
12 | 34 | ; [rbp+16] = 新DOS头地址(基址) |
13 | 35 | ; [rbp+24] = 新NT头地址 |
14 | 36 | ; LoadPEIntoMemory64 |
15 | 37 | ;------------------------------------------------------------------- |
16 | | - |
17 | | - push rax ; 对齐 |
18 | | - |
19 | 38 | ; 获取 SizeOfImage |
20 | 39 | mov rax, [rbp+8] ; 旧DOS头地址 |
21 | 40 | mov r12d, dword ptr [rax+3Ch] ; PE头RVA(原文件) |
@@ -283,29 +302,41 @@ get_next_tlscallback: |
283 | 302 | ; GoToEntry |
284 | 303 | ;------------------------------------------------------------------- |
285 | 304 | 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处理 |
290 | 309 |
|
291 | 310 | 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 |
294 | 313 | mov rcx,[rbp+16] |
295 | 314 | mov rdx,1 |
296 | 315 | xor r8d,r8d |
297 | 316 | call rbx |
298 | 317 |
|
299 | | - add rsp,40 |
300 | | - ret |
| 318 | + add rsp,32 |
| 319 | + jmp restore |
301 | 320 |
|
302 | 321 | 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 |
305 | 324 | call rbx |
306 | | - pop rax |
307 | | - ret |
308 | 325 |
|
| 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 |
309 | 340 | main endp |
310 | 341 |
|
311 | 342 | GetProcAddressByHash proc |
|
0 commit comments