以下傳統的API Hook方式在Winxp - Win7都可以作業,但在Win10上面作業時會產生例外導致程式退出,有哪位知道如何在Win10下面正確地Hook API?
DWORD g_pMsgA=0;
BYTE g_szMsgAOld[8]={NULL};
BYTE g_szMsgANew[8]={0XB8,0X00,0X00,0X40,0X00,0XFF,0XE0,0X00};
DWORD dwSize=0;
HMODULE hDLL=NULL;
hDLL=::LoadLibrary("User32.dll");
g_pMsgA=(DWORD)GetProcAddress(hDLL,"MessageBoxA");
ReadProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgAOld,8,&dwSize);
*(DWORD*)(g_szMsgANew+1)=(DWORD)MyMessageBoxA;
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgANew,8,&dwSize);
int MyMessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
int iRet=0;
DWORD dwSize=0;
if (CheckDlg(hWnd)) return 0;
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgAOld,8,&dwSize);
iRet=MessageBoxA(hWnd,lpText,lpCaption,uType);
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgANew,8,&dwSize);
return iRet;
}
uj5u.com熱心網友回復:
64還是32位的系統?還有被HOOK的里程是32位還是64位的
uj5u.com熱心網友回復:
函式呼叫都成功了??uj5u.com熱心網友回復:
還可能win8上就不能用了。os有變化。uj5u.com熱心網友回復:
用 VirtualProtect 修改過代碼位置的記憶體屬性,把它改成可寫的了嗎?uj5u.com熱心網友回復:
http://codefromthe70s.org/2014-Mar-5: Mhook v2.4, an API hooking library
熊孩子防火墻:基于AppInit_DLLs的行程過濾器
http://nicoconi.com/2015-08/appinit_dlls-minifilterz.html
最后,該dll由VS2013編譯,用到了開源的mhook庫,在64位win7、win8、win10上測驗通過,xp兼容性未知,xp請謹慎使用
LZ, 有沒有試過mHook v2.4, 初看查看的資料,從<<熊孩子防火墻>>的介紹看,好像是支持win10的, 你可以試試.
mHook是開源的, 如果能用于Win10, 你可以找下區別.
uj5u.com熱心網友回復:
WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/uj5u.com熱心網友回復:
這是以前網上找到的代碼,進行了簡單修改,一直都能用,在 Windows 10 上也沒有問題。例子為 Hook MessageBoxA 函式:
#include <windows.h>
#pragma comment(lib, "user32.lib")
#ifndef _X86_JMP_SIZE
#define _X86_JMP_SIZE 6
#endif
void *g_pfnToHook = NULL;
void *g_pfnHooked = NULL;
BYTE g_oldBytes[_X86_JMP_SIZE] = { 0 };
BYTE g_jmpBytes[_X86_JMP_SIZE] = { 0 };
DWORD g_dwProtect = 0;
DWORD g_dwResult = 0;
int WINAPI HookedMessageBoxA(
HWND hWnd,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType
)
{
int iRet = -1;
if (VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, PAGE_EXECUTE_READWRITE, &g_dwResult)) {
memcpy(g_pfnToHook, (void *)g_oldBytes, _X86_JMP_SIZE);
iRet = MessageBoxA(hWnd, "The message from hooked MessageBox!", lpCaption, uType);
memcpy(g_pfnToHook, (void *)g_jmpBytes, _X86_JMP_SIZE);
VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, g_dwProtect, &g_dwResult);
}
return iRet;
}
BOOL InitializeMessageBoxHook(void)
{
BYTE jmpBytes[_X86_JMP_SIZE] = { 0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3 };
memcpy((void *)g_jmpBytes, (void *)jmpBytes, sizeof(jmpBytes));
DWORD jmpSize = (DWORD)((DWORD_PTR)g_pfnHooked - (DWORD_PTR)g_pfnToHook - 5);
BOOL fResult = VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, PAGE_EXECUTE_READWRITE, &g_dwProtect);
if (fResult) {
memcpy((void *)g_oldBytes, g_pfnToHook, _X86_JMP_SIZE);
memcpy((void *)&g_jmpBytes[1], (void *)&jmpSize, sizeof(jmpSize));
memcpy(g_pfnToHook, (void *)g_jmpBytes, _X86_JMP_SIZE);
fResult = VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, g_dwProtect, &g_dwResult);
}
return fResult;
}
BOOL FinalizeMessageBoxHook(void)
{
BOOL fResult = VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, PAGE_EXECUTE_READWRITE, &g_dwResult);
if (fResult) {
memcpy(g_pfnToHook, g_oldBytes, _X86_JMP_SIZE);
}
return fResult;
}
int main(int argc, char *argv[])
{
g_pfnToHook = (void *)MessageBoxA;
g_pfnHooked = (void *)HookedMessageBoxA;
MessageBoxA(NULL, "Before Hook!", "before", MB_OK);
if (InitializeMessageBoxHook()) {
MessageBoxA(NULL, "Hello world!", "info", MB_OK);
FinalizeMessageBoxHook();
}
MessageBoxA(NULL, "After Hook!", "after", MB_OK);
return 0;
}
uj5u.com熱心網友回復:
g_pMsgA=(DWORD)GetProcAddress(hDLL,"MessageBoxA");目測弄成64位程式了, 然后就崩了
uj5u.com熱心網友回復:
可能由于LoadLibrary的原因,win10下面kernel32里面已經不叫這個名字了,這個名字的函式在KERNELBASE.dll還沒有變。你匯出用這個試試uj5u.com熱心網友回復:
不止你遇到的這事兒,有不少過去XP或WIN7上可靠實用的API現在WIN10上都無法使用或結果難以確定。估計微軟的WIN10有了新的運行代碼,例如以前WIN7上能啟動和關閉的服務現在手動也不能操作了。微軟把你的電腦完全當成了他的電腦。uj5u.com熱心網友回復:
自己寫iat inline hook失效就不必要糾結了,直接detoursuj5u.com熱心網友回復:
可以試試使用現成的庫,我在win10下使用是正常的https://github.com/martona/mhook
mhook也是使用inline hook,而且它對多執行緒并發呼叫的情況作了處理,是執行緒安全的
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43650.html
上一篇:電腦什么都不運行,都會卡死
下一篇:3. CHouse類對運算子 >>多載,實作從流中獲取房屋資訊。4. CBuilding類的ReadData通過呼叫CHouse類的運算子>>多載函式,實
