首页 新闻 会员 周边 捐助

inline hook 系统messagebox函数 异常

0
悬赏园豆:50 [待解决问题]

请问一下各位大佬,我在windows 10环境下,使用shellcode来hook系统messagebox函数。
用驱动修改EDT过写拷贝,将shellcode写入USER32.dll中,修改messagebox函数跳入shellcode中。运行完成跳回messagebox。

程序使用X64dbg跟踪运行发现,在修改messageboxa函数的头部5个字节跳转时,
第一次报C00000005异常 EXCEPUTION_ACCESS_VOILATION,
接着第二次报C0000041D,STATUS_USER_CALLBACK.之后通过运行。
程序正常运行。能达到HOOK的目标。

但如果不使用X64dbg则无法运行。我想肯定就是那两次异常的问题,请问是什么原因哦,有没有办法可以处理哦。谢谢,谢谢。

布利丹毛驴的主页 布利丹毛驴 | 初学一级 | 园豆:152
提问于:2023-08-27 15:51
< >
分享
所有回答(3)
0

在使用 inline hook 来修改系统的 MessageBox 函数时,出现异常的原因可能是由于内存保护机制导致的。Windows 操作系统使用了 DEP(Data Execution Prevention)和 ASLR(Address Space Layout Randomization)等保护机制来防止恶意代码的执行和注入。

DEP 会阻止在数据内存区域执行代码,而 MessageBox 函数通常位于代码内存区域,所以在尝试修改 MessageBox 函数时,可能会触发 DEP 异常。ASLR 则会将系统模块的基址随机化,导致无法准确找到目标函数的地址。

为了解决这个问题,您可以考虑使用其他技术来实现函数的 hook,例如使用 Detour 库或者使用 VEH(Vectored Exception Handling)来实现。

Detour 库是一个非常强大的库,可以用于函数的 hook,并且可以绕过 DEP 的限制。您可以参考 Microsoft 的 Detours 文档来了解如何使用 Detour 库。

另一种方法是使用 VEH,它允许您在异常处理过程中拦截和修改代码。您可以使用 VEH 来实现函数的 hook,而不会触发 DEP 异常。您可以参考相关的文档和示例来了解如何使用 VEH。

请注意,修改系统函数可能会导致系统不稳定或不可预测的行为。在进行此类操作之前,请确保您了解相关的风险,并在测试环境中进行充分的测试。

以下是一个使用 Detour 库实现函数 hook 的示例代码:

#include <Windows.h>
#include <detours.h>
#pragma comment(lib, "detours.lib")

// 原始的 MessageBoxA 函数指针
typedef int(WINAPI* MessageBoxA_t)(HWND, LPCSTR, LPCSTR, UINT);

// 定义一个新的 MessageBoxA 函数,用于替换原始的 MessageBoxA
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
    // 在这里可以对参数进行修改或者添加自定义逻辑
    // ...

    // 调用原始的 MessageBoxA 函数
    MessageBoxA_t pOrigMessageBoxA = (MessageBoxA_t)DetourFindFunction("user32.dll", "MessageBoxA");
    int result = pOrigMessageBoxA(hWnd, lpText, lpCaption, uType);

    // 在这里可以对返回值进行修改或者添加自定义逻辑
    // ...

    return result;
}

// 入口函数
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    {
        // 初始化 Detour 库
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        
        // 使用 DetourAttach 函数将 MyMessageBoxA 函数与 MessageBoxA 函数进行 hook
        DetourAttach(&(PVOID&)MessageBoxA, MyMessageBoxA);

        // 提交 hook
        DetourTransactionCommit();
    }
    else if (ul_reason_for_call == DLL_PROCESS_DETACH)
    {
        // 移除 hook
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());

        DetourDetach(&(PVOID&)MessageBoxA, MyMessageBoxA);

        DetourTransactionCommit();
    }

    return TRUE;
}

上述代码使用 Detour 库来实现对 MessageBoxA 函数的 hook。在 MyMessageBoxA 函数中,您可以对参数进行修改或者添加自定义逻辑。然后,通过调用原始的 MessageBoxA 函数来实现函数的正常执行。您可以根据需要在适当的位置添加自己的代码。

请注意,上述代码是一个 DLL 项目的示例代码。您需要将其编译为 DLL,并将其注入到目标进程中,以实现对 MessageBoxA 函数的 hook。

lanedm | 园豆:2396 (老鸟四级) | 2023-08-28 08:34

谢谢大哥解答
我是用驱动程序进内核改掉Messagebox的PTE来除掉系统函数的写拷贝。
然后在自己的程序中找到USER32模块的位置,将ShellCode拷入USER32.dll中,
最后用inline hook掉Messagebox。
就在最后一步将Messagebox的函数头部字节改为E9 XX XX XX XX时出现了异常。
第一次报C00000005异常 EXCEPUTION_ACCESS_VOILATION,
接着第二次报C0000041D,STATUS_USER_CALLBACK.之后通过运行。
用x64dbg继续运行,放过两次异常后程序运行正常,功能都没问题。
我最后hook完后,将原Messagebox函数的代码还原时也出了相同的异常。

