Импорт в драйвере

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

  1. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Помогите окончательно рабораться, как же работает импорт в драйвере. Как я понял, из всех структур импорта в одну секцию(например '.rdata') должны попасть только струтуры IMAGE_THUNK_DATA, на которые из каждого(для каждой библиотеки) IMAGE_IMPORT_DESCRIPTOR указывает поле FirstThunk. В другую секцию(например 'INIT') должны попасть все остальные структуры импорта(причем эта секция отбрасывается после загрузки). Следовательно в моем элементарном драйвере(на FASM) импорт имеет следующий вид:
    Код (Text):
    1. section '.rdata' readable notpageable
    2.  
    3. data 12    
    4.  
    5.   IAT_FOR_HAL:
    6. READ_PORT_UCHAR    dd rva szRead_port_uc
    7. WRITE_PORT_UCHAR   dd rva szWrite_port_uc
    8. HalMakeBeep        dd rva szHalmakebeep
    9.                    dd 0
    10.  
    11. end data
    12.  
    13. section 'INIT' import readable notpageable
    14.  
    15.         dd rva OriginalFirstThunk
    16.         dd 0
    17.         dd 0
    18.         dd rva szHal_dll
    19.         dd rva IAT_FOR_HAL
    20.         dd 0,0,0,0,0
    21.  
    22. OriginalFirstThunk:
    23.                 dd rva szRead_port_uc
    24.                 dd rva szWrite_port_uc
    25.                 dd rva szHalmakebeep
    26.                 dd 0
    27.  
    28. szHalmakebeep     dw 0
    29.                   db 'HalMakeBeep',0
    30. szRead_port_uc    dw 0
    31.                   db 'READ_PORT_UCHAR',0
    32. szWrite_port_uc   dw 0
    33.                   db 'WRITE_PORT_UCHAR',0
    34.  
    35. szHal_dll db 'HAL.dll',0
    Но я встречал исходники со структурой импорта типа:
    Код (Text):
    1. section '.rdata' readable notpageable  
    2. data 12  
    3.   ImportLookup:  
    4.         dd rva szRead_port_uc  
    5.         dd rva szWrite_port_uc  
    6.         dd rva szHalmakebeep  
    7.         dd 0  
    8. end data  
    9. section 'INIT' import readable notpageable ;
    10.         dd rva ImportLookup  
    11.         dd 0  
    12.         dd 0  
    13.         dd rva szHal_dll  
    14.         dd rva ImportAddress  
    15.         times 5 dd 0  
    16.  ImportAddress:  
    17.        imp_READ_PORT_UCHAR         dd rva szRead_port_uc  
    18.        imp_WRITE_PORT_UCHAR        dd rva szWrite_port_uc  
    19.        imp_HalMakeBeep             dd rva szHalmakebeep  
    20.   szHalmakebeep     dw 0  
    21.                     db 'HalMakeBeep',0  
    22.   szRead_port_uc    dw 0  
    23.                     db 'READ_PORT_UCHAR',0  
    24.   szWrite_port_uc   dw 0  
    25.                     db 'WRITE_PORT_UCHAR',0 ;
    26.   szHal_dll db 'HAL.dll',0
    То есть во втором исходнике IAT для HAL.dll расположен в секции INIT, которую, как писал Four-F, загрузчик отбрасывает. Какой из двух вариантов принципиально правильный? И, как загрузчик отбрасывает секцию INIT, по имени или нужно указать какие-то флаги(какие?) для секции, чтобы загрузчик ее отбросил?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    считаю что у меня правильно =)
    Код (Text):
    1. format PE native 4.0 at 10000h
    2. entry DriverEntry
    3.  
    4. include '%fasminc%\MACRO\PROC32.INC'
    5.  
    6. STATUS_UNSUCCESSFUL        = 0C0000001h
    7.  
    8. section '.text' code readable executable notpageable
    9.  
    10. DriverEntry:  ; pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
    11. ;    int3
    12.     cinvoke DbgPrint, sz
    13.  
    14.     cli
    15.     mov eax, cr4
    16. ;    push eax
    17. ;    cinvoke DbgPrint, format_string, eax
    18. ;    pop eax
    19.     or eax, 04h  ; set
    20. ;    push eax
    21. ;    cinvoke DbgPrint, format_string, eax
    22. ;    pop eax
    23.     mov cr4, eax
    24.  
    25. ;    mov eax, cr4
    26. ;    and eax, not 04h  ; reset
    27. ;    push eax
    28. ;    cinvoke DbgPrint, format_string, eax
    29. ;    pop eax
    30. ;    mov cr4, eax
    31.     sti
    32.  
    33.     mov eax, STATUS_UNSUCCESSFUL  ; драйвер будет сразу выгружен
    34.     retn 2*4
    35.  
    36. section '.rdata' data readable notpageable
    37.  
    38. ntoskrnl_import_address_table:
    39.     DbgPrint dd rva _DbgPrint
    40.     dd 0
    41.  
    42. ; section '.data' data readable writeable notpageable
    43.  
    44. format_string  db  "cr4: %08lX",0Dh,0Ah,0
    45. sz db "Entered the Driver Entry",0Dh,0Ah,0
    46.  
    47. section 'INIT' import code readable writeable executable discardable
    48.  
    49.     dd rva ntoskrnl_import_lookup_table,0,0,rva ntoskrnl_name,rva ntoskrnl_import_address_table
    50.     dd 0,0,0,0,0
    51.  
    52. ntoskrnl_import_lookup_table:
    53.     dd rva _DbgPrint
    54.     dd 0
    55.  
    56. _DbgPrint dw 0
    57.     db 'DbgPrint',0
    58.  
    59. ntoskrnl_name db "ntoskrnl.exe",0
    60.  
    61. section '.reloc' data fixups readable discardable
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    кстати проверить очень просто, IDA обычно ругается на нестандартный импорт
     
  4. Asvald

    Asvald New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2006
    Сообщения:
    58
    Как я понял, благодаря флагу discardable секция будет выгружаться после загрузки драйвера. А зачем флаги code executable?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    такие флаги обычно стоят у секции INIT у драйвера собранного масмом