n0name: Угу, r3 и восстановление SDT :\ а кто сказал, что из r3? я лишь кусок примера дал. а в r0 пусть сам выходит.
это и есть привязка к конкретному коду чего я, кстати, очень не люблю.. лучше уж составить базу RVA для всех известных версий ntoskrnl и не поддерживать следующие версии или, по-крайней мере, убедиться, что билд ядра не выше определенного, для которого совместимость точно известна, и только тогда применять этот способ
Nouzui а ты проверь на всех версиях кстати... ужасный код поиска KiServiceTable... ктото особо умный придумал его и все разом давай копипастить релоки и прочая гадость ненужная... Щас покажу свою процедуру: Код (Text): ULONG FindKiServiceTable(PVOID pModule,ULONG uSize) { ULONG uKSDT,i,uKiServiceTable = 0; PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) pModule; PIMAGE_NT_HEADERS32 pNtHeader; // if(!pModule) return 0; 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; uKSDT = GetProcRva((ULONG)pModule,"KeServiceDescriptorTable"); if(!uKSDT) return 0; uKSDT += pNtHeader->OptionalHeader.ImageBase; for(i=0;i<uSize;i++) { if(*(PUSHORT) ((ULONG) pModule+i)== 0x05C7) { if(*(PULONG) ((ULONG) pModule+i+2) == uKSDT) { uKiServiceTable = *(PULONG) ((ULONG) pModule+i+6) - pNtHeader->OptionalHeader.ImageBase; break; } } } return uKiServiceTable; } и никакие релоки не нужны вовсе...
agent007 от релока хуже не будет - дополнительный фактор, подтверждающий, что найдено именно то место оч надо.. это только если совсем по-хорошему а так: потому что всерьез рассчитывать, что прога заработает и на следующих ядрах... можно, конешн, но не для продакшена
зачем плодить гавнакод в ядре... Рассуждаем логически чекаем опкод C705, возможно mov [mem32],imm32, определяем что mem32 == KeServiceDescriptorTable, стало быть второй параметр и есть наша таблица, т.к. ничего кроме нее лежать не может в KeServiceDescriptorTable
в принципе, релоки мало что дают, согласен только вот не mem32 == rva KeServiceDescriptorTable а вдруг это не rva KeServiceDescriptorTable, а непосредственный адрес в каком-нибудь известном процессе, типа winlogon? бред, конечно, но все-таки да и релои бывают разные, вдруг этот rva после релокейшена станет совсем не указателем на KeServiceDescriptorTable, а чем-то другим? (еще больший бред, если честно)) ну,в общем, реально такое или не реално, а чем больше проверок, тем лучше
интересно как это если при компиляции указывала на одну переменную, а после релокейшена на другую? да бред ИМХО
Таблица релоков - rellocs - RE-LOCATION - (перевод - сменить местоположение), то есть если база занята то в коде прямые адреса будут пофиксены с учетом новой базы, а вот таблица с местоположением прямых адресов как раз и есть - таблица релоков. P.S. Поэтому если твое ядро будет подгружено по новой базе, то код - "uKiServiceTable = *(PULONG) ((ULONG) pModule+i+6) - pNtHeader->OptionalHeader.ImageBase" теряет смысл, т.к. pModule указывает "не туда".
откуда ты знаешь, что это указатель на переменную? просто какое-то число в поле адреса, чтобы узнать, на что она будет указывать, надо проверить релокейшены ну, правда, если это число попадает под релок, то это наверняка указатель на на равный ему rva, то, что тип релокейшена будет другим, уже совсем фантастика
im1111 что такое релоки и как они работают я знаю, а как работает мой код ты не знаешь поправочка, на входе у функции образ ntoskrnl.exe с диска! а не в памяти.... поэтому там imagebase 0x400000. вот впринципе и все...
Nouzui теоритически да не спорю... практически.... ну все такие C705XXXXXXXX слишком уникальая сигнатура
im1111 ну через NtOpenFile мы ж всетакие в r0 код тестил на XP SP2, 2000 SP4, щас доставлю 2003 SP2 и проверю там)) хотя работать должно
k3internal Тада вопрос. Как определить что есть ядро? Хоть базу, хоть имя - не важно. Имеем следующее: 1. Номер следования может быть любым. 2. Имя образа может быть любым. 3. Функции могут быть перехвачены заменой адреса в SDT. Как искать оригинальные адреса? Nouzui +1 Очень симпатичен Ваш подход к программированию. Аккуратно.
IceFire искать KiServiceTable по сигнатуре... а вот номер следования в нормальной винде всегда первая, если рассматривать другие случаи.... ну тогда вообще может и другое чтото не работать, т.к. чужая дровина и не такое испоганить может
Вопрос.... Почему не все системные сервисы (которых для 2600 билда ровно 0x11B) есть в директории экспорта ntoskrnl.exe? А то была идея восстанавливать SDT, получая оригинальные адреса из директории экспорта, складывая с базой загрузки ядра.