【问题标题】:Hook functions with no target DLL没有目标 DLL 的挂钩函数
【发布时间】:2014-03-24 14:56:15
【问题描述】:

我正在为一个 exe 编写一个分析工具。我有这个 exe 的源代码,所以我知道它使用了哪些函数。 我需要挂钩几个特定的​​函数,以便检查传递的参数。我感兴趣的函数不是任何 DLL 的一部分,而是程序的一部分。

我开始使用 Detours 编写一个挂钩 DLL,它拦截函数调用。我编写了挂钩 DLL,我在其中指定要挂钩的函数,但不幸的是,由于没有可引用的 DLL,当我编译挂钩 DLL 时,我无法解析函数名称。

我该如何解决这个问题?

【问题讨论】:

  • 位置信息可从编译器获得。调试数据库或地图列表都有此信息。见/MAP linker option
  • 顺便说一句,如果启用优化,这些功能甚至可能不以正常方式存在。他们的代码可以在调用函数的多个点内联,然后通过重新排序交织到调用者代码中。
  • 如果你有可执行文件的源代码,你不能直接在有问题的函数中添加一些工具然后重建程序吗?
  • 您已经获得了源代码。你可以做你喜欢的事。

标签: c++ dll hook dll-injection detours


【解决方案1】:

不是一个完美的解决方案,但它会解决你的问题:

您可以通过在目标程序中执行以下操作来获取函数的相对偏移量:

int FuncToGet()
{
    int x = 5;
    return x;
}

int main()
{
    intptr_t baseAddr = (intptr_t)GetModuleHandle(NULL);

    intptr_t relativeoffset = baseAddr - (intptr_t)&FuncToGet;

    std::cout << "Relative offset = 0x" << std::hex << &relativeoffset;
}

您可以使用它来打印出您要挂钩的函数的相对偏移量。

然后将相对偏移量添加到目标进程中模块的基地址,这是你在运行时得到的。

然后就可以用这个地址钩住函数了

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2021-01-20
    • 1970-01-01
    相关资源
    最近更新 更多