На следующей ветки форума обсуждалось снятие перехватов методом подмены адересо в KiST http://www.wasm.ru/forum/viewtopic.php?id=19538&p=2 agent007 привел функцию FindKiServiceTable в ее коде я встретил незнакомую мне функцию, собственно сабж. кто может подсказать что это за функция и где ее взять! ЗЫ.Не пинайте если туплю, я этим увлекся недавно! Поиск по форуму не дал результатов!
Эта функция парсит экспорт PE-модуля и ищет экспортируемую переменную KeServiceDesctiptorTable. Аналог GetProcAddress.
n0name спасибо за разъяснение, я впринципе так и полагал, но почему то на rootkit.com я ее не нашел, может скинишь линк или выложи тут, plz!
Код (Text): ULONG NTAPI GetProcRva(ULONG hModule,PCHAR szProcName) { PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) hModule; PIMAGE_NT_HEADERS32 pNtHeader; PIMAGE_EXPORT_DIRECTORY pImageExportDirectory; BOOLEAN bDumbLinker,bFindByOrdinal; ULONG i,uOrdinals = 0; PULONG pName; USHORT nOrdinal; ULONG uFuncRva = 0; ULONG uReturnRva = 0; // __try { bFindByOrdinal=((ULONG)szProcName==(USHORT)szProcName); if(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE) return 0; pNtHeader = (PIMAGE_NT_HEADERS32)(((char *)pDOSHeader) + pDOSHeader->e_lfanew); if(pNtHeader->Signature != IMAGE_NT_SIGNATURE) return 0; if (pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress) { pImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY) (hModule+pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); pName = (PULONG) (hModule+pImageExportDirectory->AddressOfNames); for (i=0;i<pImageExportDirectory->NumberOfFunctions;i++,pName++) { bDumbLinker=FALSE; // hack to avoid access violation when addressing bad pointers: // some dumb linkers set NumberOfFunctions to the largest ordinal // and NumberOfNames to the real functions number. if (i*2+(ULONG) (hModule+pImageExportDirectory->AddressOfNameOrdinals)== (ULONG) (hModule+pImageExportDirectory->Name)) { bDumbLinker=TRUE; break; } __try { nOrdinal=((PUSHORT) (hModule+pImageExportDirectory->AddressOfNameOrdinals))[i]; uFuncRva=((PULONG)(hModule+pImageExportDirectory->AddressOfFunctions))[nOrdinal]; } __except(EXCEPTION_EXECUTE_HANDLER) { bDumbLinker=TRUE; } if (bDumbLinker) break; nOrdinal += (USHORT)pImageExportDirectory->Base; if (!bFindByOrdinal && pName && i<pImageExportDirectory->NumberOfNames) { if (!strcmp(szProcName,(PCHAR)(hModule+(ULONG)*pName))) { uReturnRva = uFuncRva; break; } } else if (bFindByOrdinal && (nOrdinal==(USHORT)szProcName)) { uReturnRva = uFuncRva; break; } } } } __except(EXCEPTION_EXECUTE_HANDLER) { } return uReturnRva; }
весьма оригинально, особенно в r3. А код какой-то не целостный, половина проверок есть, половины нет. Проверяем на сигнатуры, а вот то, что таблицы экспорта может и не быть - нет.
не мои слова а n0name. Вот у меня и сложилось впечатление что это не полностью твой код, если не так то извини.