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

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

  1. IceFire

    IceFire New Member

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

    Сделал
    Код (Text):
    1. TempVector|=0x100
    .

    Не помогло. Все еще C000000D.
     
  2. Clerk

    Clerk Забанен

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

    IceFire New Member

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

    Подскажи, пожалуйста, что ты имел ввиду вот здесь:

    Код (Text):
    1. ULONG TempVector = HalGetInterruptVector (Internal, 0, 0, 0, &Irql, &Affinity);
    Почему 3 и 4 параметры - нули? В MSDN прочитал

    Просто я поиграл с этими параметрами и поставил их равными 7. После чего HalGetInterruptVector вернул:

    TempVector=0x37, Irql = 0x14, Affinity = 1

    и IoConnectInterrupt вернул STATUS_SUCCESS.
     
  4. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Да, еще хотел спросить. Если поле DispatchCode объекта KINTERRUPT недокументировано, как обратиться к нему? на

    Код (Text):
    1. DbIntObj->DispatchCode
    компилер ругается C2037.
     
  5. IceFire

    IceFire New Member

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

    Все-таки, почему в HalGetInterruptVector стоят нули?
     
  6. IceFire

    IceFire New Member

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

    Попробовал заменить адрес обработчика Sysenter. Вот код:

    Код (Text):
    1. #include <ntddk.h>
    2.  
    3. #define DEBUG
    4.  
    5. #ifdef DEBUG
    6.   #define DPRINT DbgPrint
    7. #else
    8.   #define DPRINT
    9. #endif
    10.  
    11. #define KINTERRUPT_DISPATCH_CODES       106
    12.  
    13.  typedef struct _KINTERRUPT
    14. {
    15.      CSHORT Type;
    16.      CSHORT Size;
    17.      LIST_ENTRY InterruptListEntry;
    18.      PKSERVICE_ROUTINE ServiceRoutine;
    19.      PVOID ServiceContext;
    20.      KSPIN_LOCK SpinLock;
    21.      ULONG TickCount;
    22.      PKSPIN_LOCK ActualLock;
    23.      PKINTERRUPT_ROUTINE DispatchAddress;
    24.      ULONG Vector;
    25.      KIRQL Irql;
    26.      KIRQL SynchronizeIrql;
    27.      BOOLEAN FloatingSave;
    28.      BOOLEAN Connected;
    29.      CCHAR Number;
    30.      BOOLEAN ShareVector;
    31.      KINTERRUPT_MODE Mode;
    32.      ULONG ServiceCount;
    33.      ULONG DispatchCount;
    34.      ULONG DispatchCode[KINTERRUPT_DISPATCH_CODES];
    35. } KINTERRUPT, *PKINTERRUPT;
    36.  
    37. PKINTERRUPT DbIntObj;
    38. ULONG CR0Reg;
    39. ULONG OldSyscall;
    40. ULONG NewSyscall;
    41.  
    42. //--------------------------------------------------------
    43.  
    44. void SetXpSyscallHook()
    45. {
    46.     __asm
    47.     {
    48.         pushad
    49.         mov ecx, 0x176
    50.         rdmsr
    51.         mov OldSyscall, eax
    52.         mov eax, NewSyscall  //!!!
    53.         xor edx, edx
    54.         wrmsr
    55.         popad
    56.     }
    57. }
    58.  
    59. void DeleteXpSyscallHook()
    60. {
    61.     __asm
    62.     {
    63.         pushad
    64.         mov ecx, 0x176
    65.         mov eax, OldSyscall
    66.         xor edx, edx
    67.         wrmsr
    68.         xor eax, eax
    69.         mov OldSyscall, eax
    70.         popad
    71.     }
    72. }
    73. //--------------------------------------------------------
    74. void ClearInt()
    75. {
    76. __asm
    77.     {
    78.         cli                    
    79.         mov eax, cr0
    80.         mov CR0Reg,eax
    81.         and eax,0xFFFEFFFF      
    82.         mov cr0, eax
    83.     }
    84. }
    85.  
    86. void SetInt()
    87. {
    88. __asm
    89.     {
    90.         mov eax, CR0Reg    
    91.         mov cr0, eax            
    92.         sti                    
    93.     }
    94. }
    95. //--------------------------------------------------------
    96. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    97. {
    98.     if (DbIntObj)
    99.         {
    100.                 ClearInt();
    101.                 DeleteXpSyscallHook();
    102.                 IoDisconnectInterrupt (DbIntObj);
    103.                 SetInt();
    104.         }
    105.    
    106.     DPRINT("Driver unloaded \n");
    107.     return;
    108. }
    109. //----------------------------------------------------------
    110. BOOLEAN DbgIntBreak(
    111.         PKINTERRUPT InterruptObject,
    112.         PVOID Context
    113.         )
    114. {
    115.         DbgPrint("Here");
    116. //        __asm jmp OldSyscall;
    117.         return FALSE;
    118. }
    119. //----------------------------------------------------------
    120.  
    121. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    122.                      IN PUNICODE_STRING RegistryPath)
    123. {
    124. //----------------------------------------------------------
    125.     NTSTATUS Status;
    126.     KIRQL Irql;
    127.     KAFFINITY Affinity;
    128.    
    129.     ULONG Irq = 7;
    130.    
    131.     ULONG TempVector  = HalGetInterruptVector(Internal, 0, Irq, Irq, &Irql, &Affinity);
    132.  
    133.     DbgPrint("TempVector = %x, Irql = %x, Affinity = %x\n", TempVector, Irql, Affinity);
    134.  
    135.     Status = IoConnectInterrupt (
    136.                 &DbIntObj,
    137.                 DbgIntBreak,
    138.                 NULL,
    139.                 NULL,
    140.                 TempVector,
    141.                 Irql,
    142.                 Irql,
    143.                 Latched,
    144.                 TRUE,
    145.                 Affinity,
    146.                 FALSE
    147.                 );
    148.  
    149.      DbgPrint("IoConnectInterrupt %x\n", Status);
    150.  
    151.     if (NT_SUCCESS(Status))
    152.         {
    153.                 DbgPrint("ADDRESS KINTERRUPT::DispatchCode: %x\n", DbIntObj->DispatchCode);
    154.                 DbgPrint("Start hooking...");
    155.                 ClearInt();
    156.                 NewSyscall=(ULONG)(DbIntObj->DispatchCode);
    157.                 SetXpSyscallHook();
    158.                 SetInt();
    159.                
    160.                 DbgPrint("OldSyscall: %x\n", OldSyscall);
    161.                 DbgPrint("Hooking complete...");                
    162.         }
    163.  
    164. //----------------------------------------------------------------
    165.  
    166.     DriverObject->DriverUnload = DriverUnload;
    167.  
    168.     return STATUS_SUCCESS;
    169. }
    В итоге ничего не получилось, ребут. Я думаю, это произошло из-за того, что не вызван оригинальный обработчик Sysenter из MSR. А как его правильно вызвать? И когда следует понизить IRQL?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Они обозначают тип шины Internal, шину 0 и bus interupt level 0.
    У меня работало. Какая ОС? Хотя на самом деле значения этих параметров не важны. Их можно даже перебирать в цикле ;DD пока не вернется валидный вектор.

    Ха! Значит,сисентер подменять обработчик можно, а прерывания уже палевно... Дожили.
    Может ему это для легального совершенно логгера сисколов.

    Можно попробовать после этого кода проставить Irql = 0; перед вызовом IoConnectInterrupt.
    А можно DbgIntBreak начать с KfLowerIrql(PASSIVE_LEVEL) и закончить соответствующим Raise на старый уровень. (больше никогда так не делайте! :))
    Вообще, надо посмотреть код DispatchCode, я уже не помню, что там :lol:

    Но вообще, само собой, вызывать оригинальный обработчик нужно. Но для этого придется попотеть - он будет создавать KTRAP_FRAME, а он у нас уже создан в DispatchCode. Простой джамп не пойдет!

    ПС. А DbgPrint'енное сообщение-то выводится?
    И вообще что за ребут. Должно зависать. Хм. Потрейси в вмваре+виндбг
     
  8. IceFire

    IceFire New Member

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

    WXP SP2 2600 on MS Virtual PC 2007

    Валидный вектор нашел.
    Да! Я не малвару пишу, я говорил уже об этом.

    ...и как? =)

    Нет. Ребут мгновенно.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Короче, я сегодня очень добрый. Я написал за тебя весь код)
    Драйвер хукает сисентер моим способом и пишет в лог \SystemRoot\syscalls.log все системные вызовы.
    Надолго не запускай - лог очень быстро растет. Буквально за полминуты вырос на 9 мегабайт.

    Исходник в аттаче.

    Если ест вопросы по коду - спрашивай.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Диспатч код напрямую юзать нельзя, как оказалось (я забыл). Обработка сисентер и прерываний отличается. При входе в прерывания процессор сохраняет на стеке eflags,cs,eip и, если произошла смена привилегий, тогда еще и ss,esp. При входе в сисентер такого нет.
    Поэтому обработчик сисентер ставится на свой стаб, который загружает esp = KTSS.Esp0 и пушает на стек все эти дела. Потом вызывает DispatchCode.
    DispatchCode тоже напрямую юзать не стоит, поскольку он
    1) вызывает KiInterruptDispatch, которая повышает IRQL,а это нам не нужно
    2) не сохраняет значение EAX при вызове сисентер, которое потребуется нам как номер сискола.
    Поэтому JMP KiInterruptDispatch инструкция в DispatchCode заменяется на JMP new_KiInterruptDispatch, а своя new_KiInterruptDispatch делает STI, пушает eax и вызывает SysenterServiceRoutine. После возврата она чекает al (возвращаемое значение из SysenterServiceRoutine) и трактуется:
    если FALSE - тогда подменяется KTRAP_FRAME::Eip на адрес KiFastCallEntry и KTRAP_FRAME::Cs на 8 и потом вызывается Kei386EoiHelper. Управление передается на системный обработчик (косвенно)
    если TRUE - тогда просто вызывается Kei386EoiHelper. управление уйдет в юзермод на KiFastSystemCallRet.

    Вроде расписал подробно..
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    А кто в мср обработчик подменяет, это только автору этого топика нужно. Вы не ответили на вопрос в #42, если легально то зачем эти манипуляции с прерываниями и всю остальную нестабильную в большинстве случаев лабуду нагромождать, тупо записать джамп на обработчик делов то. Снимется также как и замена адреса в IA32_SYSENTER_EIP, про шлюзы аналогично.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Кстати я подумал, если считаешь что формирование регистровых фреймов сложной задачей(всегото несколько смещений и адресов дизасмом найти), то можно в принципе сделать так.
    - Выделяем пул для обработчика.
    - Трассируем полностью KiFastCallEntry, либо KiSystemService, не раскрывая процедуры. Либо что сложнее использовать хороший дизассемблер.
    - Копируем инструкции в выделенный пул, с учётом поправки смещений.
    - Трассируем все ветвления, задача не настолько сложная.
    В конце получим копию обработчика в нашем пуле. Это в общих чертах, нужно есчо продумать механизм.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну да, когда я писал я понял, что проще сплайсить KiSystemServiceRepeat =\
     
  14. IceFire

    IceFire New Member

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

    Спасибо за помощь!
     
  15. IceFire

    IceFire New Member

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

    Вот интересно, если ее сплайсить, треп-фрейм уже будет создан на момент ее вызова?
    В новом обработчике можно сразу делать полезную работу, или что-то еще нужно?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да, конечно будет создан.
     
  17. IceFire

    IceFire New Member

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

    ...и, в обработчике сплайса, можно сразу делать то, что нужно?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну в принципе да.
     
  19. IceFire

    IceFire New Member

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

    Сделал сплайс:

    Код (Text):
    1. #include <ntddk.h>
    2. #include "OpCodeSize.h"
    3.  
    4. #define DEBUG
    5.  
    6. #ifdef DEBUG
    7.   #define DPRINT DbgPrint
    8. #else
    9.   #define DPRINT
    10. #endif
    11.  
    12. #pragma pack(push,2)
    13.  
    14. typedef struct _Idt
    15. {
    16.     USHORT Size;
    17.     ULONG  Base;
    18. } TIdt;
    19.  
    20. typedef struct _IDT_DESCRIPTOR {
    21.     USHORT LowPartOffset;
    22.     USHORT Selector;    
    23.     USHORT Flags;        
    24.     USHORT HighPartOffset;
    25. } IDT_DESCRIPTOR, *PIDT_DESCRIPTOR;
    26.  
    27. typedef UCHAR (BYTE);
    28. typedef BYTE* PBYTE;
    29. typedef USHORT (WORD);
    30. typedef WORD* PWORD;
    31. typedef ULONG (DWORD);
    32. typedef DWORD* PDWORD;
    33.  
    34. ULONG       CR0Reg;  
    35. ULONG       Trap2eOffset=0, Old2eOffset=0, KiSSRAddr=0;
    36. PBYTE       Trap2ePointer, KiSSRPointer, pMovedKSSRCode;
    37. WORD        Trap2eSelector;
    38. DWORD       SegDescBase;
    39. BYTE        uOrigKSSRHead[8];
    40.  
    41.  
    42. //--------------------------------------------------------
    43. void ClearInt()
    44. {
    45. __asm
    46.     {
    47.         cli                     // запрещаем прерывания
    48.         mov eax, cr0
    49.         mov CR0Reg,eax
    50.         and eax,0xFFFEFFFF      // сбросить WP bit
    51.         mov cr0, eax
    52.     }
    53. }
    54.  
    55. void SetInt()
    56. {
    57. __asm
    58.     {
    59.         mov eax, CR0Reg    
    60.         mov cr0, eax            // востановить содержимое CR0
    61.         sti                     // разрешаем прерывания
    62.     }
    63. }
    64. //--------------------------------------------------------
    65. //========================================================
    66.  
    67.  
    68. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    69. {
    70.   __asm{
    71.     cli
    72.     mov  eax,cr0
    73.     and  eax,not 10000h
    74.     mov  cr0,eax
    75.   }
    76.  
    77.   memcpy((PVOID)KiSSRAddr,uOrigKSSRHead,8);
    78.  
    79.    __asm{
    80.     mov  eax,cr0
    81.     or  eax,10000h
    82.     mov  cr0,eax
    83.     sti
    84.   }
    85.   ExFreePool(pMovedKSSRCode);
    86.  
    87.   DPRINT("--------------------Driver unloaded--------------------");
    88.   return;
    89. }
    90.  
    91. __declspec(naked) void MyKSSRFunction(void)
    92. {
    93.     __asm {
    94.         pop edi
    95.         pushad
    96.     }
    97.     __asm {
    98.         popad
    99.         jmp pMovedKSSRCode
    100.     }
    101. }
    102.  
    103. VOID SetHook()
    104. {
    105.     //This function hooks KiSystemServiceRepeat
    106.     UCHAR  cHookCode[8] = { 0x57,          //push edi      
    107.                             0xBF,0,0,0,0,  //mov  edi,0000
    108.                             0xFF,0xE7};    //jmp  edi
    109.         UCHAR  JmpCode[]={0xE9,0,0,0,0};      //jmp near, relative
    110.  
    111.     int    nCopyLen = 0;
    112.         int    nPos = 0;
    113.     int    i=0;
    114.     PBYTE  pMyKSSRFunction;
    115.  
    116.     nPos = KiSSRAddr;
    117.  
    118.     while(nCopyLen<8)
    119.     {
    120.         nCopyLen += GetOpCodeSize((PVOID)nPos);  
    121.         DPRINT("GetOpCodeSize said: %#0x", GetOpCodeSize((PVOID)nPos));
    122.         nPos = KiSSRAddr + nCopyLen;
    123.     }
    124.     DPRINT("Bytes to copy: %#0x", nCopyLen);
    125.  
    126.     if ((nCopyLen<20) & (nCopyLen>0))
    127.     {
    128.         pMovedKSSRCode = ExAllocatePool(NonPagedPool,nCopyLen+10);
    129.         memcpy(uOrigKSSRHead,(PVOID)KiSSRAddr,8);
    130.         for (i=0;i<8;i++)
    131.             DPRINT("Saved bytes: %#0x", uOrigKSSRHead[i]);
    132.  
    133.         *((ULONG*)(JmpCode+1)) = (KiSSRAddr + nCopyLen) -
    134.             ((ULONG)pMovedKSSRCode + nCopyLen)- 5;  
    135.  
    136.         DPRINT("KiSSRAddr + nCopyLen addr: %#0x", (DWORD)(KiSSRAddr + nCopyLen));
    137.         DPRINT("pMovedKSSRCode + nCopyLen addr: %#0x", (DWORD)(pMovedKSSRCode + nCopyLen));
    138.        
    139.         DPRINT("Jmp offset: %#0x", (DWORD)(JmpCode+1));
    140.  
    141.             memcpy(pMovedKSSRCode,(PVOID)KiSSRAddr,nCopyLen);  
    142.         memcpy((PVOID)(pMovedKSSRCode + nCopyLen),JmpCode,5); //Copy jmp instruction
    143.  
    144.         *((ULONG*)(cHookCode+2)) = (ULONG)MyKSSRFunction;
    145.  
    146.         DPRINT("Saved KSSR code:0x%08X",pMovedKSSRCode);
    147.         DPRINT("MyKSSRFunction :0x%08X",MyKSSRFunction);
    148.  
    149.         DPRINT("======");
    150.         for (i=0;i<8;i++)
    151.             DPRINT("cHookCode: %#0x", cHookCode[i]);
    152.         DPRINT("======");
    153.        
    154.         pMyKSSRFunction=(PBYTE)MyKSSRFunction;
    155.  
    156.         for (i=0;i<6;i++)
    157.             DPRINT("MyKSSRCode: %#0x", *(pMyKSSRFunction+i));
    158.         DPRINT("======");
    159.  
    160.         for (i=0;i<(nCopyLen+5);i++)
    161.             DPRINT("MovedKSSRCode: %#0x", *(pMovedKSSRCode+i));
    162.         DPRINT("======");
    163.  
    164.       __asm{
    165.                 cli
    166.             mov  eax,cr0
    167.             and  eax,not 10000h
    168.             mov  cr0,eax
    169.         }
    170.  
    171.       memcpy((PVOID)KiSSRAddr,cHookCode,8);
    172.  
    173.       __asm{
    174.             mov  eax,cr0
    175.                         or  eax,10000h
    176.             mov  cr0,eax
    177.             sti
    178.        }
    179.     }
    180.     else
    181.     {
    182.         DPRINT("Couldn't splice KiSystemServiceRepeat. Sorry :(");
    183.         return;
    184.     }
    185. }
    186.  
    187. VOID GetKSSRAddress()
    188. {
    189.     TIdt Idt;
    190.     TGDT GDT;
    191.     PTGDTEntry SegDesc;
    192.     PIDT_DESCRIPTOR Desc2e;
    193.     int i=0, j=0;
    194.    
    195.     ClearInt();
    196.  
    197.     __asm
    198.     {
    199.         sidt [Idt]
    200.     }
    201.  
    202.     SetInt();    
    203.  
    204.     DPRINT("Idt.Base: %#0x",Idt.Base);
    205.     DPRINT("Idt.Limit: %#0x",Idt.Size);
    206.    
    207.     Desc2e=(PIDT_DESCRIPTOR)(Idt.Base+0x2e*8);
    208.         DPRINT("Desc2e: %#0x", Desc2e);
    209.     Trap2eOffset=Desc2e->HighPartOffset;
    210.     Trap2eOffset=Trap2eOffset<<16;
    211.     Trap2eOffset+=Desc2e->LowPartOffset;
    212.     DPRINT("2E Int routine offset: %#0x", Trap2eOffset);
    213.    
    214.     //-------
    215.     Trap2ePointer=(PVOID)Trap2eOffset;
    216.    
    217.     for (i=0;i<=0x200;i++)
    218.     {
    219.         if (*((PWORD)(Trap2ePointer+i))==0xE9FB)
    220.         {
    221.             DPRINT("---------BELOW HERE---------");
    222.             KiSSRAddr=*(PDWORD)(Trap2ePointer+i+2);
    223.             DPRINT("KiSystemServiceRepeat offset: %#0x", KiSSRAddr);
    224.             KiSSRAddr+=(DWORD)(Trap2ePointer+i+6); // 1 byte for sti, 1 byte for jmp (E9) and 4 bytes for rel32 address
    225.             DPRINT("KiSystemServiceRepeat addr: %#0x", KiSSRAddr);
    226.             KiSSRPointer=(PVOID)KiSSRAddr;
    227.             for (j=0;j<=0x10;j++)
    228.                 DPRINT("%#0x", *((PBYTE)KiSSRPointer+j));
    229.             DPRINT("----------------------------");
    230.             break;
    231.         }
    232.         DPRINT("%#0x", *((PBYTE)Trap2ePointer+i));
    233.     }
    234.     //-------  
    235. }
    236.  
    237. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    238.                      IN PUNICODE_STRING RegistryPath)
    239. {
    240.     DPRINT("--------------------Driver loaded--------------------");
    241.     DriverObject->DriverUnload = DriverUnload;
    242.     DPRINT("Start Detecting...");
    243.     GetKSSRAddress();
    244.     if (KiSSRAddr)
    245.         SetHook();
    246.     else
    247.     {
    248.         DPRINT("Unable to obtain KiSystemServiceRepeat address. Sorry :(");
    249.         return STATUS_SUCCESS;
    250.     }
    251.  
    252.     DPRINT("Detecting complete...");
    253.  
    254.     return STATUS_SUCCESS;
    255. }
    Проблема в следующем: вот так - все работает, но стоит вставить DbgPrint в MyKSSRFunction - система зависает.

    Посмотри, пожалуйста, может подскажешь. OpCodeSize.h был уже в этой ветке выше.

    Потресить под VM не могу - во-первых, под VM неправильно определяется адрес KiSystemService (не понял пока почему), во-вторых, этот сигнатурный поиск под ядро на VM не прокатывает.
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не понятно причём тут IDT. Вобще это на асме пишут, а нотификация дебуггера - в ядра это верный способ словить бсод, достаточно Int3, дабы всплыл отладчик при исполнениии кода.
    Под варей корректный адрес обработчика в мср, все остальные проблемы связаны с незнанием среды, на которой код создаётся. А ядро на варе идентично реальному, да обработка исключений не корректна, виртуальная машина обрабатывает некоторые прежде. Вобще в ядре код должен быть соответствующий, это не юзермод гдже можно извращаться как угодно, темболее на столь низком уровне.