如何确定“ malloc”符号是来自源代码还是来自编译器?

时间:2019-01-10 22:11:20

标签: c++ winapi portable-executable

使用Dll注入,我可以从malloc钩住msvcrt.dll符号,并打印注入过程中对malloc的所有调用的日志。问题在于,在日志中我可以找到对malloc的调用,这些调用不在目标exe中,请参见其他示例。

我相信,有一种方法可以根据我在挂钩过程中发现的malloc调用的返回地址来解决此问题。这是使用tcc编译的目标PE的日志文件:

0 malloc(18)    memory allocated at: 10229112    the return adress is 74ab770a.
1 malloc(4096)  memory allocated at: 10232824    the return adress is 74ab770a.
2 malloc(15)    memory allocated at: 10229144    the return adress is 401022.
3 malloc(15)    memory allocated at: 10229168    the return adress is 401041.
4 malloc(15)    memory allocated at: 10229192    the return adress is 401060.

在exe文件中,仅存在最后三个调用,很明显另一个调用来自完全不同的PE。

在打印日志时,如何检测来自exe文件的呼叫以及来自不同PE的呼叫? 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

当我们从dll挂接函数时,说msvcrt!malloc调用可以来自不同的 PE 模块。我们可以从带有GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS标志的returnAddress调用GetModuleHandleExW中获取调用模块的基地址。如果我们需要检测呼叫是来自 exe 的,我们可以将此地址与我们可以通过GetModuleHandleW

获取的 exe 的基地址进行比较

代码看起来像

HMODULE hmod;
if (GetModuleHandleEx(
    GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|
    GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (PCWSTR)_ReturnAddress(), &hmod))
{
    static HMODULE hmodEXE = 0;

    if (!hmodEXE)
    {
        hmodEXE = GetModuleHandleW(0);
    }

    DbgPrint("%p: call %sfrom exe\n", _ReturnAddress(), hmodEXE == hmod ? "" : "not ");
}
else
{
    DbgPrint("%p: call not from any PE\n", _ReturnAddress());
}