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

    @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
    Ответ написан
    1 комментарий