飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 213|回复: 4

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-5-22 16:18
  • 签到天数: 1129 天

    [LV.10]以坛为家III

    发表于 昨天 12:32 | 显示全部楼层 |阅读模式
    本帖最后由 slzslz 于 2025-7-16 12:35 编辑

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

    msimg32 x64hookcreatewindowex.rar

    3.06 KB, 下载次数: 2, 下载积分: 飘云币 -2 枚

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2025-1-14 13:49
  • 签到天数: 393 天

    [LV.9]以坛为家II

    发表于 昨天 14:20 | 显示全部楼层
    PYG有你更精彩!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-1-13 09:04
  • 签到天数: 339 天

    [LV.8]以坛为家I

    发表于 昨天 16:10 | 显示全部楼层
    PYG有你更精彩!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-14 20:41
  • 签到天数: 876 天

    [LV.10]以坛为家III

    发表于 昨天 22:06 | 显示全部楼层
    谢谢大大的分享~!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2025-1-14 22:42
  • 签到天数: 1226 天

    [LV.10]以坛为家III

    发表于 昨天 22:37 | 显示全部楼层
    感谢楼主分享!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表