4

Как получить доступ к машинным кодам (двоичным файлам) исполняемого файла?Машинный код файла (исполняемый файл)?

Подробности

  • я на Ubuntu (Linux)
  • Я хочу, чтобы получить доступ к коду машины (двоичные файлы) из EXE-файлов (файлы формата следуют PE)
  • Я с помощью C для реализации

ответ

6

Использование objdump с опцией -d для разбирать. Другим полезным вариантом является -s, чтобы получить дамп файла. Если по какой-то причине -d не работает, вы также можете попробовать -D, это заставляет objdump разбирать файл, даже если он не похож на код машины. Для получения дополнительной информации обратитесь к справочной странице objdump. Например, чтобы демонтировать и сбросить PE исполняемый foo.exe тип:

objdump -sd foo.exe 

Выходной сигнал состоит из двух частей. Первая часть выглядит следующим образом:

Contents of section .text: 
401000 33c03905 28944200 0f9fc0c3 558bec51 3.9.(.B.....U..Q 
401010 568bf16a 01684410 4000c706 30024200 [email protected] 
401020 ff15b000 420085c0 75158d45 fc68c00e ....B...u..E.h.. 
401030 420050c7 45fc9070 4200e8cd bc01008b B.P.E..pB....... 
401040 c65ec9c3 837c2404 0575056a 0158eb12 .^...|$..u.j.X.. 
401050 ff052894 420033c0 833d2894 4200020f ..(.B.3..=(.B... 
401060 9cc0c204 00568bf1 e8140000 00f64424 .....V........D$ 
401070 08017407 56e88b6f 0000598b c65ec204 ..t.V..o..Y..^.. 
401080 00558bec 516a0068 44104000 c7013002 [email protected] 
401090 4200ff15 b0004200 85c07515 8d45fc68 B.....B...u..E.h 
4010a0 c00e4200 50c745fc 90704200 e85bbc01 ..B.P.E..pB..[.. 
4010b0 00c9c3e8 48ffffff f6d81bc0 25044000 ....H.......%[email protected] 
4010c0 80c20c00 e837ffff fff6d81b c0250440 .....7.......%[email protected] 
4010d0 0080c208 00558bec 568b7508 68c58240 [email protected] 
4010e0 00682072 4200ff75 0c8b4e40 68187242 .h [email protected] 
4010f0 00e8d771 00008bc8 e8e87100 008bc8e8 ...q......q..... 

Это свалка отдельных участков бинарного в. Первый столбец - это адрес этой строки, следующие четыре столбца показывают сбрасываемые данные в шестнадцатеричной нотации, а последний столбец показывает данные как символы ASCII с ., заменяемыми непечатаемыми символами.

Вторая часть выглядит следующим образом:

00401000 <.text>: 
    401000: 33 c0     xor %eax,%eax 
    401002: 39 05 28 94 42 00  cmp %eax,0x429428 
    401008: 0f 9f c0    setg %al 
    40100b: c3      ret  
    40100c: 55      push %ebp 
    40100d: 8b ec     mov %esp,%ebp 
    40100f: 51      push %ecx 
    401010: 56      push %esi 
    401011: 8b f1     mov %ecx,%esi 
    401013: 6a 01     push $0x1 
    401015: 68 44 10 40 00   push $0x401044 
    40101a: c7 06 30 02 42 00  movl $0x420230,(%esi) 
    401020: ff 15 b0 00 42 00  call *0x4200b0 

Это разборку в двоичной системе. Первый столбец содержит текущий адрес, затем вы видите инструкцию в шестнадцатеричной нотации и, наконец, соответствующую мнемонику. Обратите внимание, что эта часть существует только для разделов, помеченных как «содержит исполняемый код» в заголовке (в случае файлов PE это относится только к текстовому разделу). Если вам не нравится этот синтаксис ассемблера (AT & T синтаксис), поставка -Mintel получить выход в синтаксисе Intel:

00401000 <.text>: 
    401000: 33 c0     xor eax,eax 
    401002: 39 05 28 94 42 00  cmp DWORD PTR ds:0x429428,eax 
    401008: 0f 9f c0    setg al 
    40100b: c3      ret  
    40100c: 55      push ebp 
    40100d: 8b ec     mov ebp,esp 
    40100f: 51      push ecx 
    401010: 56      push esi 
    401011: 8b f1     mov esi,ecx 
    401013: 6a 01     push 0x1 
    401015: 68 44 10 40 00   push 0x401044 
    40101a: c7 06 30 02 42 00  mov DWORD PTR [esi],0x420230 
    401020: ff 15 b0 00 42 00  call DWORD PTR ds:0x4200b0 

Еще один полезный инструмент Agner Туман-х objconv, который имеет опции более полезны для исполняемых файлов Windows, и в целом обеспечивает более подробная разборка по сравнению с objdump.

+0

Спасибо за ваш ответ –

+0

Я попытался использовать '-s', чтобы получить дамп файла, но без успеха. Можете привести пример. Извините, но я относительно новичок в снарядах. –

+0

@ArulxZ Просто 'objdump -s foo.exe' должен сбрасывать программу в шестнадцатеричном формате. Какую ошибку вы получили? Что вы пробовали? – fuz

5

Исходный код и машинный код не совпадают.

Если у вас есть «Binutils» установлен, вы можете использовать objdump:

$ objdump --disassemble my-fantastic-program > my-fantastic-program.asm 

Это сбросит код сборки my-fantastic-program, и, конечно, на данный момент это не имеет значения, на каком языке была написана программа in

Часть с > использует перенаправление вывода оболочки для сохранения результата в новом файле.

+0

Спасибо за ваш ответ. Я тоже редактировал этот вопрос! –

+0

Когда я пытаюсь сгруппировать вывод в файл, он отображает все данные. Тем не менее, я просто хочу иметь код сборки. –

+0

@ArulxZ Попробуйте инструмент Agner Fog, если вы просто хотите, чтобы код сборки или постпроцесс выводил «objdump», чтобы удалить ненужный материал. – fuz

Смежные вопросы