Приветствую. У некоторых файлов встречается такой прикол как PE Win32 DLL (0 EntryPoint) (PEiD) EntryPoint: 00000000 File Offset: 00000000 Ниже дамп, dumppe Код (Text): .EXE size (bytes) 536E45 5467717 Minimum load size (bytes) 438C45 4426821 Overlay number 0 0 Initial CS:IP 0000:0000 Initial SS:SP 0000:0140 320 Minimum allocation (para) E0 224 Maximum allocation (para) FFFF 65535 Header size (para) FF00 65280 Relocation table offset 40 64 Relocation entries 4053 16467 Portable Executable starts at 80 Signature 00004550 (PE) Machine 014C (Intel 386) Sections 0003 Time Date Stamp 44581C82 Wed May 3 06:59:14 2006 Symbol Table 00000000 Number of Symbols 00000000 Optional header size 00E0 Characteristics 010F Relocation information stripped Executable Image Line numbers stripped Local symbols stripped 32 bit word machine Magic 010B Linker Version 1.64 Size of Code 00000000 Size of Initialized Data 00000000 Size of Uninitialized Data 00000000 Address of Entry Point 00000000 Base of Code 00000000 Base of Data 00000000 Image Base 00400000 Section Alignment 00001000 File Alignment 00000200 Operating System Version 1.00 Image Version 0.00 Subsystem Version 4.00 reserved 00000000 Image Size 0000A000 Header Size 00000200 Checksum 00000000 Subsystem 0002 (Windows) DLL Characteristics 0000 Size Of Stack Reserve 00001000 Size Of Stack Commit 00001000 Size Of Heap Reserve 00010000 Size Of Heap Commit 00000000 Loader Flags 00000000 Number of Directories 00000010 Directory Name VirtAddr VirtSize -------------------------------------- -------- -------- Export 00000000 00000000 Import 00008000 00000014 Resource 00009000 0000015C Exception 00000000 00000000 Security 00000000 00000000 Base Relocation 00000000 00000000 Debug 00000000 00000000 Decription/Architecture 00000000 00000000 Machine Value (MIPS GP) 00000000 00000000 Thread Storage 00000000 00000000 Load Configuration 00000000 00000000 Bound Import 00000000 00000000 Import Address Table 00000000 00000000 Delay Import 00000000 00000000 COM Runtime Descriptor 00000000 00000000 (reserved) 00000000 00000000 Section Table ------------- 01 .code Virtual Address 00001000 Virtual Size 00006666 Raw Data Offset 00000200 Raw Data Size 00006800 Relocation Offset 00000000 Relocation Count 0000 Line Number Offset 00000000 Line Number Count 0000 Characteristics E0000020 Code Executable Readable Writeable 02 .idata Virtual Address 00008000 Virtual Size 00000014 Raw Data Offset 00006A00 Raw Data Size 00000200 Relocation Offset 00000000 Relocation Count 0000 Line Number Offset 00000000 Line Number Count 0000 Characteristics 40000040 Initialized Data Readable 03 .rsrc Virtual Address 00009000 Virtual Size 00000FAE Raw Data Offset 00006C00 Raw Data Size 00000200 Relocation Offset 00000000 Relocation Count 0000 Line Number Offset 00000000 Line Number Count 0000 Characteristics 60000060 Code Initialized Data Executable Readable Собственно вопрос в том, как подобное реализуется?
а что не обычного то? смотри инструкции которые находятся по адресу базы образа: 'ZM', потом джамп на нормальную точку входа
TLS коллбек запускается перед EP, в нем может делаться перенаправление в кодовую секцию. Это как вариант.
предположу что таблица импорта расположена в заголовке как раз на месте поля EP, хотя я не понимаю что это может дать раз запускается, может выложишь трассировку?
GoldFinch ну как это )? боянный прикол ведь http://indetails.info/techs/613.html Код (Text): Второй способ более экстравагантный я бы сказал, там смысл у нас будет заключаться в том, что когда файл мапится в оперативную память, мапится он с адреса базы(ImageBase), который обычно равен 00400000, дальше EIP переходит на точку входа, которая в памяти у нас будет равна ImageBase + EntryPoint в PE заголовке, то есть если EntryPoint у нас равен 00001000, EIP будет на адресе 00401000, то есть это точка входа в программу у нас такая. А что же будет если взять Lord Pe и быстренько поставить EntryPoint например в 0? наша точка входа будет в 00400000, а ждут нас там опкоды 4D5Ah (те самые MZ), которые в переводе на асм будут выглядеть как 00400000 4D DEC EBP 00400001 5A POP EDX Что вполне нормально, в чем мы можем легко совершенно убедиться набрав в OllyDbg Ctrl + G и введем 00400000. Ну как? Есть мысли что делаем дальше? Конечно же мы ставим jmp на 00401000 (в реальную точку входа) по адресу 00400002, просто щелкаем на пробел и вводим jmp 00401000 и нажимаем Assemble, Cencel и получаем отличную картину 00400000 4D DEC EBP 00400001 5A POP EDX 00400002 - E9 F90F0000 JMP 00401000
Код (Text): ;@echo off ;goto make ; macro align value { rb (value-1)-($+value-1) mod value } IMAGE_DOS_SIGNATURE = 5A4Dh ; MZ IMAGE_NT_SIGNATURE = 00004550h ; PE00 IMAGE_FILE_MACHINE_I386 = 014ch ; Intel 386 IMAGE_FILE_RELOCS_STRIPPED = 0001h ; Relocation info stripped from file IMAGE_FILE_EXECUTABLE_IMAGE = 0002h ; File is executable (i.e. no unresolved externel references) IMAGE_FILE_LINE_NUMS_STRIPPED = 0004h ; Line nunbers stripped from file IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0008h ; Local symbols stripped from file IMAGE_FILE_32BIT_MACHINE = 0100h ; 32 bit word machine ; Section characteristics IMAGE_SCN_CNT_CODE = 00000020h ; Section contains code IMAGE_SCN_CNT_INITIALIZED_DATA = 00000040h ; Section contains initialized data IMAGE_SCN_CNT_UNINITIALIZED_DATA = 00000080h ; Section contains uninitialized data IMAGE_SCN_MEM_EXECUTE = 20000000h ; Section is executable IMAGE_SCN_MEM_READ = 40000000h ; Section is readable IMAGE_SCN_MEM_WRITE = 80000000h ; Section is writeable IMAGE_SUBSYSTEM_WINDOWS_GUI = 2 ; Image runs in the Windows GUI subsystem IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16 IMAGE_BASE = 00400000h NUMBER_OF_SECTIONS = 2 FILE_ALIGNMENT = 00000200h SECTION_ALIGNMENT = 00001000h IMAGE_DOS_HEADER: ; DOS .EXE header e_magic dw IMAGE_DOS_SIGNATURE ; Magic number /* 0h */ ;e_cblp dw 0 ; Bytes on last page of file /* 2h */ db 52h,45h ;e_cp dw 0 ; Pages in file /* 4h */ ;e_crlc dw 0 ; Relocations /* 6h */ ;e_cparhdr dw 0 ; Size of header in paragraphs /* 8h */ db 68h dd (START - _CODE)+CODE_RVA+IMAGE_BASE db 0C3h e_minalloc dw 0 ; Minimum extra paragraphs needed /* 0Ah */ e_maxalloc dw 0 ; Maximum extra paragraphs needed /* 0Ch */ e_ss dw 0 ; Initial (relative) SS value /* 0Eh */ e_sp dw 0 ; Initial SP value /* 10h */ e_csum dw 0 ; Checksum /* 12h */ e_ip dw 0 ; Initial IP value /* 14h */ e_cs dw 0 ; Initial (relative) CS value /* 16h */ e_lfarlc dw 0 ; File address of relocation table /* 18h */ e_ovno dw 0 ; Overlay number /* 1Ah */ e_res rw 4 ; Reserved words /* 1Ch */ e_oemid dw 0 ; OEM identifier (for e_oeminfo) /* 24h */ e_oeminfo dw 0 ; OEM information; e_oemid specific /* 26h */ e_res2 rw 10 ; Reserved words /* 28h */ e_lfanew dd IMAGE_NT_HEADERS ; File address of new exe header /* 3Ch */ ; IMAGE_DOS_HEADER align 4 IMAGE_NT_HEADERS: Signature dd IMAGE_NT_SIGNATURE IMAGE_FILE_HEADER: Machine dw IMAGE_FILE_MACHINE_I386 NumberOfSections dw NUMBER_OF_SECTIONS TimeDateStamp dd %t PointerToSymbolTable dd 0 NumberOfSymbols dd 0 SizeOfOptionalHeader dw IMAGE_OPTIONAL_HEADER_SIZE Characteristics dw IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_EXECUTABLE_IMAGE or \ IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED or \ IMAGE_FILE_32BIT_MACHINE ; IMAGE_FILE_HEADER IMAGE_OPTIONAL_HEADER: ; Standard fields Magic dw 010Bh MajorLinkerVersion db 0 MinorLinkerVersion db 0 SizeOfCode dd 0 SizeOfInitializedData dd 0 SizeOfUninitializedData dd 0 AddressOfEntryPoint dd 0 BaseOfCode dd 0 BaseOfData dd 0 ; NT additional fields ImageBase dd IMAGE_BASE SectionAlignment dd SECTION_ALIGNMENT FileAlignment dd FILE_ALIGNMENT MajorOperatingSystemVersion dw 4 MinorOperatingSystemVersion dw 0 MajorImageVersion dw 0 MinorImageVersion dw 0 MajorSubsystemVersion dw 4 MinorSubsystemVersion dw 0 Win32VersionValue dd 0 SizeOfImage dd (IMPORT_RVA+IMPORT_SIZE)+((SECTION_ALIGNMENT-1)-((IMPORT_RVA+IMPORT_SIZE)+SECTION_ALIGNMENT-1) mod SECTION_ALIGNMENT) SizeOfHeaders dd _CODE CheckSum dd 0 Subsystem dw IMAGE_SUBSYSTEM_WINDOWS_GUI DllCharacteristics dw 0 SizeOfStackReserve dd 100000h SizeOfStackCommit dd 1000h SizeOfHeapReserve dd 100000h SizeOfHeapCommit dd 1000h LoaderFlags dd 0 NumberOfRvaAndSizes dd IMAGE_NUMBEROF_DIRECTORY_ENTRIES ; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] Data_Directories: IMAGE_DIRECTORY_ENTRY_EXPORT dd 0,0 ; 0 // Export Directory IMAGE_DIRECTORY_ENTRY_IMPORT dd IMPORT_RVA,IMPORT_SIZE ; 1 // Import Directory IMAGE_DIRECTORY_ENTRY_RESOURCE dd 0,0 ; 2 // Resource Directory IMAGE_DIRECTORY_ENTRY_EXCEPTION dd 0,0 ; 3 // Exception Directory IMAGE_DIRECTORY_ENTRY_SECURITY dd 0,0 ; 4 // Security Directory IMAGE_DIRECTORY_ENTRY_BASERELOC dd 0,0 ; 5 // Base Relocation Table IMAGE_DIRECTORY_ENTRY_DEBUG dd 0,0 ; 6 // Debug Directory ; IMAGE_DIRECTORY_ENTRY_COPYRIGHT dd 0,0 ; 7 // (X86 usage) IMAGE_DIRECTORY_ENTRY_ARCHITECTURE dd 0,0 ; 7 // Architecture Specific Data IMAGE_DIRECTORY_ENTRY_GLOBALPTR dd 0,0 ; 8 // RVA of GP IMAGE_DIRECTORY_ENTRY_TLS dd 0,0 ; 9 // TLS Directory IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG dd 0,0 ; 10 // Load Configuration Directory IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT dd 0,0 ; 11 // Bound Import Directory in headers IMAGE_DIRECTORY_ENTRY_IAT dd 0,0 ; 12 // Import Address Table IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT dd 0,0 ; 13 // Delay Load Import Descriptors IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR dd 0,0 ; 14 // COM Runtime descriptor dd 0,0 ; 15 ; Data_Directories ; IMAGE_OPTIONAL_HEADER IMAGE_OPTIONAL_HEADER_END: IMAGE_OPTIONAL_HEADER_SIZE = IMAGE_OPTIONAL_HEADER_END - IMAGE_OPTIONAL_HEADER ; IMAGE_NT_HEADERS IMAGE_SECTION_HEADER1: Name1 db ".text",0,0,0 ; union { ; DWORD PhysicalAddress VirtualSize1 dd CODE_SIZE ; } Misc; VirtualAddress1 dd CODE_RVA SizeOfRawData1 dd _IMPORT - _CODE PointerToRawData1 dd _CODE PointerToRelocations1 dd 0 PointerToLinenumbers1 dd 0 NumberOfRelocations1 dw 0 NumberOfLinenumbers1 dw 0 Characteristics1 dd IMAGE_SCN_CNT_CODE or IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ ; IMAGE_SECTION_HEADER1 IMAGE_SECTION_HEADER2: Name2 db ".idata",0,0 ; union { ; DWORD PhysicalAddress VirtualSize2 dd IMPORT_SIZE ; } Misc; VirtualAddress2 dd IMPORT_RVA SizeOfRawData2 dd IMPORT_SECTION_END - _IMPORT PointerToRawData2 dd _IMPORT PointerToRelocations2 dd 0 PointerToLinenumbers2 dd 0 NumberOfRelocations2 dw 0 NumberOfLinenumbers2 dw 0 Characteristics2 dd IMAGE_SCN_CNT_INITIALIZED_DATA or IMAGE_SCN_MEM_READ ; IMAGE_SECTION_HEADER2 IMAGE_SECTION_HEADER2_END: times ((FILE_ALIGNMENT-1)-(IMAGE_SECTION_HEADER2_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) db 0 _CODE: CODE_RVA = _CODE + ((SECTION_ALIGNMENT-1)-(_CODE+SECTION_ALIGNMENT-1) mod SECTION_ALIGNMENT) szTest db "Test",0 align 4 START: push 0 push 0 db 068h dd (szTest-_CODE)+CODE_RVA+IMAGE_BASE push 0 db 0FFh,015h dd (MessageBox-_IMPORT)+IMPORT_RVA+IMAGE_BASE push 0 db 0FFh,015h dd (ExitProcess-_IMPORT)+IMPORT_RVA+IMAGE_BASE _CODE_END: CODE_SIZE = _CODE_END - _CODE times ((FILE_ALIGNMENT-1)-(_CODE_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) db 0 _IMPORT: IMPORT_RVA = (CODE_RVA+CODE_SIZE) + ((SECTION_ALIGNMENT-1)-((CODE_RVA+CODE_SIZE)+SECTION_ALIGNMENT-1) mod SECTION_ALIGNMENT) dd 0,0,0,IMPORT_RVA+(kernel_name - _IMPORT),IMPORT_RVA+(kernel_table - _IMPORT) dd 0,0,0,IMPORT_RVA+(user_name - _IMPORT),IMPORT_RVA+(user_table - _IMPORT) dd 0,0,0,0,0 kernel_table: ExitProcess dd IMPORT_RVA+(_ExitProcess - _IMPORT) dd 0 user_table: MessageBox dd IMPORT_RVA+(_MessageBoxA - _IMPORT) dd 0 kernel_name db 'KERNEL32.DLL',0 user_name db 'USER32.DLL',0 _ExitProcess dw 0 db 'ExitProcess',0 _MessageBoxA dw 0 db 'MessageBoxA',0 _IMPORT_END: IMPORT_SIZE = _IMPORT_END - _IMPORT IMPORT_SECTION_END = _IMPORT_END + ((FILE_ALIGNMENT-1)-(_IMPORT_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) times ((FILE_ALIGNMENT-1)-(_IMPORT_END+FILE_ALIGNMENT-1) mod FILE_ALIGNMENT) db 0 ;:make ;SET PROJECTNAME=stub ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe ;C:\Fasm\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.exe ;pause ;cls
Обычно DLL с EntryPoint = 0 используются исключительно для хранения ресурсов (правда директория импортов там тоже отсутствует) Хотя можно, как уже писали, и с нулевого смещения от ImageBase исполнять свой код - ничего этому не мешает.
Недвно писал статический прилинковщик dll'ок к EXE. Тоже встретил много чего интересного, например DLL может переделать себя в EXE и наоборот строчек в 5) Нужно просто проверять в maine имя главного модуля и ессли это ДЛЛ То выполять точку входа длл иначе точку входа приложения. А так как CRT поставляется в исходных кодах то млжно это сделать прямо в ней)