Win10下的API HOOK不起作用的问题

lzzqqq 2015-09-04 02:36:27
以下传统的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;
}
...全文
5372 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
许文君 2019-06-05
  • 打赏
  • 举报
回复
自己写iat inline hook失效就不必要纠结了,直接detours
encoderlee 2019-06-05
  • 打赏
  • 举报
回复
可以试试使用现成的库,我在win10下使用是正常的

https://github.com/martona/mhook

mhook也是使用inline hook,而且它对多线程并发调用的情况作了处理,是线程安全的
flyfish6344 2019-06-04
  • 打赏
  • 举报
回复
不止你遇到的这事儿,有不少过去XP或WIN7上可靠实用的API现在WIN10上都无法使用或结果难以确定。估计微软的WIN10有了新的运行代码,例如以前WIN7上能启动和关闭的服务现在手动也不能操作了。微软把你的电脑完全当成了他的电脑。
zzg00000 2017-04-25
  • 打赏
  • 举报
回复
可能由于LoadLibrary的原因,win10下面kernel32里面已经不叫这个名字了,这个名字的函数在KERNELBASE.dll还没有变。你导出用这个试试
「已注销」 2015-09-06
  • 打赏
  • 举报
回复
这是以前网上找到的代码,进行了简单修改,一直都能用,在 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;
}
赵4老师 2015-09-06
  • 打赏
  • 举报
回复
LostSpeed 2015-09-06
  • 打赏
  • 举报
回复
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, 你可以找下区别.
dustpg 2015-09-06
  • 打赏
  • 举报
回复
g_pMsgA=(DWORD)GetProcAddress(hDLL,"MessageBoxA");
目测弄成64位程序了, 然后就崩了
www_adintr_com 2015-09-05
  • 打赏
  • 举报
回复
用 VirtualProtect 修改过代码位置的内存属性,把它改成可写的了吗?
Eleven 2015-09-05
  • 打赏
  • 举报
回复
函数调用都成功了??
oyljerry 2015-09-05
  • 打赏
  • 举报
回复
还可能win8上就不能用了。os有变化。
zwfgdlc 2015-09-04
  • 打赏
  • 举报
回复
64还是32位的系统? 还有被HOOK的里程是32位还是64位的

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