Когда я сбрасываю pe из памяти, как я могу восстановить IAT? - PullRequest
0 голосов
/ 29 августа 2018

Я анализирую вредоносное ПО, вредоносное ПО дешифрует файл pe в память, как это

enter image description here

Я использую ollydumpex для x64dbg для выгрузки памяти,

enter image description here

затем используйте IDA для анализа, но это так

enter image description here

это dll, она будет внедрена в другой процесс. так что текущий процесс не будет загружать его, так как я могу его починить?

1 Ответ

0 голосов
/ 30 августа 2018

Во-первых, OEP. На снимке экрана я вижу EntryPoint (+ 0x28 по адресу подписи PE \ x00 \ x00) как ноль. Итак, сначала вам нужно выяснить, где эта точка входа действительно расположена.

Итак, если вы проверите CreateRemoteThread описание:

РУЧКА CreateRemoteThread ( РУЧКА hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );

Вам нужен аргумент lpStartAddress. Этот аргумент может быть расположен в строке

4015C9  lea eax, dword ptr ds:[ebx+edi]

Итак, ваше значение edi равно 0x3CE0000 (это ImageBase в другом процессе), а значение ebx равно 0xB159 (это EntryPoint RVA). В OllyDumpEx вы должны записать это значение в поле EntryPoint.

Восстановление импорта - это длительный процесс анализа всех обращений к библиотекам и повторного создания таблицы IMPORT_DIRECTORY и IAT. Вы можете написать скрипт для этого или использовать любой существующий. Другим вариантом является исправление Scylla (это проект с открытым исходным кодом) и добавление возможности изменить ImageBase на какое-то конкретное значение (0x3CE0000 в вашем случае).

Такие инструменты, как ImpREC (Import Reconstructor) и Scylla, здесь не подходят без патча. Настоящая проблема здесь в том, что ваша DLL не загружается как обычная DLL. Таким образом, вы не можете выбрать его с помощью «Pick DLL» в ImpREC / Scylla.

Но вы можете взломать. Создайте 2 пустых проекта - DLL и EXE, который загружает DLL. В exe загрузите вашу DLL и после этого напишите бесконечный цикл следующим образом:

#include <stdio.h>
#include <Windows.h>
int main() {
     HANDLE hLib = LoadLibraryA("someDll.dll");
     DWORD old;
     // this will make your DLL writable.
     VirtualProtect((DWORD)hLib, 0x3C414, PAGE_EXECUTE_READWRITE, &old);
     DWORD pid = GetProcessId(GetCurrentProcess());
     char addressBuffer[64];
     sprintf(addressBuffer, "ImageBase: %#x\nPID: %#x", (DWORD)hLib, pid);
     MessageBoxA(NULL, addressBuffer, "Donor DLL address", MB_OK);
     for (;;) Sleep(1000);
     return 0;
}

Я рекомендую вам добавить какой-нибудь большой объект данных в вашу DLL. Эта DLL будет донором для вашей вредоносной программы. Просто добавьте int bigData[0x3C414]; где-нибудь за пределами функций (данные функций будут помещены в стек, но вам потребуется большой объем памяти основного модуля). Я получаю 0x3C414 из значения EBP как размер вредоносного ПО.

Теперь запустите это приложение и прочитайте ImageBase и PID из окна сообщения. Затем проследите до OpenProcess и замените третий аргумент (dwProcessId) на PID вашего приложения. Затем проследите до строки, как на скриншоте, замените второй аргумент на ImageBase и выполните WriteProcessMemory. Это все! Теперь вы можете восстановить IAT с помощью ImpREC или Scilla. Просто откройте ваш процесс и выберите DLL someDll.dll. Введите 0xB159 как EntryPoint / OEP и нажмите IAT AutoSearch, затем Get Imports и Fix dump. Удачи!

...