一、32位系統下函式重定向說明
原理:找到想要hook的函式在記憶體中的位址,將函式的頭幾個位元組儲存在自己的記憶體中,用jump cpu指令改寫函式的頭幾個位元組,該指令會轉移到替換函式的記憶體位址,(替換函式必修和被hook的函式標記完全相同),當被hook的函式被呼叫時,jump指令實際上將轉移到替換函式上執行,實現hook的目的。
具體實現方法:
//修改api入口為 mov eax, 00400000;jmp eax使程式能跳轉到自己的函式
byte g_bjumptemplate[8] = ;//第二到第五個位元組將被替換為將要執行的函式的位址
1、找到messagebox在記憶體中的位址(user32.dll中的messageboxw)(kernel32.dll"中的 "createprocess")
dword dwoldfuncaddr = (dword)getprocaddress(hdll, cfuncname) ;
2、將函式的頭8個位元組讀出並儲存, 如儲存到boldjumpbytes中
readprocessmemory(
hprocess,
(void *)phookapiinfo->dwoldfuncaddr, // phookapiinfo->dwoldfuncaddr = dwoldfuncaddr
(void *)phookapiinfo->boldjumpbytes,
sizeof(dword)*2, null )
3、用jump指令改寫函式的頭幾個位元組,指令會轉移到要替換的函式的記憶體位址(替換函式必須和原函式標記完全相同,引數,返回值,呼叫規則必須一樣)
memcpy(phookapiinfo->bnewjumpbytes, g_bjumptemplate, 8) ;
dword *pdwnewjumpaddr = (dword *)(phookapiinfo->bnewjumpbytes + 1) ;//將要修改第2到第5個位元組
memcpy(pdwnewjumpaddr, &dwnewfuncaddr, sizeof(dword)) ; 將替換函式位址寫到原來函式開始的第2到第5個位元組
// 將修改後的8個位元組寫回原來函式的位址中
if ( !writeprocessmemory(
hprocess,
(void *)phookapiinfo->dwoldfuncaddr,
(void *)phookapiinfo->bnewjumpbytes,
sizeof(dword)*2, null ) )
break ;
以上即可實現函式的重定向,當系統呼叫messagebox時,則會執行到dwnewfuncaddr的函式中
取消掛載則是將儲存的原來函式的前8個位元組寫回去即可。
缺點:在x 8 6、a l p h a和其他的c p u上的j u m p指令是不同的,必須使用手工編碼的機器指令才能使這種方法生效,這種方法在搶占式多執行緒環境中也不適用
**參考:hookapi_32
原文參考:windows核心程式設計第22章第9節
32位程序在64位系統中的檔案重定向
最近遇見了乙個問題,如下 乙個32位程序a,通過呼叫如下 瀏覽檔案,openfilename ofn common dialog box structure tchar szfile max path 100 buffer for file name initialize openfilename ...
stm32 printf函式重定向
include stm32f10x.h include stdio.h void rcc configuration void 首先設定系統時鐘為8mhz void gpio configuration void void usart configuration void function name...
STM32的printf函式重定向
在前面學習了stm32的串列埠程式設計,通過usart1向計算機的串列埠除錯助手列印資料,或者接收計算機串列埠除錯助手的資料,接下來我們可以實現stm32工程上的printf 函式了,方便用於程式開發中除錯資訊的列印。1.法1 使用microlib庫 1.1 keil mdk中的use microl...