想在你的程式中截住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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在Delphi中巧用WINDOWS 的API函式 (轉)WindowsAPI函式
- 【Java8新特性】還沒搞懂函式式介面?趕快過來看看吧!Java函式
- 想漲工資嗎?那就學習Scala,Golang或Python吧GolangPython
- JS 中的函式表示式和函式宣告你混淆了嗎?JS函式
- js中的寫出想jquery中的函式一樣呼叫JSjQuery函式
- VCL 中的 Windows API 函式(4): AdjustWindowRectExWindowsAPI函式
- JAVA中的函式介面,你都用過嗎Java函式
- 用api函式讀取硬碟的序列號 (轉)API函式硬碟
- DELPHI中使用API函式詳解 (轉)API函式
- 在你的專案管理中,運用報表分析了嗎?專案管理
- stl中的sort函式,你真的瞭解嗎函式
- 別再說SUM函式很簡單,進來看看吧!函式
- Api函式列表——與檔案相關 (轉)API函式
- 呼叫API函式設計ABOUT視窗 (轉)API函式
- Win2K下的Api函式的攔截 (轉)API函式
- rewind (C程式中的庫函式)C程式函式
- FLASHMX中的MD5函式 (轉)函式
- 轉:類似SQL中的split函式SQL函式
- C#中的函式指標 (轉)C#函式指標
- ASP 中 Split 函式的例項 (轉)函式
- C++中的虛擬函式與虛擬函式表 (轉)C++函式
- 掃描易的api函式API函式
- Kotlin 集合函式式ApiKotlin函式API
- Spring AI中函式呼叫Mistral AI最新APISpringAI函式API
- C — 快排函式 qsort 的用法函式
- 快取函式的簡單使用快取函式
- 理解javascript中的回撥函式(callback)【轉】JavaScript函式
- SQL中 CONVERT轉化函式的用法SQL函式
- SQL中CONVERT轉化函式的用法SQL函式
- 呼叫API函式得到磁碟上剩餘空間的值 (轉)API函式
- Markdown的基本語法你知道多少,快來看看吧
- 消除複製建構函式和“模板式複製建構函式”中的冗餘程式碼 (轉)函式
- 淺談API函式呼叫的方法API函式
- 精讀《函式快取》函式快取
- DirectX程式設計技術 --- 想學遊戲程式設計嗎?必讀 (轉)程式設計遊戲
- SqlServer中將字串轉utf-8的函式、支援中文的UrlEncode函式SQLServer字串函式
- MFC檔案複製的函式程式程式碼 (轉)函式
- 利用API函式實現影像淡入淡出效果 (轉)API函式