§ Превью
Я очень давно искал инструмент, с помощью которого можно было бы откомплировать файл Си в мышиный код. Это произошло спустя несколько сотен лет. Итак:
1all:
2 bcc -O -0 main.c -Md -c main.o
3 ld86 main.o -o main.out
4 objdump86 main.out > main.txt
5 php out2bin.php main.txt MAIN.COM
6 rm *.o *.out *.txt
Компилирует файл main.c в особый код. Ниже приведен файл
main.c
:
1int main() {
2
3 unsigned char* m = (unsigned char*) 0xA000;
4
5 int i;
6 for (i = 0; i < 4096; i++) m[i] = i;
7 return 0;
8}
Что получается по итогу при вызове функции
objdump86 test
:
OBJECTFILE 'test'
HLEN 32
CPU i386 LITTLE_ENDIAN
FLAGS: A_EXEC
a_total = 0x00008038
a_syms = 0x00000020
text data bss dec hex filename
56 0 0 56 38 test
SYMBOLS
00000000 T _main
00000000 a main.off
TEXTSEG
: 55 89 e5 57 56 4c 4c c7 46 fa 00 a0 4c 4c 31 c0 U..WVLL.F...LL1.
: 89 46 f8 eb 10 8b 46 f8 03 46 fa 89 c3 8a 46 f8 .F....F..F....F.
: 88 07 ff 46 f8 81 7e f8 00 10 7c e9 31 c0 83 c4 ...F..~...|.1...
: 04 5e 5f 5d c3 00 00 00 .^_]....
DATASEG
Отсюда можно извлечь с помощью каких-нибудь скриптов необходимую последовательность байт и записать в виде COM-файла для запуска.
§ Код скрипта
Для извлечения бинарного кода.
1<?php
2
3$b = '';
4foreach (file($argv[1]) as $m) {
5
6 $x = "([0-9a-f]{2})";
7 if (preg_match("~:\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s+$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x~", $m, $c)) {
8 for ($i = 1; $i <= 16; $i++) $b .= chr(hexdec($c[$i]));
9 } else if (preg_match("~:\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x~", $m, $c)) {
10 for ($i = 1; $i <= 8; $i++) $b .= chr(hexdec($c[$i]));
11 }
12}
13
14file_put_contents($argv[2], $b);