Как вызвать KiSystemService?

Тема в разделе "WASM.BEGINNERS", создана пользователем IceFire, 9 май 2009.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Подскажите, если я вызову напрямую KiSystemService (тупо call из драйвера, получив ее адрес из MSR), куда вернется управление после того, как KiSystemService отработает? Непосредственно в функцию драйвера, из которой она была вызвана? Или нет?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В мср KiFastCallEntry, это шлюзе прерывания указатель на KiSystemService.
    KiSystemService вызывается из стубов в ядре, никаких проблем с вызовом нет, так как прерывание сохраняет Cs, Ss, Esp, Eip которые нужны для возврата, тоесть это параметры функции. Загружаем ядреные селекторы и можем свободно вызывать, возврат на адре который мы укажем(разумеется если сервис не изменяет его). PreviousMode вычисляется самой функцией на основе кодового селектора, сохраняется Fs.
    KiFastCallEntry из ядра не заюзать. В сегментные регистры по возврату будут перезагружены юзермодные селекторы, возврат на фиксированный в разделяемой памяти адрес и пр., попытка вызвать скорее всего приведёт к бсоду, во первых что PCR будет недоступной(в Fs мусор на PCR ссылающемся).
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Блина намазал, исправьте там.
     
  4. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    В шлюзе 2E? Кстати, имея базу IDT, для позиционирования на определенный дескриптор нужно умножать на его номер или на (его номер+1)? есть ли нулевой дескриптор?
     
  5. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Вызвал. Отработало, вроде. Управление назад не вернулось, в юзермоде выбивает активный процесс. БСОДа нет.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ну да, управление в юзермод передаётся по возврату из KiFastCallEntry, селекторы ведь юзермодные. Но смотря откуда вызов. Если место не критическое, то упасть не должно.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Если ты имеешь в виду KiFastCallEntry, то может быть и бсод, а может и нет.

    А KiSystemService она напрямую каллами обычно и дергается из Zw* функций.
     
  8. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Спасибо за консультации, перехватил KiFastCallEntry. Код:

    Код (Text):
    1. void __declspec(naked) NewSyscall()
    2. {
    3.     DWORD Reax;
    4.     __asm
    5.     {
    6.         pushad
    7.         pushfd
    8.         push fs
    9.                 push eax
    10.                 pop Reax
    11.     }
    12.     DPRINT("Service No.: %#x", Reax);
    13.     __asm
    14.     {
    15.         pop fs
    16.         popfd
    17.         popad
    18.         jmp OldSyscall
    19.     }
    20. }
    21.  
    22. void SetXpSyscallHook()
    23. {
    24.     __asm
    25.     {
    26.         pushad
    27.         mov ecx, 0x176
    28.         rdmsr
    29.         mov OldSyscall, eax
    30.         mov eax, NewSyscall
    31.         xor edx, edx
    32.         wrmsr
    33.         popad
    34.     }
    35. }
    36.  
    37. void DeleteXpSyscallHook()
    38. {
    39.     __asm
    40.     {
    41.         pushad
    42.         mov ecx, 0x176
    43.         mov eax, OldSyscall
    44.         xor edx, edx
    45.         wrmsr
    46.         xor eax, eax
    47.         mov OldSyscall, eax
    48.         popad
    49.     }
    50. }
    Итого имеем: вот именно такой код выносит систему на ребут. Но если написать вот так:
    Код (Text):
    1.     DWORD Reax;
    2.     __asm
    3.     {
    4.         pushad
    5.         pushfd
    6.         push fs
    7.     }
    8.     DPRINT("Here");
    То все работает нормально.

    Как можно безопасно получить номер вызываемого системного сервиса? Спасибо.
     
  9. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Ума не приложу почему вывод eax не работает. Я понимаю, что KiFastCallEntry вызывается из пользовательского режима и там же регистры и заполняются. Но, что, регистры меняют значение при передаче управления этому сервису? Я где-то туплю, подскажите, пожалуйста.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В функции naked если ты не опрделелил ebp, то обращение к локальной переменной будет смотреть вникуда.
    Потому, что компилер посчитает, что кадр стека есть и будет адресовать переменную через ebp.
    Тебе нужно либо заполнить ebp нужным образом (mov ebp, esp / sub esp, 4), либо отказаться от локальной переменной и сделать что-то в роде
    Код (Text):
    1. ..
    2. push eax   ; service number
    3. push szFormat
    4. call DbgPrint
    5. add esp, 8  ; _cdecl
    6. ..
    где szFormat - глобальная перемееная char *szFormat = "Service No. %lx";
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Сказали ведь что из ядра KiFastCallEntry не юзабельно, изучать trap.asm
    Зачем это вообще нужно ?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Ну видать ему перехват нужен.. фиг поймешь)
     
  13. IceFire

    IceFire New Member

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

    Уважаемые, спасибо за желание помочь.

    Great

    Сделал как ты сказал - вставил пролог (mov ebp, esp / sub esp, 4), переменную сделал глобалом. Стало лучше - теперь не просто ребут, а таки бсод. ((

    Clerk

    Мне нужно перехватить KiFastCallEntry и получить номер вызываемого системного сервиса. Все, задача на этом заканчивается.


    Если не трудно, подскажите, где еще можно поковырять.
     
  14. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Спасибо за помощь, решение найдено на каком-то китайском сервере. Если кому интересно:

    sysenterhook.c
    Код (Text):
    1. #include<ntddk.h>
    2. #include "OpCodeSize.h"
    3.  
    4. ULONG uSysenter;
    5. UCHAR uOrigSysenterHead[8];
    6. PUCHAR pMovedSysenterCode;
    7. ULONG i;    
    8.  
    9. __declspec(naked) void MyKiFastCallEntry(void)
    10. {
    11.   __asm{
    12.           pop  edi    
    13.           mov  i, eax  
    14.   }
    15.   __asm{
    16.           pushad
    17.           push fs
    18.           push 0x30
    19.           pop fs
    20.   }
    21.  
    22.     DbgPrint("Get service ID:%X",i);
    23.  
    24.   __asm{
    25.           pop fs
    26.           popad  
    27.           jmp pMovedSysenterCode
    28.   }
    29.  
    30. }
    31. //////////////////////////////////////////////////////
    32. VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
    33. {  
    34.   __asm{
    35.     cli
    36.     mov  eax,cr0
    37.     and  eax,not 10000h
    38.     mov  cr0,eax
    39.   }
    40.  
    41.   memcpy((PVOID)uSysenter,uOrigSysenterHead,8);
    42.  
    43.   __asm{
    44.     mov  eax,cr0
    45.     or  eax,10000h
    46.     mov  cr0,eax
    47.     sti
    48.   }
    49.   ExFreePool(pMovedSysenterCode);
    50.   DbgPrint("Unload sysenterHook");
    51. }
    52. ////////////////////////////////////////////////////////
    53.  
    54. VOID HookSysenter()
    55. {
    56.   UCHAR  cHookCode[8] = { 0x57,          //push edi      
    57.                           0xBF,0,0,0,0,  //mov  edi,0000
    58.                           0xFF,0xE7};    //jmp  edi
    59.  
    60.   UCHAR  JmpCode[]={0xE9,0,0,0,0};      //jmp 0000
    61.  
    62.   int    nCopyLen = 0;
    63.   int    nPos = 0;
    64.  
    65.   __asm
    66.   {
    67.         mov ecx,0x176
    68.         rdmsr
    69.         mov uSysenter,eax  
    70.   }
    71.  
    72.   DbgPrint("sysenter:0x%08X",uSysenter);
    73.  
    74.   nPos = uSysenter;
    75.  
    76.   while(nCopyLen<8)
    77.   {
    78.     nCopyLen += GetOpCodeSize((PVOID)nPos);  
    79.     nPos = uSysenter + nCopyLen;
    80.   }
    81.  
    82.   DbgPrint("copy code lenght:%d",nCopyLen);
    83.  
    84.   pMovedSysenterCode = ExAllocatePool(NonPagedPool,20);
    85.  
    86.   memcpy(uOrigSysenterHead,(PVOID)uSysenter,8);
    87.  
    88.   *((ULONG*)(JmpCode+1)) = (uSysenter + nCopyLen) - ((ULONG)pMovedSysenterCode + nCopyLen)- 5;
    89.  
    90.   memcpy(pMovedSysenterCode,(PVOID)uSysenter,nCopyLen);
    91.   memcpy((PVOID)(pMovedSysenterCode + nCopyLen),JmpCode,5);
    92.  
    93.   *((ULONG*)(cHookCode+2)) = (ULONG)MyKiFastCallEntry;
    94.  
    95.   DbgPrint("Saved sysenter code:0x%08X",pMovedSysenterCode);
    96.   DbgPrint("MyKiFastCallEntry:0x%08X",MyKiFastCallEntry);
    97.  
    98.   __asm{
    99.     cli
    100.             mov  eax,cr0
    101.     and  eax,not 10000h
    102.     mov  cr0,eax
    103.   }
    104.  
    105.   memcpy((PVOID)uSysenter,cHookCode,8);
    106.  
    107.   __asm{
    108.     mov  eax,cr0
    109.             or  eax,10000h
    110.     mov  cr0,eax
    111.     sti
    112.   }
    113.  
    114. }
    115.  
    116. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
    117. {
    118.  
    119.   DbgPrint("Welcome to sysenterhook.sys");
    120.   DriverObject->DriverUnload = OnUnload;
    121.   HookSysenter();
    122.   return STATUS_SUCCESS;
    123. }
    OpCodeSize.h
    Код (Text):
    1. #define Naked   __declspec( naked )
    2.  
    3. ULONG MaskTable[518] =  
    4. {
    5.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    6.   0x00008000, 0x00008000, 0x00000000, 0x00000000,
    7.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    8.   0x00008000, 0x00008000, 0x00000000, 0x00000000,
    9.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    10.   0x00008000, 0x00008000, 0x00000000, 0x00000000,
    11.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    12.   0x00008000, 0x00008000, 0x00000000, 0x00000000,
    13.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    14.   0x00008000, 0x00008000, 0x00000008, 0x00000000,
    15.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    16.   0x00008000, 0x00008000, 0x00000008, 0x00000000,
    17.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    18.   0x00008000, 0x00008000, 0x00000008, 0x00000000,
    19.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    20.   0x00008000, 0x00008000, 0x00000008, 0x00000000,
    21.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    22.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    23.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    24.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    25.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    26.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    27.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    28.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    29.   0x00000000, 0x00000000, 0x00004000, 0x00004000,
    30.   0x00000008, 0x00000008, 0x00001008, 0x00000018,
    31.   0x00002000, 0x00006000, 0x00000100, 0x00004100,
    32.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    33.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    34.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    35.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    36.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    37.   0x00004100, 0x00006000, 0x00004100, 0x00004100,
    38.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    39.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    40.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    41.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    42.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    43.   0x00000000, 0x00000000, 0x00002002, 0x00000000,
    44.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    45.   0x00000020, 0x00000020, 0x00000020, 0x00000020,
    46.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    47.   0x00000100, 0x00002000, 0x00000000, 0x00000000,
    48.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    49.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    50.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    51.   0x00002000, 0x00002000, 0x00002000, 0x00002000,
    52.   0x00002000, 0x00002000, 0x00002000, 0x00002000,
    53.   0x00004100, 0x00004100, 0x00000200, 0x00000000,
    54.   0x00004000, 0x00004000, 0x00004100, 0x00006000,
    55.   0x00000300, 0x00000000, 0x00000200, 0x00000000,
    56.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    57.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    58.   0x00000100, 0x00000100, 0x00000000, 0x00000000,
    59.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    60.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    61.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    62.   0x00000100, 0x00000100, 0x00000100, 0x00000100,
    63.   0x00002000, 0x00002000, 0x00002002, 0x00000100,
    64.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    65.   0x00000008, 0x00000000, 0x00000008, 0x00000008,
    66.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    67.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    68.   0x00000000, 0x00000000, 0x00004000, 0x00004000,
    69.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    70.   0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
    71.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    72.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    73.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    74.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    75.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    76.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    77.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    78.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    79.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    80.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    81.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    82.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    83.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    84.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    85.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    86.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    87.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    88.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    89.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    90.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    91.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    92.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    93.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    94.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    95.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    96.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    97.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    98.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    99.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    100.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    101.   0x00002000, 0x00002000, 0x00002000, 0x00002000,
    102.   0x00002000, 0x00002000, 0x00002000, 0x00002000,
    103.   0x00002000, 0x00002000, 0x00002000, 0x00002000,
    104.   0x00002000, 0x00002000, 0x00002000, 0x00002000,
    105.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    106.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    107.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    108.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    109.   0x00000000, 0x00000000, 0x00000000, 0x00004000,
    110.   0x00004100, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
    111.   0x00000000, 0x00000000, 0x00000000, 0x00004000,
    112.   0x00004100, 0x00004000, 0xFFFFFFFF, 0x00004000,
    113.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    114.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    115.   0xFFFFFFFF, 0xFFFFFFFF, 0x00004100, 0x00004000,
    116.   0x00004000, 0x00004000, 0x00004000, 0x00004000,
    117.   0x00004000, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
    118.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    119.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    120.   0x00000000, 0x00000000, 0x00000000, 0x00000000,
    121.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    122.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    123.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    124.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    125.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    126.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    127.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    128.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    129.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    130.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    131.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    132.   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    133.   0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
    134.   0xFFFFFFFF, 0xFFFFFFFF
    135. };
    136.  
    137. Naked ULONG GetOpCodeSize_ASM_CODE(PVOID Start, PVOID Tlb)
    138. {
    139.   __asm{
    140.       pushad
    141.       mov   esi, [esp+24h]
    142.       mov   ecx, [esp+28h]
    143.       xor   edx, edx
    144.       xor   eax, eax
    145.     L005:
    146.       and   dl, 0F7h
    147.       mov   al, [ecx]
    148.       inc   ecx
    149.       or     edx, [esi+eax*4h]
    150.       test   dl, 8h
    151.       jnz L005
    152.       cmp   al, 0F6h
    153.       je L035
    154.       cmp   al, 0F7h
    155.       je L035
    156.       cmp   al, 0CDh
    157.       je L040
    158.       cmp   al, 0Fh
    159.       je L045
    160.     L019:
    161.       test   dh, 80h
    162.       jnz L052
    163.     L021:
    164.       test   dh, 40h
    165.       jnz L067
    166.     L023:
    167.       test   dl, 20h
    168.       jnz L057
    169.     L025:
    170.       test   dh, 20h
    171.       jnz L062
    172.     L027:
    173.       mov   eax, ecx
    174.       sub   eax, [esp+28h]
    175.       and   edx, 707h
    176.       add   al, dl
    177.       add   al, dh
    178.     L032:
    179.       mov   [esp+1Ch], eax
    180.       popad
    181.       retn
    182.     L035:
    183.       or     dh, 40h
    184.       test   byte ptr [ecx], 38h
    185.       jnz L019
    186.       or     dh, 80h
    187.       jmp L019
    188.     L040:
    189.       or     dh, 1h
    190.       cmp   byte ptr [ecx], 20h
    191.       jnz L019
    192.       or     dh, 4h
    193.       jmp L019
    194.     L045:
    195.       mov   al, [ecx]
    196.       inc   ecx
    197.       or     edx, [esi+eax*4h+400h]
    198.       cmp   edx, -1h
    199.       jnz L019
    200.       mov   eax, edx
    201.       jmp L032
    202.     L052:
    203.       xor   dh, 20h
    204.       test   al, 1h
    205.       jnz L021
    206.       xor   dh, 21h
    207.       jmp L021
    208.     L057:
    209.       xor   dl, 2h
    210.       test   dl, 10h
    211.       jnz L025
    212.       xor   dl, 6h
    213.       jmp L025
    214.     L062:
    215.       xor   dh, 2h
    216.       test   dh, 10h
    217.       jnz L027
    218.       xor   dh, 6h
    219.       jmp L027
    220.     L067:
    221.       mov   al, [ecx]
    222.       inc   ecx
    223.       mov   ah, al
    224.       and   ax, 0C007h
    225.       cmp   ah, 0C0h
    226.       je L023
    227.       test   dl, 10h
    228.       jnz L090
    229.       cmp   al, 4h
    230.       jnz L080
    231.       mov   al, [ecx]
    232.       inc   ecx
    233.       and   al, 7h
    234.     L080:
    235.       cmp   ah, 40h
    236.       je L088
    237.       cmp   ah, 80h
    238.       je L086
    239.       cmp   ax, 5h
    240.       jnz L023
    241.     L086:
    242.       or     dl, 4h
    243.       jmp L023
    244.     L088:
    245.       or     dl, 1h
    246.       jmp L023
    247.     L090:
    248.       cmp   ax, 6h
    249.       je L096
    250.       cmp   ah, 40h
    251.       je L088
    252.       cmp   ah, 80h
    253.       jnz L023
    254.     L096:
    255.       or     dl, 2h
    256.       jmp L023
    257.       retn
    258.     }
    259. }
    260.  
    261. ULONG GetOpCodeSize(PVOID Start)
    262. {
    263.   __asm
    264.   {
    265.     push Start
    266.     push offset MaskTable
    267.     call GetOpCodeSize_ASM_CODE
    268.     add   esp, 8      
    269.   }
    270. }
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Сразу сказал бы что перехватить нужно, а то юзать из ядра..
    Китайцы как обычно кроме тупо сплайснуть ничсего больше придумать не могут.)
     
  16. IceFire

    IceFire New Member

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

    Когда мы оказываемся в функции-перехватчике сплайснутого KiFastCallEntry, на каком стеке мы оказываемся? На DPC? И как переключиться на стек ядра?

    У меня возникла следующая проблема, думаю из-за этого. Из перехватчика вызываю ZwWriteFile, пытаюсь писать в уже созданный файл. Результат - NTSTATUS = 0xC0000008 (STATUS_INVALID_HANDLE). Хендл - глобал. Если напечатать его значение - оно валидно.
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А чем отличается стек DPC от стека ядра?
    Кодес в студию, догадки - при себе)
     
  18. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Код (Text):
    1.   OBJECT_ATTRIBUTES oa;
    2.   UNICODE_STRING fileName;
    3.   HANDLE hFile=0x00;
    4.   NTSTATUS ns=0x00;
    5.   IO_STATUS_BLOCK StatusBlock;
    6.   char buf[260];
    7.  
    8.   char oD=0x0D;
    9.   char oA=0x0A;
    10.  
    11.  
    12. void WriteServiceNumber(int num)
    13. {
    14.    
    15.     sprintf(buf,"%#x",num);
    16.     strncat(buf,&oD,1);
    17.         strncat(buf,&oA,1);
    18.  
    19.     DPRINT("Buf is: %s",buf);
    20.  
    21.     if (num==0x00db)
    22.     {
    23.         DPRINT("HANDLE is: %#x", hFile);
    24.     ns=ZwWriteFile(hFile,    <----STATUS_INVALID_HANDLE
    25.       NULL,
    26.       NULL,
    27.       NULL,
    28.       &StatusBlock,
    29.       buf,
    30.       strlen(buf),
    31.       0,
    32.       NULL
    33.       );
    34.     DPRINT("ZwWriteFile said (NTSTATUS): %#x",ns);
    35.     }
    36. }
    37.  
    38. NTSTATUS WriteStartLine()
    39. {
    40.     IO_STATUS_BLOCK StatusBlock;
    41.     NTSTATUS ns=0x00;
    42.  
    43.     KeQuerySystemTime(&dwCurrentTime);
    44.     ExSystemTimeToLocalTime(&dwCurrentTime,&dwLocalTime);
    45.     RtlTimeToTimeFields(&dwLocalTime,&fullTime);
    46.     DPRINT("-------- START: %d.%d.%d  %d:%d:%d --------",fullTime.Day,fullTime.Month,fullTime.Year,fullTime.Hour,fullTime.Minute,fullTime.Second);
    47.    
    48.     sprintf(szDate,"-------- START: %d.%d.%d  %d:%d:%d --------",fullTime.Day,fullTime.Month,fullTime.Year,fullTime.Hour,fullTime.Minute,fullTime.Second);
    49.     strncat(szDate,&oD,1);
    50.     strncat(szDate,&oA,1);
    51.     DPRINT("HANDLE HERE is: %#x", hFile);
    52.     ns=ZwWriteFile(hFile, <--- STATUS_SUCCESS
    53.       NULL,
    54.       NULL,
    55.       NULL,
    56.       &StatusBlock,
    57.       szDate,
    58.       strlen(szDate),
    59.       0,
    60.       NULL
    61.       );
    62.  
    63.     DPRINT("ZwWriteFile said (NTSTATUS): %#x",ns);
    64.     return ns;
    65. }
    66.  
    67. __declspec(naked) void MyKiFastCallEntry(void)
    68. {
    69.   __asm{
    70.           pop  edi    
    71.           mov  i, eax  
    72.   }
    73.   __asm{
    74.           pushad
    75.           push fs
    76.           push 0x30
    77.           pop fs
    78.   }
    79.  
    80.   if (i<=0x0116)
    81.   {
    82.       WriteServiceNumber(i);
    83.     //DbgPrint("Get service ID:%X",i);
    84.   }
    85.  
    86.   __asm{
    87.           pop fs
    88.           popad  
    89.           jmp pMovedSysenterCode
    90.   }
    91.  
    92. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
    93. {
    94.   WCHAR wszFileName[]=L"\\DosDevices\\c:\\MyLogs\\log8.txt";
    95.  
    96.   IO_STATUS_BLOCK StatusBlock;
    97.   NTSTATUS ns=0x00;
    98.  
    99.   DbgPrint("Welcome to sysenterhook.sys");
    100.   //-------------------------------------------------------------------
    101.   RtlInitUnicodeString(&fileName, wszFileName);
    102.  
    103.   InitializeObjectAttributes (
    104.     &oa,
    105.     &fileName,      
    106.     OBJ_CASE_INSENSITIVE,
    107.     NULL,
    108.     NULL
    109.     );
    110.  
    111.   DPRINT("fileName: %S", fileName.Buffer);
    112.  
    113.   ns=ZwCreateFile(&hFile,
    114.       FILE_APPEND_DATA,
    115.       &oa,
    116.       &StatusBlock,
    117.       0,  
    118.       FILE_ATTRIBUTE_NORMAL,
    119.       FILE_SHARE_READ | FILE_SHARE_WRITE ,  
    120.       FILE_OPEN_IF,
    121.       FILE_SYNCHRONOUS_IO_NONALERT,
    122.       NULL,
    123.       0);
    124.  
    125.       DPRINT("ZwCreateFile said (NTSTATUS): %#x",ns);
    126.  
    127.   WriteStartLine();
    128.  
    129.   strncat(Buffer,&oD,1);
    130.   strncat(Buffer,&oA,1);
    131.  
    132.   ns=ZwWriteFile(hFile,
    133.       NULL,
    134.       NULL,
    135.       NULL,
    136.       &StatusBlock,
    137.       Buffer,
    138.       strlen(Buffer),
    139.       0,
    140.       NULL
    141.       );
    142.  
    143.   DPRINT("ZwWriteFile said (NTSTATUS): %#x",ns);
    144.   //-------------------------------------------------------------------
    145.   DriverObject->DriverUnload = OnUnload;
    146.   HookSysenter();
    147.   return STATUS_SUCCESS;
    HookSysenter и OnUnload приведены выше. Я их не менял совсем.
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    и чему равен hFile ?
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Интересно что будет если выполнить такой код при установленном перехвате:
    Код (Text):
    1.     push fs
    2.     pop ds
    3.     mov eax,116h    ;NtYieldExecution ID
    4.     Call KiFastSystemCall
    Ну а для полноты картины код который позволит вызвать сервис в обход вашего перехвата, либо покажет голубой огонёк:
    Код (Text):
    1.     push EFLAGS_TF
    2.     popfd
    3.     sysenter