Нахождение необработанной точки входа - PullRequest
4 голосов
/ 25 апреля 2011

Я хочу быть в состоянии выяснить, откуда код, появляющийся в точке входа, взглянув на заголовок PE.

Например, этот фрагмент кода является начальным кодом моей программы (401000h)

00401000 >/$ 58             POP EAX                                  ;  kernel32.76E93677
00401001  |. 2D 77360100    SUB EAX,13677
00401006  |. BB 4A184000    MOV EBX,<JMP.&kernel32.VirtualProtect>

Я хочу знать, откуда этот код. Как я могу найти его без ручного сканирования моего файла? (чтобы завершить пример, вот hexdump из того же файла, код теперь находится на 200h)

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000200   58 2D 77 36 01 00 BB 4A  18 40 00 

Как мне добраться от моей виртуальной точки входа (401000h) до необработанной точки входа (200h)? Я пытался решить это сам, конечно. Но я что-то упустил. Сначала я подумал:

.text [Entrypoint (1000h) - VirtualOffset (1000d)] = необработанная точка входа так как выравнивание файла = 200, а необработанная точка входа была в самом начале моего раздела .text, я подумал, что смогу использовать это для всех исполняемых файлов.

Решено, я допустил глупые ошибки при расчете необработанной точки входа

.text [Точка входа - Виртуальное смещение] + Выравнивание файла = Необработанная точка входа (относительно секции .text)

Ответы [ 2 ]

4 голосов
/ 25 апреля 2011

Чтобы найти смещение в файле самостоятельно, вам нужно взглянуть на структуру _IMAGE_NT_HEADERS . Отсюда вы можете получить IMAGE_OPTIONAL_HEADER где Член, которого вы интересуете в ImageBase. Вы можете изменить его значение с помощью EditBin / REBASE, так что вам не нужно будет катить собственный инструмент.

Для справки, как вы можете определить точку входа через мусорную корзину.

Вы можете использовать свалка / заголовки

dumpbin /headers \Windows\bfsvc

Dump of file \Windows\bfsvc.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               4 number of sections
        4A5BBFB3 time date stamp Tue Jul 14 01:13:55 2009
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            9.00 linker version
            DE00 size of code
            2000 size of initialized data
               0 size of uninitialized data
            4149 entry point (01004149)
            1000 base of code
            F000 base of data
         1000000 image base (01000000 to 01011FFF)
            1000 section alignment
             200 file alignment

Для точки входа актуально базовое значение изображения. Но это верно только для изображений, которые не поддерживают ASLR. Для них выбирается случайный базовый адрес (1 из 128 разных). Флаг, который указывает, включен ли для изображения ASLR, является значением 0x40, которое задается в характеристиках DLL.

8140 DLL characteristics

Например, для svchost.exe он установлен для более старых программ и обычно равен 0.

С уважением, Алоис Краус

0 голосов
/ 13 января 2016

Посмотрите на эту ветку, включая ответ с подробным объяснением: Вычисление смещения файла точки входа в PE-файле

AddressOfRawEntryPoint (в файле EXE) = AddressOfEntryPoint + .text [PointerToRawData] - .text [VirtualAddress]

...