SEH в R-0

Тема в разделе "WASM.WIN32", создана пользователем ProgramMan, 27 мар 2005.

  1. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Кто может подсказать в чём ошибка в данном коде:
    Код (Text):
    1.  
    2. format PE DLL native 4.0 at 10000h
    3. entry main
    4. include '%include%\win32a.inc'
    5. include 'Driver.mac'
    6. section '.text' code readable writeable executable notpageable
    7. aException08xAt db 0ah,0dh,'Exception: %08X at address: %08X',0ah,0dh,0
    8. seh_adr          dd 0
    9. seh_ebp          dd 0
    10. seh_esp          dd 0
    11. ;*******************************************MAIN********************** *****
    12. proc main,pDriverObject,pDriverPath
    13. int3
    14. ;pushad
    15. ;pushfd
    16. push    seh_proc_2
    17. push    dword[fs:0]
    18. mov     [fs:0], esp
    19. mov     [seh_adr],EXTR
    20. mov     [seh_ebp],ebp
    21. mov     [seh_esp],esp
    22. call    test1
    23.  
    24. EXTR:
    25. int3
    26. pop     dword[fs:0]
    27. add     esp, 4
    28. ;popfd
    29. ;popad
    30. mov eax,STATUS_DEVICE_CONFIGURATION_ERROR
    31. return
    32. endp
    33. ;********************************************************************* *************
    34. seh_proc_2:
    35. push    ebp
    36. mov     ebp, esp
    37. mov     eax, [ebp+8]
    38. push    dword[eax+0Ch]
    39. push    dword[eax]
    40. push    aException08xAt
    41. call    [DbgPrint]
    42. add     esp, 0Ch
    43. lea     eax, [seh_adr]
    44. push    dword[eax]
    45. push    dword[eax+4]
    46. push    dword[eax+8]
    47. mov     eax, [ebp+10h]
    48. pop     dword[eax+0B4h]
    49. pop     dword[eax+0C4h]
    50. pop     dword[eax+0B8h]
    51. xor     eax, eax
    52. leave
    53. retn
    54. ;********************************************************************* *************
    55. proc test1
    56. xor     eax, eax
    57. mov     eax, [eax]
    58. retn
    59. endp
    60. ;*******************************************IMPORT******************** **********
    61. section '.idata' import data readable writeable
    62.         syslibrary ntoskrnl,"ntoskrnl.exe"
    63.        include 'ntoskrnl.inc'
    64. ;*********************************************
    65. mov eax,main
    66. ;*********************************************
    67. section '.reloc' data fixups readable discardable
    68.  




    По ходу где то со стеком не расчитал, на метке EXTR стек уже готов к выполнению retn.
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    R-0 ни при чём, ты перепутал EBP и ESP
    Код (Text):
    1.  
    2.     DWORD   Ebp; // [eax+8] [seh_esp]
    3.     DWORD   Eip; // [eax]   [seh_adr]
    4.  
    5.     DWORD   Esp; // [eax+4] [seh_ebp]
    6.  
     
  3. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    S_T_A_S_, огромное спасибо.

    Я ведь запарился ошибку искать :)))

    Теперь всё работает.
     
  4. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Интересная фишка.. почему то не всегда ставится seh фрейм...

    Пробовал ставить в обработчике NtCreateFile/NtOpenFile (перехват через KeServiceDescriptorTable), SI пишет что фрейм установлен, но при mov eax,[eax](eax=0) наблюдаем BDS. Или опять у меня баги...
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Может быть дело в IRQL ?
     
  6. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    нее... вот каркас функции перехватчика:
    Код (Text):
    1.  
    2. ;*******************************************HOOK********************** *********
    3. HOOK1:;*********************createfile********************
    4. ;int3
    5. push    ebp
    6. mov     ebp, esp
    7. cli
    8. pushad
    9. pushfd
    10.  
    11. mov eax,[ret_createfile]
    12. mov [returnh],eax
    13.  
    14. jmp HOOK
    15.  
    16. HOOK2:;*********************openfile***********************
    17. ;int3
    18. push    ebp
    19. mov     ebp, esp
    20. cli
    21. pushad
    22. pushfd
    23.  
    24. mov eax,[ret_openfile]
    25. mov [returnh],eax
    26.  
    27. jmp HOOK
    28. ;*******************************************HOOK********************** *********
    29. HIGH_PRIORITY = 1Fh
    30. HOOK:
    31.  
    32. mov [BuffAdr],edx
    33. ; установим максимальный приоретет потока
    34. invoke KeGetCurrentThread
    35. mov [KTread],eax
    36. invoke KeQueryPriorityThread,eax
    37. mov [KPTread],eax
    38. invoke KeSetPriorityThread,[KTread],HIGH_PRIORITY
    39. ;int3
    40. ;****** установим seh фрейм
    41. push    seh_proc
    42. push    dword[fs:0]
    43. mov     [fs:0], esp
    44. mov     [seh_adr],ERRM
    45. mov     [seh_ebp],ebp
    46. mov     [seh_esp],esp
    47.  
    48. int3
    49.  
    50. nop
    51. ;xor eax,eax
    52. ;mov eax,[eax]
    53. nop
    54.  
    55. ERRM:
    56. ;******* снимим seh фрейм
    57. pop     dword[fs:0]
    58. add     esp, 4
    59. ;************************
    60. ; востановим приоретет потока
    61. invoke KeSetPriorityThread,[KTread],[KPTread]
    62. popfd
    63. popad
    64. sti
    65. mov     esp, ebp
    66. pop     ebp
    67. jmp [returnh]
    68.  


    полный вариант в аттаче

    [​IMG] _2058391945__spc_test.asm
     
  7. je_

    je_ New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    143
    сволочь m$ делает BSOD в INT_0Eh хандлере;



    IF PageFault under CLI

    THEN do BSOD



    так_шта:

    или всегда пробуем memory под STI;

    или патчим INT_0Eh handler..
     
  8. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Ок, фишку понял, всё заработало.

    Всем спасибо.