想在你的程式中截住API函式嗎?那就快看吧! (轉)
在你的中做一個func(...)
func1 = Spy(NULL,"GDI32.DLL","TextOutA",(PROC)func)
那麼你的程式沒次呼叫TextOut時,就會呼叫func 為了不破壞原有功能
請在func中呼叫func1。如果想截獲整個的api,你需要做一個全域性HOOK
在HOOK的DLL裡的初始化時呼叫本函式。主要程式碼如下:
PROC WINAPI
ApiSpy(PSTR pDllUse,PSTR pDllName,PSTR pApiName,PROC pNewPorc)
{
PIMAGE_DOS_HEADER pDosHeader;
PIMAGE_NT_HEADERS pNTHeader;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
PIMAGE_THUNK_DATA pThunk;
PROC pOldProc;
D oldpr;
static int Layer = 0;
if ( pDllUse == NULL )
Layer = 0;
pOldProc = GetProcAddress( GetModuleHandle(pDllName),pApiName );
if ( pOldProc == NULL )
return NULL;
pDosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(pDllUse);
if ( IsBadReadPtr(pDosHeader, sizeof(IMAGE_DOS_HEADER)) )
return NULL;
if ( pDosHeader->e_magic != IMAGE_DOS_SIGNATURE )
return NULL;
pNTHeader = MakePtr(PIMAGE_NT_HEADERS, pDosHeader, pDosHeader->e_lfanew);
if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) )
return NULL;
if ( pNTHeader->Signature != IMAGE_NT_SIGNATURE )
return NULL;
pImportDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, pDosHeader,
pNTHeader->OptionalHeader.
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].
VirtualAddress);
if ( pImportDesc == (PIMAGE_IMPORT_DESCRIPTOR)pNTHeader )
return NULL;
__try{
while ( pImportDesc->Name ){
PSTR pszModName = MakePtr(PSTR, pDosHeader, pImportDesc->Name);
REM("[%s]",pszModName);
if ( stricmp(pszModName, pDllName) == 0 ){
pThunk = MakePtr(PIMAGE_THUNK_DATA, pDosHeader, pImportDesc->FirstThunk);
while ( pThunk->u1.Function ){
REM("[%s:%s] ? %s %8x ==> %8x",pDllName,pApiName,pszModName,
// (DWORD)pOldProc,(DWORD)pThunk->u1.Function);
if ( pThunk->u1.Function == (PDWORD)pOldProc ){
if (!VirtualProtect(pThunk, 16, PAGE_READWRITE,&oldpr)){
REM("VirtualProtect False");
}
REM("ApiSpy [%s:%s] OK !",pDllName,pApiName);
pThunk->u1.Function=(PDWORD)pNewPorc;
return pOldProc;
}
pThunk++;
}
return NULL;
}
else{
if ( Layer < __Layer ){
Layer ++;
ApiSpy(pszModName,pDllName,pApiName,pNewPorc);
}
}
pImportDesc++;
}
}
__except(TRUE){
return NULL;
}
return NULL;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988138/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Java8新特性】還沒搞懂函式式介面?趕快過來看看吧!Java函式
- JS 中的函式表示式和函式宣告你混淆了嗎?JS函式
- 程式中的函式引數函式
- JAVA中的函式介面,你都用過嗎Java函式
- 別再說SUM函式很簡單,進來看看吧!函式
- Kotlin 集合函式式ApiKotlin函式API
- 函式式API簡介函式API
- SqlServer中將字串轉utf-8的函式、支援中文的UrlEncode函式SQLServer字串函式
- 【Linux網路程式設計】Socket Api函式Linux程式設計API函式
- 在你的專案管理中,運用報表分析了嗎?專案管理
- stl中的sort函式,你真的瞭解嗎函式
- Spring AI中函式呼叫Mistral AI最新APISpringAI函式API
- C — 快排函式 qsort 的用法函式
- 快取函式的簡單使用快取函式
- python有主函式嗎Python函式
- 精讀《函式快取》函式快取
- Sql 中的 left 函式、right 函式SQL函式
- Rust中的into函式和from函式Rust函式
- 由函式的解析式給出函式的性質 | 你想到了嗎函式
- Markdown的基本語法你知道多少,快來看看吧
- Java中的函數語言程式設計(二)函式式介面Functional InterfaceJava函數程式設計函式Function
- 簡單的檔案快取函式快取函式
- Golang中函式傳參存在引用傳遞嗎?Golang函式
- Oracle中REGEXP_SUBSTR函式(字串轉多行)Oracle函式字串
- JavaScript中的compose函式和pipe函式JavaScript函式
- python是函式式語言嗎Python函式
- 組合API-ref函式API函式
- Shell程式設計-09-Shell中的函式程式設計函式
- 小程式開發中雲函式的應用!函式
- 你真的懂函式嗎?函式
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- 函數語言程式設計 - 玩轉高階回撥函式函數程式設計函式
- 在你身邊你左右 --函數語言程式設計別煩惱函數程式設計
- 在你身邊你左右 –函數語言程式設計別煩惱函數程式設計
- scala簡明教程:偏函式、高階函式、Future非同步程式設計、隱式轉換函式非同步程式設計
- 【多程式】Linux中fork()函式詳解|多程式Linux函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- TypeScript 中函式的理解?與 JavaScript 函式的區別?TypeScript函式JavaScript