我修改的是Messagebox函数,该函数本来就在代码区,应该不存在数据内存区域执行代码吧。
我尝试过修改函数前五字节,修改函数其它字节,还试过用内联汇编修改,用字节赋值修改,用memcpy修改,都报相同异常。
我想是不是win10在系统函数的地方有什么保护我不知道哦。我想修改Cr0再试试,但网上有很多人说win10修改cr0已经没有用了。故未试。

支持(0) 反对(0) 布利丹毛驴 | 园豆:152 (初学一级) | 2023-08-28 15:54

原来我在x86上做出来,没问题。
现在系统基本都是x64了,就想说拿来改成x64的程序,哪知道一直都调不好。

支持(0) 反对(0) 布利丹毛驴 | 园豆:152 (初学一级) | 2023-08-28 15:56
0

在 Windows 操作系统中进行 inline hook 或驱动层 hook 是一种高级技术,但也涉及到许多复杂的方面,包括内存保护机制、特权级别、异常处理等。你提到的异常可能是由于操作系统的保护机制引起的。下面是一些可能的原因和解决方法:

DEP/NX 保护: Data Execution Prevention (DEP) 或 No-Execute (NX) 位是一种内存保护机制,它阻止代码从数据区域执行。当你尝试修改内存区域以便执行 shellcode 时,DEP/NX 可能会引发异常。为了解决这个问题,你可以考虑在代码中设置合适的内存属性,以允许代码在数据区域执行。

代码段保护: Windows 内核和一些系统 DLLs 通常会受到写保护。如果你尝试修改这些文件中的代码,操作系统会引发异常。为了解决这个问题,你需要通过解锁页面或其他技术来绕过这种写保护。

异常处理: 当代码执行发生异常时,操作系统会尝试找到异常处理程序,但在你的 hook 场景中,这可能会导致问题。你可以考虑在你的 shellcode 中添加合适的异常处理,以便在异常发生时能够适当地处理它,而不是让操作系统中断你的 hook 流程。

特权级别: 在内核层面进行 hook 需要足够的特权级别。如果你的代码没有足够的权限来修改内核模块,就会遇到访问拒绝的问题。确保你在进行操作时具有足够的权限。

调试器检测: 操作系统可能会检测你的程序是否被调试器附加,以保护系统的安全。如果你使用调试器来跟踪程序,操作系统可能会阻止你的操作。这也可能解释了为什么在 X64dbg 下运行正常。

防病毒软件: 一些防病毒软件可能会监视代码修改,尤其是对系统文件进行的修改。这可能导致你的操作受到干扰。你可以尝试在关闭防病毒软件的情况下运行程序,看看是否会有不同。

总的来说,进行系统层面的 hook 是非常复杂和风险的操作,可能涉及到许多安全和稳定性问题。如果你不是专业的安全研究人员或开发人员,建议谨慎使用这些技术,以避免对系统造成不必要的损害。如果你的目标是进行调试或研究,确保你遵循适当的法律和道德准则。如果你需要更深入的帮助,可能需要咨询专业的安全专家。

Technologyforgood | 园豆:7541 (大侠五级) | 2023-08-28 21:30

大哥,谢谢您的解答。
我是一个爱好者,平时空的时候都做这些玩玩,在知识方面有很大的欠缺,在您的解答中有很多知识面我还没有接触过。我会努力去查这方面的资料,如果有一天我找到问题所在了,我再回来感谢您。
谢谢。谢谢。

支持(0) 反对(0) 布利丹毛驴 | 园豆:152 (初学一级) | 2023-08-31 16:25
0

如果只修改单个进程的函数, 不需要修改写拷贝
出现异常了应该调试看具体原因, 或发下这些信息
函数头部字节改为E9, 在x64应该注意, jmp 转跳的长度是有限制的, 在x64 是可能超过范围, 导致 C00000005
如果x86上做出来没问题, x64 一样是可以的, 需要另外注意的是 函数调用约定的不一样, 以及rsp对齐问题

Yofoo | 园豆:394 (菜鸟二级) | 2024-02-15 00:26

谢谢大哥解答,我也考虑到对齐问题,网上少了几段对齐的汇编,用上了也不行,但这个超范围我还没考虑到,我E9都是在同样的USER32中跳应该是不超过4GB的,我想应该没问题吧。

支持(0) 反对(0) 布利丹毛驴 | 园豆:152 (初学一级) | 2024-02-27 10:33

我原本就是想监控全进程,这是以前在滴水教程上看到的一个作业。

支持(0) 反对(0) 布利丹毛驴 | 园豆:152 (初学一级) | 2024-02-27 10:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册