Во-первых, 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
. Удачи!