РЕШЕНИЕ:
#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;
}
Большая часть кода (оригинал):
https://makestation.net/thread-3057.html