論壇很多教程都是直接找偏移調用模塊直接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 |