slzslz 发表于 前天 12:32

fasm x64汇编 hook createwindowexw改NoteCase Pro 的窗口辩题的汇编代码

本帖最后由 slzslz 于 2025-7-17 16:38 编辑

方法生成DLL放入安装好的NoteCase Pro 的目录( 官网下载地址https://www.notecasepro.com/),点添加书签 ,可以看到窗口的标题改变名称了
无意搞涉及版权的事情,只是做本代码的功能性演示,需要加入破解什么程序的代码,可以加在hooked_CreateWindowExW:里面
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
mov qword, rax
};

; 修复导出的 API 地址
proc FixImport
local hModule:QWORD
local lpBuffer:QWORD
frame
   invoke LocalAlloc, LPTR, MAX_PATH + 1
    mov , rax
    invoke GetSystemDirectory, rax, MAX_PATH
    invoke strncat, , szTargetLibrary, MAX_PATH
   invoke LoadLibrary,
    mov , rax
invoke LocalFree,
apifix , szvSetDdrawflag, _vSetDdrawflag
apifix , szAlphaBlend, _AlphaBlend
apifix , szDllInitialize, _DllInitialize
apifix , szGradientFill, _GradientFill
apifix , 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 , rax

    ; Save original bytes
    mov rsi,
    lea rdi,
    mov rcx, 17
    rep movsb



    ; 创建跳板函数
    invoke VirtualAlloc, 0, 32, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE
    test rax, rax
    jz .fail
    mov , rax

    ; Copy original bytes to trampoline
   mov rdi, rax
   lea rsi,
   mov rcx, 17
   rep movsb
   mov byte , 0x4c
;    ; 添加跳回指令 (修正部分)
    ; 绝对跳转指令格式: FF 25 [目标地址]
    mov byte , 0xFF      ; JMP指令的第一部分
    mov byte , 0x25    ; JMP指令的第二部分
    mov dword , 0      ; 相对偏移(0表示RIP+0)
    mov rax,
    add rax, 17               ; 目标地址 = 原始地址 + 14
    mov , rax          ; 存储目标地址
   
    subrax, 1
   
    ; 修改内存保护
    invoke VirtualProtect, , 99, PAGE_EXECUTE_READWRITE, oldProtect
    test eax, eax
    jz .fail
   
    ; 写入跳转指令
    mov rdi,
    mov byte , 0xFF    ; JMP
    mov byte , 0x25
    mov dword , 0
    mov rax, hooked_CreateWindowExW
    mov , rax
   
    ; 恢复内存保护
    invoke VirtualProtect, , 14, , oldProtect
   
    mov , 1
    mov al, 1
    ret
   
.fail:
    xor al, al
    ret

; 钩子处理函数 (完全堆栈平衡)
hooked_CreateWindowExW:

; 修改窗口标题
    lea r8,


    ; 准备调用跳板函数
    mov r10,
   




    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
szvSetDdrawflagdb "vSetDdrawflag",0
szAlphaBlenddb "AlphaBlend",0
szDllInitializedb "DllInitialize",0
szGradientFilldb "GradientFill",0
szTransparentBltdb "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(?)







xyzjxlf 发表于 前天 22:37

感谢楼主分享!

toneger 发表于 前天 22:06

谢谢大大的分享~!

chchhau 发表于 前天 16:10

PYG有你更精彩!

linxiansen 发表于 前天 14:20

PYG有你更精彩!
页: [1]
查看完整版本: fasm x64汇编 hook createwindowexw改NoteCase Pro 的窗口辩题的汇编代码