如何在EXE文件中找到挂钩/绕行的函数地址?

时间:2010-11-30 19:06:38

标签: c++ c windows hook

我再次开车撞墙,需要你帮助处理一些低级别的东西。我已经成功地将导出的DLL函数(with this code btw.)挂钩到我的目标进程中(例如,我可以轻松地从MessageBoxW绕过user32.dll)。不幸的是,我的目标是一个不同的场景:我必须绕过可执行文件中定义的函数我将代码注入其中。该应用程序是开源的,所以我知道我需要挂钩它的所有功能,但二进制文件是用证书签名的,所以我无法编译自己的版本。是否可以在运行时获取函数的地址或使用其他技术绕过它?目标是一个“正常”的32位Windows二进制文件btw。没什么特别的想法;)

此致, Nefarius

编辑:也许是因为我的蹩脚英语我不够详细,所以这里有一些示例代码:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    foo();
}

BOOL foo(char* someData)
{
    return printf("%s", someData);
}

现在我想绕开动态库中不存在的函数foo()。这是我的问题。我不知道如何,我不确定这是否像我认为的那样有效。

编辑:现在我知道这是可能的,所以重要的问题改为:如何?我如何获得所需的信息;函数地址?

5 个答案:

答案 0 :(得分:1)

当然,只需使用Ollydbg之类的东西设置断点,然后在加载可执行文件(并完成检查证书)后编辑程序集。永久地执行此操作会更具挑战性,但根据证书检查的复杂程度,您可以通过将其替换为NOP(无操作)来绕过该位代码。

编辑:如果您正在运行64位Windows,那么您可能会更好地使用Microsoft自己的Debugging Tools。我从未使用它们,所以我不知道它们与Ollydbg的比较。

答案 1 :(得分:1)

如果这是针对多次调试jaunt的事情,请查看Microsoft Detours,这是一个用于挂钩函数的API。

答案 2 :(得分:0)

你需要获取函数地址,然后在程序的函数入口点插入一个jmp,然后恢复原始proc,然后跳回原来的函数。

答案 3 :(得分:0)

使用EasyHook。使用该库,您可以使用地址拦截函数。

答案 4 :(得分:-1)

我通过挂钩一些低级Windows API函数获得了我的目标,而不是最好的解决方案,但它可以工作,汇编程序不是我的......