@voproser45654
Мечтаю писать на машинных кодах

Как сказать процессору «выполни это»?

Наткнулся на сайте на такой код:
0000000 05ea 007c 3100 8ec0 8ed8 bcd0 7c00 1688
0000010 7cdb c031 c08e 00bb 8a80 db16 b67c b100
0000020 b502 b000 e830 0053 59e8 8400 75c0 fa30
0000030 010f f416 0f7c c020 8366 01c8 220f eac0
0000040 7c44 0008 b866 0010 d88e c08e e08e e88e
0000050 d08e 00bc 07c0 e800 03a4 0000 ebf4 befd
0000060 7cbc 03e8 f400 fdeb 5350 30fc b4ff ac0e
0000070 c084 0474 10cd f7eb 585b b4c3 cd02 7213
0000080 3102 c3c0 1e9c 0657 fa56 c031 d88e 10bf
0000090 f705 8ed0 bec0 0500 058a 2650 048a 2650
00000a0 04c6 c600 be05 8026 be3c 2658 0488 8858
00000b0 3105 74c0 4001 075e 1f5f c39d 3241 2030
00000c0 7369 6420 7369 6261 656c 2e64 4820 6c61
00000d0 2074 6874 2065 5043 2e55 0000 0000 0000
00000e0 0000 0000 ffff 0000 9a00 00cf ffff 0000
00000f0 9200 00cf 0017 7cdc 0000 0000 0000 0000
как например запихнуть это в exe файл? ибо при открытии других exe файлов там выводятся не что-то похожее на ранее приведенный код, а непонятные комбинации символов из юникода.
  • Вопрос задан
  • 306 просмотров
Решения вопроса 2
HemulGM
@HemulGM
Delphi Developer, сис. админ
Редактировать файл нужно HEX редактором, а не блокнотом
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как сказать процессору «выполни это»?

Превратить это в бинарник для начала и посмотреть, что там. Это можно (было бы) сделать командой xxd -r dump, но в твоём дампе странный порядок байтов в словах. Можно сначала перевернуть байты, а потом прогнать через xxd:
sed 's/\([^ ]*\)/\1/;s/ \(..\)\(..\)/ \2\1/g' < dump | xxd -r > bin
. Прогнав полученный код через дизассемблер можно понять (по переходу к адресу 0x7c05), что это код для бут-сектора:
$ objdump -b binary -m i8086 -D bin        

bin1:     file format binary

Disassembly of section .data:

00000000 <.data>:
   0:   ea 05 7c 00 00          ljmp   $0x0,$0x7c05
   5:   31 c0                   xor    %ax,%ax
...

Дальше можно записать этот код в образ диска и попытаться загрузиться с него:
$ head -c 254 /dev/zero >> bin
$ printf "\x55\xaa" >> bin
$ qemu-system-i386 -hda bin -d in_asm,exec -D log

Поискав в созданном логе адрес 7c00 можно увидеть, что код делает при выполнении:
----------------
IN:
0x00007c00:  ea 05 7c 00 00           ljmpw    $0x0:$0x7c05

Trace 0: 0x7f7a98164f00 [00000000/00007c00/0x40]
----------------
IN:
0x00007c05:  31 c0                    xorw     %ax, %ax
0x00007c07:  8e d8                    movw     %ax, %ds
0x00007c09:  8e d0                    movw     %ax, %ss

Trace 0: 0x7f7a98165040 [00000000/00007c05/0x40]
----------------
IN:
0x00007c0b:  bc 00 7c                 movw     $0x7c00, %sp

Trace 0: 0x7f7a98165180 [00000000/00007c0b/0x48]
----------------
IN:
0x00007c0e:  88 16 db 7c              movb     %dl, 0x7cdb
0x00007c12:  31 c0                    xorw     %ax, %ax
0x00007c14:  8e c0                    movw     %ax, %es
0x00007c16:  bb 00 80                 movw     $0x8000, %bx
0x00007c19:  8a 16 db 7c              movb     0x7cdb, %dl
0x00007c1d:  b6 00                    movb     $0, %dh
0x00007c1f:  b1 02                    movb     $2, %cl
0x00007c21:  b5 00                    movb     $0, %ch
0x00007c23:  b0 30                    movb     $0x30, %al
0x00007c25:  e8 53 00                 callw    0x7c7b

Trace 0: 0x7f7a98165280 [00000000/00007c0e/0x40]
----------------
IN:
0x00007c7b:  b4 02                    movb     $2, %ah
0x00007c7d:  cd 13                    int      $0x13

-- он хочет загрузить 48 секторов начиная со второго с текущего диска в память по адресу 0x8000, потом делает какую-то скучную фигню, а потом…
----------------
IN:
0x00007c2f:  fa                       cli
0x00007c30:  0f 01 16 f4 7c           lgdtw    0x7cf4
0x00007c35:  0f 20 c0                 movl     %cr0, %eax
0x00007c38:  66 83 c8 01              orl      $1, %eax
0x00007c3c:  0f 22 c0                 movl     %eax, %cr0

Linking TBs 0x7f7a98167580 [00007c2b] index 0 -> 0x7f7a981676c0 [00007c2f]
Trace 0: 0x7f7a981676c0 [00000000/00007c2f/0x40]
----------------
IN:
0x00007c3f:  ea 44 7c 08 00           ljmpw    $0x8:$0x7c44

Trace 0: 0x7f7a981678c0 [00000000/00007c3f/0xc0]
----------------
IN:
0x00007c44:  66 b8 10 00              movw     $0x10, %ax
0x00007c48:  8e d8                    movl     %eax, %ds

Trace 0: 0x7f7a98167a00 [00000000/00007c44/0x90]
----------------
IN:
0x00007c4a:  8e c0                    movl     %eax, %es

Trace 0: 0x7f7a98167b40 [00000000/00007c4a/0x90]
----------------
IN:
0x00007c4c:  8e e0                    movl     %eax, %fs
0x00007c4e:  8e e8                    movl     %eax, %gs
0x00007c50:  8e d0                    movl     %eax, %ss

Trace 0: 0x7f7a98167c80 [00000000/00007c4c/0x90]
----------------
IN:
0x00007c52:  bc 00 c0 07 00           movl     $0x7c000, %esp

Trace 0: 0x7f7a98167dc0 [00000000/00007c52/0xb8]
----------------
IN:
0x00007c57:  e8 a4 03 00 00           calll    0x8000

…переключается в защищённый режим и вызывает только что загруженный код.

как например запихнуть это в exe файл?

в exe-файл это запихнуть можно, но в таком виде как есть -- это бесполезно, потому что этот код привязан к абсолютным адресам.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы