Захотел я, находясь в ядре, получить список загруженный в текущий процесс DLL. Реализовал это через поиск в GDT дескриптора fs и далее по накатанной: TEB->PEB->список LDR_DATA_TABLE_ENTRY Но вот беда - в моей XP TEB, расположенный по адресу 0x7ffde000, есть не во всех процессах!!! Т.е., например, в процессе services.exe, в GDT есть запись 0x3b (значение FS в ring3), указывающая на этот адрес, но по этому адресу ничего нет! Отчего такое может быть? Нет ли других способов листануть DLL-ы загруженные в текущий процесс из ring0?
есть, держи код, когда то писал драйвер, который должен был запускать exeшник из ring0, получилось, но работает через раз, будет время, разберусь до конца и выложу статью так я искал модуль kernel32.dll в процессе из р0 Код (Text): typedef struct _KMODULEINFOLISTENTRY { DWORD Flink; DWORD Blink; DWORD ModuleIBase; DWORD DllEntryPoint; DWORD Unknown2; DWORD Unknown3; PWCHAR ModuleName; } KMODULEINFOLISTENTRY, *PKMODULEINFOLISTENTRY, **PPKMODULEINFOLISTENTRY; DWORD kwsGetModule(PWCHAR ModuleNameW) { int MNameLen; int buflen; PWCHAR pl; PKMODULEINFOLISTENTRY p,firstentry; static WCHAR s_array[0x200]; DWORD i,j; static PPEB pPeb = (PPEB)0x7ffdf000; // PEB __try{ MNameLen = 0; if (MmGetPhysicalAddress(pPeb).QuadPart == 0) return 0; // no user space this process has for (MNameLen=0; ModuleNameW[MNameLen] !=0; MNameLen++) ModuleNameW[MNameLen] = RtlUpcaseUnicodeChar(*(ModuleNameW+MNameLen)); (DWORD)p = (DWORD)firstentry = *(PDWORD)pPeb->ProcessModuleInfo->ModuleHeader.List3.Flink; for (i = 0; i<10001 ;++i) { if (MmGetPhysicalAddress(p->ModuleName).QuadPart == 0) return 0; pl = p->ModuleName; RtlZeroMemory(s_array,sizeof(s_array)); // îáíóëÿåì ìàññèâ buflen = 0; for (pl; *pl!=0;pl++) { s_array[buflen] = RtlUpcaseUnicodeChar(*pl); buflen++; } j = buflen*2 - MNameLen*2; // àäðåñ ñòðîêè â áóôåðå îòêóäà ñðàâíèâàòü j = (DWORD)s_array + j; // if strings are equal then return Ib of Kernel32.dll if (!memcmp((PCHAR)j,ModuleNameW,MNameLen*2)) {return p->ModuleIBase;} if (MmGetPhysicalAddress((PKMODULEINFOLISTENTRY)p->Flink).QuadPart == 0) return 0; p = (PKMODULEINFOLISTENTRY)(p->Flink); // no kernel32.dll module mapped at this process space :) if ((PDWORD)firstentry == (PDWORD)p) return 0; } } __except(EXCEPTION_EXECUTE_HANDLER){} return 0; // oOPS!? :)) }