【问题标题】:How to find a functions address to hook/detour in an EXE file?如何在 EXE 文件中找到挂钩/绕行的函数地址?
【发布时间】:2010-11-30 19:06:37
【问题描述】:

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

你的, 奈法瑞斯

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

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

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

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

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

【问题讨论】:

  • 不要将 [tags] 放在主题行中,尤其是当您也将它们放在标签区域时。

标签: c++ c windows hook


【解决方案1】:

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

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

【讨论】:

  • 哦,我不想欺骗证书,我不在乎 :-) 我只需要硬编码到二进制文件本身的函数的 (int) 返回值。顺便说一句,我尝试了 OllyDbg。但我有 Win7 x64...用 XP 启动 VBox
  • @Nefaurius:问题是什么?为什么不直接打补丁呢?
  • @Ruslik:简单的回答:怎么样?我不得不承认我没有拆卸/调试/反转的经验,所以我是个无头的 ATM。
  • @Nefarius:这就是当您使用某些东西而不了解它的确切作用时会发生的情况:)
  • 抱歉,作为军医,我的 FASM/i368 等技能不是很高,而且似乎我没有在谷歌上搜索正确的术语,这种情况每半年就会发生一次,我必须使用某种像这样的论坛/平台。另一方面,与其告诉我一些我已经知道的事情,你可以给我一点教育吗? ;)
【解决方案2】:

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

【讨论】:

  • 我已经知道如何挂钩函数并且它可以工作。我只是不知道如何挂钩在可执行文件中定义的非动态函数。
  • @Nefarius:钩住它们是一样的。您唯一的挑战是找到它们,因为它们不在导出表中。但正如你所说:你已经掌握了所有信息。您可以硬编码函数的位置,或解析 .MAP 文件。
  • 好吧,这是可能的,很好。所以我的下一个挑战将是获取函数地址。您对我有提示吗(链接到示例、教程等?),将不胜感激。很抱歉,我不知道如何执行此操作。
  • 您是否有权访问可执行文件的 PDB 文件?如果是这样,您可以查询 PDB 文件并获取函数地址。
  • 不,我没有,只有 PE (.exe) 文件。
【解决方案3】:

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

【讨论】:

  • 在这里查看补丁工具。正是这样做的:comrade.ownz.com/projects/petools.html
  • 谢谢!非常有趣,但我仍然不知道如何从我注入的代码中绕过该函数。我可以毫无问题地挂钩 DLL 导出的函数,但我需要函数的地址,因为没有要挂钩的 DLL...
【解决方案4】:

为此使用 EasyHook。使用该库,您可以拦截具有该地址的函数。

【讨论】:

  • 我知道 EasyHook 以及它可以/做什么,但我没有功能地址
  • 你不能用 EasyHook 获取函数的地址,地址是函数本身(如果它没有用链接器优化编译)。对于 EasyHook,您应该将 &foo 作为地址传递。
【解决方案5】:

我的目标是挂钩一些低级 Windows API 函数,这不是最好的解决方案,但它有效,Assembler 不是我的......

【讨论】:

  • 我觉得我一直在寻找的实际答案不见了。
猜你喜欢
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多