Как определить, произошел ли символ 'malloc' из источника или из компилятора? - PullRequest
0 голосов
/ 11 января 2019

Используя инъекцию Dll, я смог перехватить символ malloc из msvcrt.dll и распечатать журнал всех вызовов на malloc из введенного процесса. Проблема в том, что в журнале я могу найти вызовы malloc, которых нет в целевом exe-файле, см. Дальнейший пример.

Я считаю, что есть способ решить эту проблему, основываясь на возвращенных адресах вызовов 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 при печати журнала? Спасибо за любую помощь.

1 Ответ

0 голосов
/ 11 января 2019

когда мы перехватываем функцию из dll, скажем, msvcrt!malloc вызовы могут быть из разных PE модулей. мы можем взять базовый адрес вызывающего модуля из returnAddress call GetModuleHandleExW с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS. если нам нужно обнаружить, что вызов был от exe , мы можем сравнить этот адрес с базовым адресом exe , который мы можем получить через 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());
}
...