Tiny PE Windows10x64

Тема в разделе "WASM.BEGINNERS", создана пользователем Ruins007, 7 авг 2017.

  1. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Hello world
    мои очумелые ручки добрались до самого маленького исполняемого файла и нашли на просторах сети аж 268-ми байтный пример для Win7x64. Но вот на моей Win10x64 не работает, когда смотрю в отладчике(x64dbg), ловлю исключение ACCESS_VIOLATION, а потом оказалось, что User32 не загружена, а вот Kernel с какого-то перепугу подгружен - может быть это отладчик с ума сходит и не понимает такие файлы. По переставлял всё, попробовал добавлять ".dll" и в верхнем регистре писал, указатели местами менял, нулевые элементы добавлял - ничего не помогает. Так вот вопрос, не изменилось ли на 10-ке какая-нибудь важная деталь? Может есть рабочие примеры? а может это вообще даже на 7-ке не запускается?
    FASM:
    Код (ASM):
    1. format binary as 'exe'
    2. IMAGE_DOS_SIGNATURE             equ 5A4Dh
    3. IMAGE_NT_SIGNATURE              equ 00004550h
    4. PROCESSOR_AMD_X8664             equ 8664h
    5. IMAGE_SCN_CNT_CODE              equ 00000020h
    6. IMAGE_SCN_MEM_READ              equ 40000000h
    7. IMAGE_SCN_MEM_WRITE             equ 80000000h
    8. IMAGE_SCN_CNT_INITIALIZED_DATA  equ 00000040h
    9. IMAGE_SUBSYSTEM_WINDOWS_GUI     equ 2
    10. IMAGE_NT_OPTIONAL_HDR64_MAGIC   equ 20Bh
    11. IMAGE_FILE_RELOCS_STRIPPED      equ 1
    12. IMAGE_FILE_EXECUTABLE_IMAGE     equ 2
    13. IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE equ 8000h
    14. include 'win64a.inc'
    15. org 0
    16. use64
    17. IMAGE_BASE = 400000h
    18. Signature:              dw IMAGE_DOS_SIGNATURE,0
    19. ntHeader                dd IMAGE_NT_SIGNATURE;'PE'
    20. ;image_header--------------------------
    21. .Machine                dw PROCESSOR_AMD_X8664
    22. .Count_of_section       dw 0;2
    23. .TimeStump              dd 0
    24. .Symbol_table_offset    dd 0;ntHeader
    25. .Symbol_table_count     dd 0
    26. .Size_of_optional_header dw EntryPoint-optional_header
    27. .Characteristics        dw 0x20 or IMAGE_FILE_RELOCS_STRIPPED or
    28. IMAGE_FILE_EXECUTABLE_IMAGE
    29. ;20h Handle >2Gb addresses
    30. ;-------------------------------------
    31. optional_header:
    32. .Magic_optional_header  dw IMAGE_NT_OPTIONAL_HDR64_MAGIC
    33. .Linker_version_major_and_minor dw 9
    34. .Size_of_code           dd 0
    35. .Size_of_init_data      dd 0;xC0
    36. .Size_of_uninit_data    dd 0
    37. .entry_point            dd EntryPoint
    38. .base_of_code           dd ntHeader
    39. .image_base             dq IMAGE_BASE
    40. .section_alignment      dd 4
    41. .file_alignment         dd 4
    42. .OS_version_major_minor dw 5,2
    43. .image_version_major_minor dd 0
    44. .subsystem_version_major_minor dw 5,2
    45. .Win32_version          dd 0
    46. .size_of_image          dd EndOfImage
    47. .size_of_header         dd EntryPoint
    48. .checksum               dd 0
    49. .subsystem              dw IMAGE_SUBSYSTEM_WINDOWS_GUI
    50. .DLL_flag               dw IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
    51. .Stack_allocation       dq 0x100000
    52. .Stack_commit           dq 0x1000
    53. .Heap_allocation        dq 0x100000
    54. .Heap_commit            dq 0x1000
    55. .loader_flag            dd 0
    56. .number_of_dirs         dd (EntryPoint-export_RVA_size)/8
    57. export_RVA_size        dq 0
    58. .import_RVA             dd import_
    59. .import_size            dd end_import-import_
    60. ;------------------------------------------------
    61. EntryPoint:
    62.    enter 20h,0        ; space for 4 arguments + 16byte aligned stack
    63.    xor ecx, ecx                   ; 1. argument: rcx = hWnd = NULL
    64.    mov r9, rcx                    ; 4. argument: r9d = uType = MB_OK = 0
    65.    mov edx,MsgCaption+IMAGE_BASE  ; 2. argument: edx = window text
    66.    mov r8,rdx                     ; 3. argument: r8  = caption
    67.    call [MessageBox]
    68.    leave
    69.    ret
    70. ;------------------------------------------------
    71. MsgCaption      db "Iczelion's tutorial #2a",0
    72. ;-------------------------------------------------
    73. Import_Table:
    74. user32_table:
    75. MessageBox  dq _MessageBox
    76. import_:
    77. dd 0,0,0,user32_dll,user32_table
    78. dd 0
    79. user32_dll    db "user32",0,0
    80. dw 0
    81. _MessageBox     db 0,0,"MessageBoxA"
    82. end_import:
    83. times 268-end_import db 0  ;filling up to 268 bytes
    84. EndOfImage:
     
    yashechka нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Ruins007,
    на просторах сети говоришь?
    Могу и на первоистоичник указать Сказки дядюшки Римуса, "Глава вторая. Как Братец Кролик уменьшал размер программы". По шагам, с комментариями. Попробуй повторить самостоятельно :)
     
    ol. нравится это.
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Вангую, что все 16 data directories в заголовке надо указать. Вряд ли загрузчик проверяет поля SizeOfOptionalHeader и NumberOfDirectories.
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    rmn,
    предельный размер в 268 байт как раз и задается 16 data directories в заголовке, то есть код и данные находятся том на месте, где должны были бы быть все 16 data directories хотя используется только импорт
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.329
    Но если поля Size забиты опкодами, лоадер будет думать, что соответствующая директория есть и попытается ее считать. Нет?
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Можно создать "обычный PE64" и запускать его, изменяя значение в "number_of_dirs"
     
  7. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Код (ASM):
    1. rq 14
    перед началом кода, не дало результатов, проверил PE Tools, остальные директории, кроме import'а - пусты.
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Ruins007,
    просто повторите по-шагам, то что описано во второй главе: с ключом /ALIGN, объединением сегментов кода и данных, DOS-стабом, удалением ExitProcess и т.д. Так можно будет понять ЧТО можно делать в Win10, а ЧЕГО нельзя
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Ruins007,
    какой компилятор вы используете? masm? fasm? nasm?
     
  10. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    FASM, перед кодом написано, а что?
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Ruins007,
    чтобы собрать нестандартный PE-заголовок я использовал FASM, можно было то же сделать через NASM, еще раньше я использовал ML.EXE (Masm) когда создавал СОМ-файл и переименовывал его в ЕХЕ, но сейчас ml64.exe не дает возможности создавать бинарные файлы (или я об этом не знаю). Но начать нужно с ml64, я выдернул его и link.exe из VS2014
     
  12. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Ух неожиданно, эксперимент удался. Судя по всему win10 не принимает файлы с нулевым количеством секций. Точнее не подгружает к ним dll из таблицы импорта. Достаточно добавить одну общую секцию и задать количество секций больше нуля, так всё сразу заработало. Более того, там где я брал исходники, было написано, что файлы меньше 268'ми байт не читаются, однако удалив текст сообщения и задав адрес названия секции(".code ") вместо него, программа запустилась и вывела сообщение, хотя получилось 247 байт.
     
  13. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Ещё заметил, что отладчик показывает сразу 3 либы: ntdll.dll, kernel32.dll, kernelbase.dll. Так вот вопрос - это отладчик их по умолчанию подгружает? или всё-таки они и так есть в адресном пространстве процесса? вроде ntdll.dll и так должен там быть, но вот наличие kernel32 - удивляет. Через какую функцию лучше проверить, есть идеи?
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Интересно где? masm32.com? board.flatassembler.net?
    Сам отладчик так же нуждается в импорте из dll
     
  15. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    На masm32.com, по перенаправлению с cyberforum'а
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Тема размещена на cyberforum, Tiny PE Windows10x64 думаете откликнутся и помогут? ;)
     
  17. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Да я ещё и на стаковерфлоу спрашивал.
     
  18. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Опять чудеса, программа без таблицы импорта спокойно выполняет CreateFile2() из Kernel32 и создаёт файл, правда пока кракозябры в названии, видимо кодировка не сходится.
    Код (ASM):
    1. format binary as 'exe'
    2. IMAGE_DOS_SIGNATURE        equ 5A4Dh
    3. IMAGE_NT_SIGNATURE        equ 00004550h
    4. PROCESSOR_AMD_X8664        equ 8664h
    5. IMAGE_SCN_CNT_CODE        equ 00000020h
    6. IMAGE_SCN_MEM_READ        equ 40000000h
    7. IMAGE_SCN_MEM_WRITE        equ 80000000h
    8. IMAGE_SCN_CNT_INITIALIZED_DATA    equ 00000040h
    9. IMAGE_SUBSYSTEM_WINDOWS_GUI    equ 2
    10. IMAGE_NT_OPTIONAL_HDR64_MAGIC    equ 20Bh
    11. IMAGE_FILE_RELOCS_STRIPPED    equ 1
    12. IMAGE_FILE_EXECUTABLE_IMAGE    equ 2
    13. IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE equ 8000h
    14. include 'win64a.inc'
    15. org 0
    16. use64
    17. IMAGE_BASE = 400000h
    18. Signature:        dw IMAGE_DOS_SIGNATURE,0
    19. ntHeader        dd IMAGE_NT_SIGNATURE;'PE'
    20. ;image_header--------------------------
    21. .Machine        dw PROCESSOR_AMD_X8664
    22. .Count_of_section    dw 0;2
    23. .TimeStump        dd 0
    24. .Symbol_table_offset    dd 0;ntHeader
    25. .Symbol_table_count    dd 0
    26. .Size_of_optional_header dw EntryPoint-optional_header
    27. .Characteristics    dw 0x20 or IMAGE_FILE_RELOCS_STRIPPED or\
    28. IMAGE_FILE_EXECUTABLE_IMAGE
    29. ;20h Handle >2Gb addresses
    30. ;-------------------------------------
    31. optional_header:
    32. .Magic_optional_header    dw IMAGE_NT_OPTIONAL_HDR64_MAGIC
    33. .Linker_version_major_and_minor dw 9
    34. .Size_of_code        dd 0
    35. .Size_of_init_data    dd 0;xC0
    36. .Size_of_uninit_data    dd 0
    37. .entry_point        dd EntryPoint
    38. .base_of_code        dd ntHeader
    39. .image_base        dq IMAGE_BASE
    40. .section_alignment    dd 4
    41. .file_alignment     dd 4
    42. .OS_version_major_minor dw 5,2
    43. .image_version_major_minor dd 0
    44. .subsystem_version_major_minor dw 5,2
    45. .Win32_version        dd 0
    46. .size_of_image        dd EndOfImage
    47. .size_of_header     dd EntryPoint
    48. .checksum        dd 0
    49. .subsystem        dw IMAGE_SUBSYSTEM_WINDOWS_GUI
    50. .DLL_flag        dw IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
    51. .Stack_allocation    dq 0x100000
    52. .Stack_commit        dq 0x1000
    53. .Heap_allocation    dq 0x100000
    54. .Heap_commit        dq 0x1000
    55. .loader_flag        dd 0
    56. .number_of_dirs     dd (EntryPoint-export_RVA_size)/8
    57. export_RVA_size        dq 0
    58. .import_RVA        dd 0
    59. .import_size        dd 0
    60.  
    61. EntryPoint:
    62.    enter 20h,0          ; space for 4 arguments + 16byte aligned stack
    63.    mov rcx, name_ + IMAGE_BASE
    64.    mov rdx, 1
    65.    mov r8, 1
    66.    mov r9, 2
    67.    mov qword[rsp+68h-48h], 0
    68.    call [file_]
    69.    leave
    70.    ret
    71. Import_Table:
    72. file_ dq 0x00007FF8F59A42F0
    73. dq 0,0,0,0
    74. name_ db 0x41,0x42,0x41,0x2E,0x74,0x78,0x74,0,0
    75. end_import:
    76. times 268-end_import db 0  ;filling up to 268 bytes
    77. EndOfImage:
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
  20. Ruins007

    Ruins007 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2017
    Сообщения:
    17
    Так это же отлично, можно остальные библиотеки в отдельном потоке подгружать, пока к примеру в основном распаковываешь сжатый код. Тут ещё треугольник на Vulkan API научился выводить, без всяких макросов - чувствую вот-вот руки выпрямятся.
    p.s. мне бы такие руки, когда я егэ заваливал
     
    Последнее редактирование: 7 авг 2017