如何确定 'malloc' 符号是来自源代码还是来自编译器?
How to determine if a 'malloc' symbol came from the source or from the compiler?
使用 Dll 注入,我能够从 msvcrt.dll
挂钩 malloc
符号,并打印注入进程对 malloc
的所有调用的日志。问题是在日志中我可以找到不在目标 exe 中的对 malloc
的调用,请参阅更多示例。
我相信有办法解决这个问题,基于我在挂钩过程中发现的 malloc
调用的返回地址。这是目标 PE 的日志文件,使用 tcc 编译:
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 的调用?
感谢您的帮助。
当我们从 dll 挂钩函数时,说 msvcrt!malloc
调用可以来自不同的 PE 模块。我们可以从 returnAddress 调用中获取调用模块的基址 GetModuleHandleExW
with GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
flag. if we need detect are call was from exe we can compare this address with base address of exe which we can get via GetModuleHandleW
代码看起来像
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());
}
使用 Dll 注入,我能够从 msvcrt.dll
挂钩 malloc
符号,并打印注入进程对 malloc
的所有调用的日志。问题是在日志中我可以找到不在目标 exe 中的对 malloc
的调用,请参阅更多示例。
我相信有办法解决这个问题,基于我在挂钩过程中发现的 malloc
调用的返回地址。这是目标 PE 的日志文件,使用 tcc 编译:
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 的调用?
感谢您的帮助。
当我们从 dll 挂钩函数时,说 msvcrt!malloc
调用可以来自不同的 PE 模块。我们可以从 returnAddress 调用中获取调用模块的基址 GetModuleHandleExW
with GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
flag. if we need detect are call was from exe we can compare this address with base address of exe which we can get via GetModuleHandleW
代码看起来像
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());
}