Помогите окончательно рабораться, как же работает импорт в драйвере. Как я понял, из всех структур импорта в одну секцию(например '.rdata') должны попасть только струтуры IMAGE_THUNK_DATA, на которые из каждого(для каждой библиотеки) IMAGE_IMPORT_DESCRIPTOR указывает поле FirstThunk. В другую секцию(например 'INIT') должны попасть все остальные структуры импорта(причем эта секция отбрасывается после загрузки). Следовательно в моем элементарном драйвере(на FASM) импорт имеет следующий вид: Код (Text): section '.rdata' readable notpageable data 12 IAT_FOR_HAL: READ_PORT_UCHAR dd rva szRead_port_uc WRITE_PORT_UCHAR dd rva szWrite_port_uc HalMakeBeep dd rva szHalmakebeep dd 0 end data section 'INIT' import readable notpageable dd rva OriginalFirstThunk dd 0 dd 0 dd rva szHal_dll dd rva IAT_FOR_HAL dd 0,0,0,0,0 OriginalFirstThunk: dd rva szRead_port_uc dd rva szWrite_port_uc dd rva szHalmakebeep dd 0 szHalmakebeep dw 0 db 'HalMakeBeep',0 szRead_port_uc dw 0 db 'READ_PORT_UCHAR',0 szWrite_port_uc dw 0 db 'WRITE_PORT_UCHAR',0 szHal_dll db 'HAL.dll',0 Но я встречал исходники со структурой импорта типа: Код (Text): section '.rdata' readable notpageable data 12 ImportLookup: dd rva szRead_port_uc dd rva szWrite_port_uc dd rva szHalmakebeep dd 0 end data section 'INIT' import readable notpageable ; dd rva ImportLookup dd 0 dd 0 dd rva szHal_dll dd rva ImportAddress times 5 dd 0 ImportAddress: imp_READ_PORT_UCHAR dd rva szRead_port_uc imp_WRITE_PORT_UCHAR dd rva szWrite_port_uc imp_HalMakeBeep dd rva szHalmakebeep szHalmakebeep dw 0 db 'HalMakeBeep',0 szRead_port_uc dw 0 db 'READ_PORT_UCHAR',0 szWrite_port_uc dw 0 db 'WRITE_PORT_UCHAR',0 ; szHal_dll db 'HAL.dll',0 То есть во втором исходнике IAT для HAL.dll расположен в секции INIT, которую, как писал Four-F, загрузчик отбрасывает. Какой из двух вариантов принципиально правильный? И, как загрузчик отбрасывает секцию INIT, по имени или нужно указать какие-то флаги(какие?) для секции, чтобы загрузчик ее отбросил?
считаю что у меня правильно =) Код (Text): format PE native 4.0 at 10000h entry DriverEntry include '%fasminc%\MACRO\PROC32.INC' STATUS_UNSUCCESSFUL = 0C0000001h section '.text' code readable executable notpageable DriverEntry: ; pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING ; int3 cinvoke DbgPrint, sz cli mov eax, cr4 ; push eax ; cinvoke DbgPrint, format_string, eax ; pop eax or eax, 04h ; set ; push eax ; cinvoke DbgPrint, format_string, eax ; pop eax mov cr4, eax ; mov eax, cr4 ; and eax, not 04h ; reset ; push eax ; cinvoke DbgPrint, format_string, eax ; pop eax ; mov cr4, eax sti mov eax, STATUS_UNSUCCESSFUL ; драйвер будет сразу выгружен retn 2*4 section '.rdata' data readable notpageable ntoskrnl_import_address_table: DbgPrint dd rva _DbgPrint dd 0 ; section '.data' data readable writeable notpageable format_string db "cr4: %08lX",0Dh,0Ah,0 sz db "Entered the Driver Entry",0Dh,0Ah,0 section 'INIT' import code readable writeable executable discardable dd rva ntoskrnl_import_lookup_table,0,0,rva ntoskrnl_name,rva ntoskrnl_import_address_table dd 0,0,0,0,0 ntoskrnl_import_lookup_table: dd rva _DbgPrint dd 0 _DbgPrint dw 0 db 'DbgPrint',0 ntoskrnl_name db "ntoskrnl.exe",0 section '.reloc' data fixups readable discardable
Как я понял, благодаря флагу discardable секция будет выгружаться после загрузки драйвера. А зачем флаги code executable?