[Asm] 纯文本查看 复制代码
format PE64 GUI DLL
entry DllMain;
use64;
include 'win64a.inc';
section '.text' code readable executable;'
macro apifix hMod,sz,fn;'
{
mov rdx, sz ; proc name
mov rcx, hMod ; hLib
call [GetProcAddress]
mov qword[fn], rax
};
; 修复导出的 API 地址
proc FixImport
local hModule:QWORD
local lpBuffer:QWORD
frame
invoke LocalAlloc, LPTR, MAX_PATH + 1
mov [lpBuffer], rax
invoke GetSystemDirectory, rax, MAX_PATH
invoke strncat, [lpBuffer], szTargetLibrary, MAX_PATH
invoke LoadLibrary, [lpBuffer]
mov [hModule], rax
invoke LocalFree,[lpBuffer]
apifix [hModule], szvSetDdrawflag, _vSetDdrawflag
apifix [hModule], szAlphaBlend, _AlphaBlend
apifix [hModule], szDllInitialize, _DllInitialize
apifix [hModule], szGradientFill, _GradientFill
apifix [hModule], szTransparentBlt, _TransparentBlt
endf;
ret
endp;
; 以下是关于HOOK的代码
; 安装钩子
install_hook:
; 获取CreateWindowExW地址
invoke GetModuleHandle, szUser32
test rax, rax
jz .fail
invoke GetProcAddress, rax, szCreateWindowExW
test rax, rax
jz .fail
mov [originalCreateWindowExW], rax
; Save original bytes
mov rsi, [originalCreateWindowExW]
lea rdi, [origBytes]
mov rcx, 17
rep movsb
; 创建跳板函数
invoke VirtualAlloc, 0, 32, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE
test rax, rax
jz .fail
mov [trampoline], rax
; Copy original bytes to trampoline
mov rdi, rax
lea rsi, [origBytes]
mov rcx, 17
rep movsb
mov byte [rax], 0x4c
; ; 添加跳回指令 (修正部分)
; 绝对跳转指令格式: FF 25 [00 00 00 00] [目标地址]
mov byte [rdi], 0xFF ; JMP指令的第一部分
mov byte [rdi+1], 0x25 ; JMP指令的第二部分
mov dword [rdi+2], 0 ; 相对偏移(0表示RIP+0)
mov rax, [originalCreateWindowExW]
add rax, 17 ; 目标地址 = 原始地址 + 14
mov [rdi+6], rax ; 存储目标地址
sub rax, 1
; 修改内存保护
invoke VirtualProtect, [originalCreateWindowExW], 99, PAGE_EXECUTE_READWRITE, oldProtect
test eax, eax
jz .fail
; 写入跳转指令
mov rdi, [originalCreateWindowExW]
mov byte [rdi], 0xFF ; JMP [rip+0]
mov byte [rdi+1], 0x25
mov dword [rdi+2], 0
mov rax, hooked_CreateWindowExW
mov [rdi+6], rax
; 恢复内存保护
invoke VirtualProtect, [originalCreateWindowExW], 14, [oldProtect], oldProtect
mov [hookActive], 1
mov al, 1
ret
.fail:
xor al, al
ret
; 钩子处理函数 (完全堆栈平衡)
hooked_CreateWindowExW:
; 修改窗口标题
lea r8, [szHookedTitle]
; 准备调用跳板函数
mov r10, [trampoline]
jmp r10
ret
; 以上是关于HOOK的代码
proc DllMain hinstDLL,fdwReason,lpvReserved
cmp rdx, DLL_PROCESS_ATTACH ; 进程加载DLL时
je .attach
cmp rdx, DLL_PROCESS_DETACH ; 进程卸载DLL时
je .detach
jmp .exit
.attach:
call FixImport ; 修复导出的 API 地址
call install_hook
jmp .exit
.detach:
.exit:
mov rax, 1 ; 表示成功
ret
endp
; 导出函数, 全是跳转
_exp_vSetDdrawflag: jmp [ _vSetDdrawflag ]
_exp_AlphaBlend: jmp [ _AlphaBlend ]
_exp_DllInitialize: jmp [ _DllInitialize ]
_exp_GradientFill: jmp [ _GradientFill ]
_exp_TransparentBlt: jmp [ _TransparentBlt ]
; 常数
section '.szdb' data readable;
szTargetLibrary db "\msimg32.dll", 0
szvSetDdrawflag db "vSetDdrawflag", 0
szAlphaBlend db "AlphaBlend", 0
szDllInitialize db "DllInitialize", 0
szGradientFill db "GradientFill", 0
szTransparentBlt db "TransparentBlt", 0
; 跳转地址储存
section '.expw' data readable writeable;
_vSetDdrawflag dq ?
_AlphaBlend dq ?
_DllInitialize dq ?
_GradientFill dq ?
_TransparentBlt dq ?
section '.idata' import data readable writeable;
library kernel,'KERNEL32.DLL', \
msvc,'msvcrt.dll';
;
import kernel, \
VirtualProtect,'VirtualProtect', \
LocalAlloc,'LocalAlloc', \
OutputDebugStringW,'OutputDebugStringW' , \
VirtualAlloc, 'VirtualAlloc', \
LocalFree,'LocalFree', \
GetModuleHandle,'GetModuleHandleA', \
LoadLibrary,'LoadLibraryA', \
GetProcAddress,'GetProcAddress', \
GetModuleFileName,'GetModuleFileNameA', \
GetSystemDirectory,'GetSystemDirectoryA'; \
import msvc, \
strstr,'strstr', \
strncpy,'strncpy', \
strncat,'strncat' \
section '.edata' export data readable; \
export 'msimg32.dll',\
_exp_vSetDdrawflag,'vSetDdrawflag',\
_exp_AlphaBlend,'AlphaBlend',\
_exp_DllInitialize,'DllInitialize',\
_exp_GradientFill,'GradientFill',\
_exp_TransparentBlt,'TransparentBlt'
; 全局变量定义
section '.data' data readable writeable
; 其他变量
hookActive db 0
; 字符串常量
szUser32 db 'user32.dll',0
szCreateWindowExW db 'CreateWindowExW',0
szKernel32 db 'kernel32.dll',0
szVirtualProtect db 'VirtualProtect',0
szHookedTitle db 'hook sucess',0
; 钩子相关变量
originalCreateWindowExW dq ?
trampoline dq ?
oldProtect dq ?
; Original bytes storage
origBytes db 17 dup(?)
backupBytes db 17 dup(?)