Карта памяти в отладчиках - PullRequest
0 голосов
/ 29 апреля 2018

Я открыл исполняемый файл, скомпилированный Nasm в отладчике (x32dbg). На карте памяти показано, где запускаются программы section .text и section .data.

  1. Откуда оно знает.

Вот код:

; ----------------------------------------------------------------------------
; helloworld.asm
;
; This is a Win32 console program that writes "Hello, World" on one line and
; then exits.  It needs to be linked with a C library.
; ----------------------------------------------------------------------------

        global  _main
        extern  _printf

        section .text
_main:
        push    message
        call    _printf
        add     esp, 4
        ret
message:
        db      'Hello, World', 10, 0

1 Ответ

0 голосов
/ 30 апреля 2018

Отладчик может найти виртуальный адрес разделов программы в переносимом (PE) файле. Его структура описана в https://msdn.microsoft.com/library/windows/desktop/ms680547%28v=vs.85%29.aspx?id=19509 Вы можете проверять исполняемые файлы с помощью специального инструмента, такого как PEview .exe из http://wjradburn.com/software/ или посмотрите шестнадцатеричный дамп вашего "helloworld.exe".

По адресу файла (FA) 0x3C вы найдете DWORD с FA, равным PE Header , например, 0x00000090 = 144. Пропустите 144 байта от начала файла, и вы увидите DWORD PEsignature с последующим 20 байтов CoffFileHeader . На 16. байте CoffFileHeader есть WORD SizeOfOptionalHeader, со значением 0x00E0 = 224. Это множество байтов OptionalHeader непосредственно следует за CoffFileHeader. По смещению 0xC4 = 196 в OptionalHeader есть поле DWORD с именем ImageBase с VA, где находится изображение отображается в памяти. Большинство компоновщиков используют ImageBase = 0x00400000.

За OptionaHeader следует SectionHeader с, по одному для каждого раздела, используемого в программе. Каждый SectionHeader имеет длину 40 байт, он содержит SectionName в своих первых восьми байтах, за которыми следует размер раздела, округленный до SectionAlignment, а затем относительный виртуальный адрес ( RVA ) в начале раздела. Обычно первый раздел представляет собой раздел кода с именем = .text , размером = 0x00001000 и RVA = 0x00001000. RVA каждого раздела относится к ImageBase, поэтому раздел .text будет отображаться по адресу ImageBase + RVA = 0x00401000 . Какой ответ на ваш вопрос.

...