@wishz

Как получить HMODULE импортированой dll без LoadLibraryA() или GetModuleHandleA()?

Пишу программу, PE файл, в таблице импорта уже прилинкована KERNEL32.dll (compile-time), из-за использования функции ExitProcess();

Вопрос: Как получить указатель/HMODULE на эту dll, НЕ используя никакие функции KERNEL32.dll такие как LoadLibraryA("KERNEL32.dll") или GetModuleHandleA("KERNEL32.dll") ?

Возможно есть такие варианты: через LdrLoadDll/LdrGetDllHandle {NTDLL} или через смещение указателей структуры заголовка PE {PIMAGE_DOS_HEADER, PIMAGE_NT_HEADERS,PIMAGE_EXPORT_DIRECTORY}. Хотя последнее врядли т.к требуется указатель на саму DLL.
  • Вопрос задан
  • 502 просмотра
Решения вопроса 1
@wishz Автор вопроса
РЕШЕНИЕ:

#include <Windows.h>
#include <winternl.h>
#include <cstdio>

using namespace std;

void get_by_peb()
{
	// Получаем указатель на PEB
	// небольшой хак без какого либо импорта, чисто через asm получаем указататель на PEB структуру
	PPEB peb = NULL;
#ifdef _WIN64
	peb = (PPEB)__readgsqword(0x60);
#else
	peb = (PPEB)__readfsdword(0x30);
#endif
	printf("PEB addr: [%p]\n", peb);
	PPEB_LDR_DATA ldr = peb->Ldr;
	PLIST_ENTRY startPos = &ldr->InMemoryOrderModuleList;
	PLIST_ENTRY currPos = startPos->Flink;

	int moduleCount = 0;
	while (currPos != startPos) {
		moduleCount++;
		currPos = currPos->Flink;
	}
	printf("Modules count: [%d]\n", moduleCount);

	currPos = currPos->Flink;
	PLDR_DATA_TABLE_ENTRY pLdrEntry;
	for (int i = 0; i < moduleCount; ++i) {
		pLdrEntry = CONTAINING_RECORD(
			currPos,
			LDR_DATA_TABLE_ENTRY,
			InMemoryOrderLinks);
		printf(
			"[%ls], BASE-ADDR: [0x%p], Entry-Point:[0x%p]\n",
			pLdrEntry->FullDllName.Buffer,
			pLdrEntry->DllBase,
			pLdrEntry->Reserved3[0]
		);

		currPos = currPos->Flink;
	}

}

int main(void) 
{
	
	// Проверяем адрес
	HMODULE dll_1 = GetModuleHandleA("KERNEL32.dll");

	printf("--------------------\n");
	printf("KERNEL32.dll :: [%p]\n", dll_1);
	printf("main() :: [%p]\n", main);
	printf("--------------------\n");
	// Решение:
	printf("--------------------\n");
	get_by_peb();
	printf("--------------------\n");

	return 0;
}


62c348dec459d705410876.png

Большая часть кода (оригинал): https://makestation.net/thread-3057.html
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Взять адрес ExitProcess и пройтись по страницам влево поискать в начале страниц PE-заголовок, по идее его адрес и должен быть HMODULE, но я не настоящий бинарщик.
Ответ написан
MvcBox
@MvcBox
Software Engineer [C/C++/JS(for Node.js)/etc]
wishz, если у вас задача затруднить разбор импортов, то можете посмотреть в сторону этой библиотеки:
https://github.com/JustasMasiulis/lazy_importer
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы