Восстановить SDT

Тема в разделе "WASM.NT.KERNEL", создана пользователем IceFire, 18 мар 2007.

  1. d4rkeagle

    d4rkeagle Алексей Шпунсель

    Публикаций:
    0
    Регистрация:
    3 мар 2006
    Сообщения:
    66
    Адрес:
    Тайланд
    n0name: Угу, r3 и восстановление SDT :\

    а кто сказал, что из r3? я лишь кусок примера дал. а в r0 пусть сам выходит.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Надо найти кусок кода, который заполняет KeServiceDescriptorTable и вызвать его =)
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    Посмотри на rootkit.com статейки кодера 90210.
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    это и есть привязка к конкретному коду
    чего я, кстати, очень не люблю.. лучше уж составить базу RVA для всех известных версий ntoskrnl и не поддерживать следующие версии
    или, по-крайней мере, убедиться, что билд ядра не выше определенного, для которого совместимость точно известна, и только тогда применять этот способ
     
  5. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    Nouzui а ты проверь на всех версиях :) кстати... ужасный код поиска KiServiceTable... ктото особо умный придумал его и все разом давай копипастить :) релоки и прочая гадость ненужная... Щас покажу свою процедуру:
    Код (Text):
    1. ULONG FindKiServiceTable(PVOID pModule,ULONG uSize) {
    2.     ULONG uKSDT,i,uKiServiceTable = 0;
    3.     PIMAGE_DOS_HEADER pDOSHeader = (PIMAGE_DOS_HEADER) pModule;
    4.     PIMAGE_NT_HEADERS32 pNtHeader;
    5.     //
    6.     if(!pModule) return 0;
    7.     if(pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE) return 0;
    8.     pNtHeader = (PIMAGE_NT_HEADERS32)(((char *)pDOSHeader) + pDOSHeader->e_lfanew);
    9.     if(pNtHeader->Signature != IMAGE_NT_SIGNATURE) return 0;
    10.     uKSDT = GetProcRva((ULONG)pModule,"KeServiceDescriptorTable");
    11.     if(!uKSDT) return 0;
    12.     uKSDT += pNtHeader->OptionalHeader.ImageBase;
    13.     for(i=0;i<uSize;i++) {
    14.         if(*(PUSHORT) ((ULONG) pModule+i)== 0x05C7) {
    15.             if(*(PULONG) ((ULONG) pModule+i+2) == uKSDT) {
    16.                 uKiServiceTable = *(PULONG) ((ULONG) pModule+i+6) - pNtHeader->OptionalHeader.ImageBase;
    17.                 break;
    18.             }
    19.         }
    20.     }
    21.     return uKiServiceTable;
    22. }
    и никакие релоки не нужны вовсе...
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    agent007
    от релока хуже не будет - дополнительный фактор, подтверждающий, что найдено именно то место

    оч надо.. это только если совсем по-хорошему
    а так:
    потому что всерьез рассчитывать, что прога заработает и на следующих ядрах...
    можно, конешн, но не для продакшена
     
  7. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    зачем плодить гавнакод в ядре... Рассуждаем логически чекаем опкод C705, возможно mov [mem32],imm32, определяем что mem32 == KeServiceDescriptorTable, стало быть второй параметр и есть наша таблица, т.к. ничего кроме нее лежать не может в KeServiceDescriptorTable
     
  8. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    в принципе, релоки мало что дают, согласен
    только вот не
    mem32 == rva KeServiceDescriptorTable
    а вдруг это не rva KeServiceDescriptorTable, а непосредственный адрес в каком-нибудь известном процессе, типа winlogon? ;)
    бред, конечно, но все-таки
    да и релои бывают разные, вдруг этот rva после релокейшена станет совсем не указателем на KeServiceDescriptorTable, а чем-то другим? (еще больший бред, если честно))

    ну,в общем, реально такое или не реално, а чем больше проверок, тем лучше
     
  9. Guest

    Guest Guest

    Публикаций:
    0
    Легко, у меня из-за релоков всегда были проблемы, поэтому не учитывать их нельзя.
     
  10. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    интересно как это если при компиляции указывала на одну переменную, а после релокейшена на другую? да бред ИМХО :)
     
  11. Guest

    Guest Guest

    Публикаций:
    0
    Таблица релоков - rellocs - RE-LOCATION - (перевод - сменить местоположение), то есть если база занята то в коде прямые адреса будут пофиксены с учетом новой базы, а вот таблица с местоположением прямых адресов как раз и есть - таблица релоков.
    P.S. Поэтому если твое ядро будет подгружено по новой базе, то код - "uKiServiceTable = *(PULONG) ((ULONG) pModule+i+6) - pNtHeader->OptionalHeader.ImageBase" теряет смысл, т.к. pModule указывает "не туда".
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    откуда ты знаешь, что это указатель на переменную?
    просто какое-то число в поле адреса, чтобы узнать, на что она будет указывать, надо проверить релокейшены
    ну, правда, если это число попадает под релок, то это наверняка указатель на на равный ему rva, то, что тип релокейшена будет другим, уже совсем фантастика
     
  13. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    im1111 что такое релоки и как они работают я знаю, а как работает мой код ты не знаешь :) поправочка, на входе у функции образ ntoskrnl.exe с диска! а не в памяти.... поэтому там imagebase 0x400000. вот впринципе и все...
     
  14. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    Nouzui теоритически да :) не спорю... практически.... ну все такие C705XXXXXXXX слишком уникальая сигнатура :)
     
  15. Guest

    Guest Guest

    Публикаций:
    0
    А как конкретно ты это делаешь, через CreateFile? Код уже тестил?
     
  16. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    im1111 ну через NtOpenFile мы ж всетакие в r0 ;) код тестил на XP SP2, 2000 SP4, щас доставлю 2003 SP2 и проверю там)) хотя работать должно :)
     
  17. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    k3internal

    Тада вопрос. Как определить что есть ядро? Хоть базу, хоть имя - не важно.

    Имеем следующее:

    1. Номер следования может быть любым.
    2. Имя образа может быть любым.
    3. Функции могут быть перехвачены заменой адреса в SDT.

    Как искать оригинальные адреса?

    Nouzui
    +1 Очень симпатичен Ваш подход к программированию. Аккуратно.
     
  18. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    IceFire искать KiServiceTable по сигнатуре... а вот номер следования в нормальной винде всегда первая, если рассматривать другие случаи.... ну тогда вообще может и другое чтото не работать, т.к. чужая дровина и не такое испоганить может :)
     
  19. agent007

    agent007 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    166
    в общем мой код по восстановлению SDT пашет на XP sp2, 2k sp4, 2k3 sp2 ...
     
  20. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Вопрос....

    Почему не все системные сервисы (которых для 2600 билда ровно 0x11B) есть в директории экспорта ntoskrnl.exe?

    А то была идея восстанавливать SDT, получая оригинальные адреса из директории экспорта, складывая с базой загрузки ядра.