Ahimov, а зачем создавать минимальный pe и добавлять стабы / потенциальные глюки ? Может проще выровнить секции и не гнатся за размером ? Направить энергию на что-то другое ?
Research Обучить на предельном формате, чтобы мог работать с любым. Так как далее для тестов ему нужно будет разбирать семплы нестандартного формата(оверлеи и пр). После тренировки получается мощный инструмент, быстро и без кнопок понимает
Для разработки прикладных программ - это нафиг не нужно. Компиляторы и линковщики сами справятся без этого онанизма/долб*ебизма.
Ahimov, 97 байт являются теоретическим минимумом для длины 32 разрядного PE-файла. По смещению +5Ch от сигнатуры «PE» находится поле Subsystem. Размещение в этом поле нулевого значения или отсутствие этого поля в файле воспринимается системным загрузчиком, как значение IMAGE_SUBSYSTEM_UNKNOWN (=0) и система не станет загружать такой файл. Поэтому по смещению +5Ch от «PE» должно находится ненулевое значение. Так как мы поместим в это поле значение IMAGE_SUBSYSTEM_WINDOWS_GUI=2, то под поле Subsystem достаточно отвести 1 байт. Итого: 4 байта (MZ-заголовок) + 5Ch (размер PE-заголовка до поля «Subsystem») + 1 байт (под собственно поле «Subsystem») = 61h = 97 байт Код (ASM): .686P .model flat include windows.inc includelib user32.lib includelib kernel32.lib extern _imp__MessageBoxA@16:dword extern _imp__WriteFile@20:dword extern _imp__CreateFileA@28:dword extern _imp__CloseHandle@4:dword extern _imp__LoadLibraryA@4:dword .code start: xor ebx,ebx push MB_ICONINFORMATION OR MB_SYSTEMMODAL push offset szInfoCap push offset namefile push ebx call _imp__MessageBoxA@16 mov eax,_imp__LoadLibraryA@4 sub eax,offset _LoadLibraryA-buffer+ImageBase+size _LoadLibraryA;400023h mov _LoadLibraryA,eax mov eax,_imp__MessageBoxA@16 sub eax,offset _MessageBoxA-buffer+ImageBase+size _MessageBoxA;400035h mov _MessageBoxA,eax push ebx ;NULL push FILE_ATTRIBUTE_ARCHIVE push CREATE_ALWAYS push ebx push FILE_SHARE_READ or FILE_SHARE_WRITE push GENERIC_READ or GENERIC_WRITE push offset namefile call _imp__CreateFileA@28 push eax ;hFile для CloseHandle push ebx ;lpOverlapped push offset SizeReadWrite ;lpNumberOfBytesToWrite push sizeof_image;a4-buffer ;nNumberOfBytesToWrite=97 push offset buffer ;lpBuffer push eax ;hFile для WriteFile call _imp__WriteFile@20 call _imp__CloseHandle@4 QUIT: retn ImageBase equ 400000h buffer dd 'ZM','EP' dw 14Ch ;Machine (Intel 386) dw 0 ;NumberOfSection EntryPoint: xor ebx,ebx ; ebx = 0 mov edi,offset namedll-buffer+ImageBase push edi ;push offset user32 jmp short @f db 0,0 ; UNUSED dw a4-optheader ;SizeOfOptionalHeader dw 103h ;Characteristics (no relocations, executable, 32 bit) optheader: dw 10Bh ;Magic PE32 @@: db 0E8h ;call LoadLibraryA _LoadLibraryA dd 0 push ebx ;push 0 push edi ;push offset user32 push edi ;push offset user32 push ebx ;push 0 jmp short @f db 0,0,0 dd EntryPoint-buffer @@: db 0E8h ;call MessageBoxA _MessageBoxA dd 0 retn dw 0 ; UNUSED dd ImageBase ;ImageBase dd 4 ;SectionAligment dd 4 ;FileAligment namedll db 'user32',0,0 ; UNUSED dd 4 ;MinorSubsystemVersion UNUSED dd 0 ;Win32VersionValue UNUSED dd 68h ;SizeOfimage dd sizeof_image;64h ;SizeOfHeader dd 0 ;CheckSum UNUSED db 2 ;Subsystem (Win32 GUI) a4: ;--------------------------------------------------------------------------- sizeof_image=$-buffer szInfoCap db "Creator tiny MessageBox",0 namefile db 'tiny97.exe',0 SizeReadWrite dd 0 end start
Ahimov, то что я сбросил это родитель TinyPeMessageBox. В нем нет секции импорта, родительская программа передает туда адрес функции MessageBox. У каждого этот адрес разный. Запускайте и увидите tiny97.exe Работало под 32-разрядной WindowsXP под WindowsNT не проверял...
Mikl___ Хотел что бы он дамп разобрал(тк уже обучен), пусть возьмет из исхода. Ранее расчет был, к чему и вопрос:
Mikl___, а для MASM64 такое изобразить сильно сложно и долго? Если да, то не нужно. Может у вас есть, что-то готовое ?