易語言微信逆向hook內存原理分析+代碼


論壇很多教程都是直接找偏移調用模塊直接HOOK的,今天從hook原理層分析下hook實現的方式,用wx為例
文章內容只做技術分析,技術交流,為保護分析軟件隱私部分代碼已經被更改,不能直接使用。

Hook (wechatwin_基址 + 偏移, 6, { 96, 86, 232, 0, 0, 0, 0, 97 }, 到整數 (&接收消息), 真)  5個參數

hook地址:wechatwin_基址 + 偏移,

備份長度:6
調用數據: { 96, 86, 232, 0, 0, 0, 0, 97 }
回調地址:到整數 (&接收消息)
是否前置我們的代碼: 真
===============================================
    回調偏移 = 尋找字節集 (調用數據, { 232 }, )
    原字節集 = 取空白字節集 (備份長度)
    寫入長度 = 取字節集長度 (調用數據)
    ReadProcessMemory (-1, Hook地址, 原字節集, 備份長度, 備份長度)  ' 備份Hook前數據
    JPM_地址 = VirtualAlloc (0, 1024, 位或 (#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE)  ' <!!!> 申請地址

    回調偏移 = 回調偏移 + 備份長度
    WriteProcessMemory (-1, JPM_地址, 原字節集, 取字節集長度 (原字節集), 0)  ' 恢復之前Hook覆蓋掉的代碼
    WriteProcessMemory (-1, JPM_地址 + 備份長度, 調用數據, 寫入長度, 0)  ' 往申請的內存寫入我們首次傳過來的數據
    WriteProcessMemory (-1, JPM_地址 + 回調偏移, 偏移計算 (JPM_地址 + 回調偏移 - 1, 回調地址), 4, 0)  ' 目標地址 - 原地址 - 5
    WriteProcessMemory (-1, JPM_地址 + 備份長度 + 寫入長度, { 233 } + 偏移計算 (JPM_地址 + 寫入長度 + 備份長度, Hook地址 + 備份長度), 5, 0)  ' 跳回Hook后下條執行的地址

    WriteProcessMemory (-1, Hook地址, { 233 } + 偏移計算 (Hook地址, JPM_地址), 5, 0)  ' 寫入Hook的Jmp地址
    .計次循環首 (備份長度 - 5, )  ' 這里默認為Jmp  5個字節 多余的填充PON
    填充Dm = 填充Dm + { 144 }
     .計次循環尾 ()
    .如果真 (取字節集長度 (填充Dm) ≠ 0)
        WriteProcessMemory (-1, Hook地址 + 5, 填充Dm, 取字節集長度 (填充Dm), 0)  ' 超過5個字節用PON填充
===============================================

     hook前OD代碼樣子 (要hook選中項位置)
     (圖1) <ignore_js_op>
      hook后OD代碼樣子 (hook點已被我們自己的代碼所替換)
     (圖2) <ignore_js_op>
     上方代碼具體步驟:
     一、備份原先hook點數據:
          回調偏移 = 尋找字節集 (調用數據, { 232 }, )   ‘調用數據:{ 96, 86, 232, 0, 0, 0, 0, 97 }  回調偏移計算結果為3,即取96,86,232的位置
          原字節集 = 取空白字節集 (備份長度)      ‘====6長度的字節集
          寫入長度 = 取字節集長度 (調用數據)      ‘====8
          ReadProcessMemory (-1, Hook地址, 原字節集, 備份長度, 備份長度)  ' 備份Hook前數據  (第一張圖片選中行數據)
         (圖3) <ignore_js_op>
          JPM_地址 = VirtualAlloc (0, 1024, 位或 (#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE)  ' <!!!> 申請地址
          JPM_地址 =00AF0000  (如上圖)
          回調偏移 = 回調偏移 + 備份長度   ‘3+6=9
          WriteProcessMemory (-1, JPM_地址, 原字節集, 取字節集長度 (原字節集), 0)  ' 在我們新申請的地址,恢復之前Hook覆蓋掉的代碼
          WriteProcessMemory (-1, JPM_地址 + 備份長度, 調用數據, 寫入長度, 0)  ' 往申請的內存寫入我們首次傳過來的數據{ 96, 86, 232, 0, 0, 0, 0, 97 }
          WriteProcessMemory (-1, JPM_地址 + 回調偏移, 偏移計算 (JPM_地址 + 回調偏移 - 1, 回調地址), 4, 0)  '偏移計算= 目標地址 - 原地址 - 5
          ***偏移計算=回調地址-(JPM_地址 + 回調偏移 - 1)-5   ‘計算出我們自己回調函數的jmp地址,寫入{ 96, 86, 232, 0, 0, 0, 0, 97 } 中,0,0,0,0的位置
         (圖4) <ignore_js_op>
          WriteProcessMemory (-1, JPM_地址 + 備份長度 + 寫入長度, { 233 } + 偏移計算 (JPM_地址 + 寫入長度 + 備份長度, Hook地址 + 備份長度), 5, 0)  ' 跳回Hook后下條執行的地址
          (圖5) <ignore_js_op>
            寫入這條語句
          WriteProcessMemory (-1, Hook地址, { 233 } + 偏移計算 (Hook地址, JPM_地址), 5, 0)  ' 寫入Hook的Jmp地址
           (圖6) <ignore_js_op>
          在原程序hook點寫入我們的jmp地址
          由於jmp 地址只需要五位,如果備份的數據多,這里要把多余的數據用nop填充
           (圖7) <ignore_js_op>
           WriteProcessMemory (-1, Hook地址 + 5, 填充Dm, 取字節集長度 (填充Dm), 0)  ' 超過5個字節用PON填充
           到此先備份數據,再執行我們函數的hook代碼結束。

           碼字不易,請多點贊,贊賞,歡迎技術交流分析 群:674056030


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM