рдЫрд╣ рдорд╣реАрдиреЗ рднреА рдирд╣реАрдВ рд╣реБрдП! рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдо рдирд┐рд░рд╛рд╢рд╛ рдФрд░ рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рдереЗред
рдЦреИрд░, рд▓рдбрд╝рдХреЗ рдиреЗ рдХрд╣рд╛ - рд▓рдбрд╝рдХреЗ рдиреЗ рдХрд┐рдпрд╛ред рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдЗрд╕ рдЕрдирд╛рдбрд╝реА рдвреЗрд░ рд╕реЗ, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдЬреАрдПрдирдпреВ / рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдУрдкрди 450 рд╕рдВрджрд░реНрдн рдХреЛ рдХреБрдЫ 450 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рднрд╛ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдореБрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдЯ рдХреЗ рддрд╣рдд рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдХ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:

рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧ рдЙрдкрд╡рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреЗрдбрд▓ рдХреЛ рдлрд░реНрд╢, рдФрд░ рдЖрдВрдЦ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рджрдмрд╛рддреЗ рд╣реИрдВред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрддрдиреЗ рдмреБрд░реЗ рдФрд░ рдмреЗрдХрд╛рд░ рдХреНрдпреЛрдВ рд╣реИрдВ? рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рдЬрди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЦреАрдВрдЪрддрд╛ рд╣реИ?
рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд░реБрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдкрдардиреАрдп рдФрд░ рдУрдмреНрдЬреЗрдХреНрдЯрдореНрдкред
рд╣рдо рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрддрд┐рдо рдмрд╛рд░ рдЗрдВрдЯреНрд░реЛ рдлрд╛рдЗрд▓ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣реА рдЬреЛ sstrip рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдмрдиреА рд░рд╣рддреА рд╣реИ:
$ readelf -a intro ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x8048250 Start of program headers: 52 (bytes into file) Start of section headers: 0 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 0 Section header string table index: 0 There are no sections in this file. There are no sections in this file. Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 RE 0x4 INTERP 0x000134 0x08048134 0x08048134 0x00015 0x00015 R 0x1 [Requesting program interpreter: /lib32/ld-linux.so.2] LOAD 0x000000 0x08048000 0x08048000 0x005ac 0x005ac RE 0x1000 LOAD 0x000f4c 0x08049f4c 0x08049f4c 0x000c4 0x00100 RW 0x1000 DYNAMIC 0x000f4c 0x08049f4c 0x08049f4c 0x000a8 0x000a8 RW 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 GNU_RELRO 0x000f4c 0x08049f4c 0x08049f4c 0x000b4 0x000b4 R 0x1 PAX_FLAGS 0x000000 0x00000000 0x00000000 0x00000 0x00000 0x4 Dynamic section at offset 0xf4c contains 16 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [libdl.so.2] 0x00000004 (HASH) 0x804814c 0x6ffffef5 (GNU_HASH) 0x8048164 0x00000005 (STRTAB) 0x80481ac 0x00000006 (SYMTAB) 0x804817c 0x0000000a (STRSZ) 45 (bytes) 0x0000000b (SYMENT) 16 (bytes) 0x00000015 (DEBUG) 0x0 0x00000003 (PLTGOT) 0x8049ff4 0x00000002 (PLTRELSZ) 16 (bytes) 0x00000014 (PLTREL) REL 0x00000017 (JMPREL) 0x8048210 0x6ffffffe (VERNEED) 0x80481e0 0x6fffffff (VERNEEDNUM) 1 0x6ffffff0 (VERSYM) 0x80481da 0x00000000 (NULL) 0x0 There are no relocations in this file. There are no unwind sections in this file. Histogram for bucket list length (total of 1 buckets): Length Number % of total Coverage 0 0 ( 0.0%) 1 0 ( 0.0%) 0.0% 2 1 (100.0%) 100.0% No version information found in this file.
(рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛рдПрдБ, рдЖрдХрд╛рд░ рдФрд░ рдирд╛рдк рдкреВрд░реЗ рдЯреВрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдФрд░ рдЖрдкрдХреЗ рдореАрд▓ рдХреА рдЖрдпреБ рдордИ рдмрд╛рд░рдмрд░рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ)
рд╣рдо рдпрд╣рд╛рдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ? рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдорд╛рдирдХ рдИрдПрд▓рдПрдл рд╣реИрдбрд░, рдЖрдкрдиреЗ рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рд╢рдмреНрдж рднреА рдирд╣реАрдВ рдлреЗрдВрдХрд╛ред рдЕрдЧрд▓рд╛, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ sstrip рдиреЗ рд╕рднреА рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рдЦрд░реЛрдВрдЪ рдХрд┐рдпрд╛ (рд╡реНрдпрд╛рдпрд╛рдо: readelf -a рдЗрдВрдЯреНрд░реЛ-рдореВрд▓ рдХреЗ рд╕рд╛рде рдЖрдЙрдЯрдкреБрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЬреЛ sstrip рд╕реЗ рдкрд╣рд▓реЗ рд╣реИ), рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдо рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рд╣реЙрд▓рд┐рдбреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдФрд░ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕реЗрдХреНрд╢рди (рдСрдлрд╝рд╕реЗрдЯ рдкрд░) рджреЗрдЦрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕реА рдкреЛрд╢рд╛рдХ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рд╕реБрдВрджрд░ рд╣реЛ?
Spoiler: рдирд╣реАрдВ! *
(* - рд╕рдВрд╢реЛрдзрди: рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ)
рд╣рдо рдХрд▓реНрдкрд┐рдд рдмреМрдиреЗ рдХрд╛рдЯрддреЗ рд╣реИрдВ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдиреНрдпреВрдирддрдо рдЖрдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдпреЛрдЧрд┐рдиреА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдЕрдм рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ рдЙрд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рд╣рдорд╛рд░реА рд╕рднреА рдЙрдкрдпреЛрдЧреА рдЖрдВрддреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред
simple.c:
void _start(void) { asm( "xor %eax,%eax\n" "inc %eax\n" "int $0x80\n" ); }
рдЖрдЗрдП рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрддреАрдд рд╕реЗ рд▓реА рдЧрдИ рд╣реИ):
cc -Wall -m32 -c simple.c -Os -nostartfiles -o simple-co && \ ld -melf_i386 -dynamic-linker /lib32/ld-linux.so.2 simple-co -o simple-c-orig && \ cp simple-c-orig simple-c && \ sstrip simple-c && \ cat simple-c | 7z a dummy -tGZip -mx=9 -si -so > simple-c.gz && \ cat unpack_header simple-c.gz > simple-c.sh && \ wc -c simple-c.sh && chmod +x simple-c.sh && \ ./simple-c.sh
рд╣рдо рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ:
- sstrip рдХрд╛ рдлреИрд╕рд▓рд╛ - рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рд░рд▓-рд╕реА рдХрд╛ рдЖрдХрд╛рд░ (рд▓рдЧрднрдЧ) рд╕рд░рд▓-рд╕реА-рдореВрд▓ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рддреАрди рдЧреБрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ
- рд╕рдВрдкреАрдбрд╝рди рд▓рдЧрднрдЧ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ - рдПрдХ рдЕрдирдкреИрдХрд┐рдВрдЧ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдлрд╝рд╛рдЗрд▓ рд▓рдЧрднрдЧ рдПрдХ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрднрдЧ рд▓реЗрддреА рд╣реИ
- (рдпрджрд┐ рдЖрдк -s рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд┐рдирд╛ рдЦреЛрдП рдпрд╛ рдордзреНрдпрд╡рд░реНрддреА рд╕реНрдЯреНрд░рд┐рдкреНрдб рдмрд╛рдЗрдирд░реА рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдмрд┐рдирд╛ рдЬреЛрдбрд╝ рдХреЗ рдЕрдирдЯреНрд░реИрдкреНрдб рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рддрд┐рд╣рд╛рдИ рдЬреАрдд рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрддрд┐рдо рд╕рдВрдкреАрдбрд╝рд┐рдд рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ _play_ 4 рдмрд╛рдЗрдЯреНрд╕ред
рднрд╡рд┐рд╖реНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрдХрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ!
рдЕрдм рдЖрдк рдмрд╛рдЗрдирд░реА рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рдЕрд╡рд╢реЗрд╖ рдХреНрдпрд╛ рд╣реИрдВ, рдпрд╣ рдХреНрдпрд╛ рдмрди рдЧрдпрд╛ рд╣реИ:
$ readelf -a simple-c ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x8048094 Start of program headers: 52 (bytes into file) Start of section headers: 0 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 3 Size of section headers: 40 (bytes) Number of section headers: 0 Section header string table index: 0 There are no sections in this file. There are no sections in this file. Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x0009e 0x0009e RE 0x1000 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 PAX_FLAGS 0x000000 0x00000000 0x00000000 0x00000 0x00000 0x4 There is no dynamic section in this file. There are no relocations in this file. There are no unwind sections in this file. No version information found in this file.
рддреЛ, sstrip рдЕрдЪреНрдЫреА рдлреИрд▓реЛ рд▓рдЧрддреА рд╣реИ, рд╣рдорд╛рд░реА рдпреЛрдЧрд┐рдиреА-рд▓рдбрд╝рдХреА рдХрд╛ рдЦрдВрдб, рдЗрди рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖рдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣рдорд╛рд░реА рдорд╣рд┐рд▓рд╛ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ - рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рдмреНрд░рд╛ (GNU_STACK рдФрд░ PAX_FLAGS рд╣реЗрдбрд░) рд╣реИ рдФрд░ рдкреИрдВрдЯреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдпрджрд┐ рдЖрдк рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рдХрд┐ LOAD рд╣реИрдбрд░ рдХрд╛ FileSiz рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдпрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрдЪрд░рд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреЛрдЧреНрдп рдФрд░ рд╡рд┐рдШрдЯрд┐рдд рд╣реИрдВ (objdump -D рдХреЗрд╡рд▓ рдПрдХ unstripe рдлрд╝рд╛рдЗрд▓ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ objdump рдЕрдиреБрднрд╛рдЧ рд╣реЗрдбрд░ рдкрдврд╝рддрд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ), рд╣рдордиреЗ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдкрд╣рд▓реА рддрд╛рдЬрдЧреА рдирд╣реАрдВ рдиреЛрдЯрд┐рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдФрд░ рдЙрдкрд╕рдВрд╣рд╛рд░ рд╕рдорд╛рд░реЛрд╣ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реЗ рдореЛрдЬрд╝реЗ:
00 55 push ebp 01 89e5 mov ebp, esp 03 31c0 xor eax, eax 05 40 inc eax 06 cd80 int 0x80 08 5d pop ebp 09 c3 ret
"рдЙрдкрдпреЛрдЧреА" рдХреЛрдб рдХреЗ 5 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЕрдиреБрдкрд╛рдд - рдмреЗрдХрд╛рд░ рдХреЛрдб рднреА рд╣рдорд╛рд░реЗ рдпреБрд╡рд╛ рджрд┐рд▓реЛрдВ рдХреЛ рдЧрд░реНрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╣рдорд╛рд░реЗ рдпреБрд╡рд╛ рджрд┐рд▓реЛрдВ рдХреЛ рдХреНрдпрд╛ рдЧрд░реНрдо рдХрд░реЗрдЧрд╛? рдЬрд▓рддреЗ рд╣реБрдП рдЕрд╡рд╢реЗрд╖ рдбрд╛рдпрдирд╛рд╕реЛрд░ рдФрд░ рджрд▓рджрд▓ рдХреЗ рдмрдиреЗ рд╣реБрдП рд╣реИрдВред рдЗрди рдмрд╣реБрдд рд╕рдВрдХреБрдЪрд┐рдд рджрд▓рджрд▓ рдореЗрдВ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк, рдореЗрд░реЗ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдкрд╛рдардХ, рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡рд┐рд╕рд░реНрдЬрд┐рдд рдХрд░реЗрдВред
рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рд╕реЗ рдпреЛрдЧрд┐рдиреА рдмрдирд╛рдПрдВ
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдПрдХ рдпреЛрдЧрд┐рдиреА рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рддрд╛рд░реЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, /usr/include/elf.h рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ, рдХреБрдЫ рднреА рди рд╕рдордЭреЗрдВ, рдпреЛрдЧрд┐рдиреА elf.pdf рдлрд╝рд╛рдЗрд▓, рдЗрд╕реЗ рддрд┐рд░рдЫреЗ рдкрдврд╝реЗрдВ рдФрд░ рдЕрдкрдиреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рд╕реЗ рдлрд╛рдбрд╝ рджреЗрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд:
bits 32 ; 32- org 0x00040000 ; , , - $$ ; ? . ( ) ; elf- db 0x7f, 'ELF' ; magic , , ELF db 1 ; EI_CLASS = ELFCLASS32 db 1 ; EI_DATA ELFDATA2LSB db 1 ; EI_VERSION = EV_CURRENT times 9 db 0 ; 9 , dw 2 ; e_type = ET_EXEC -- dw 3 ; e_machine = EM_386 dd 1 ; e_version = EV_CURRENT dd _start ; e_entry -- , dd phdrs - $$ ; e_phoff -- , program headers dd 0 ; e_shoff -- --//-- section headers, , , , 0 dd 0 ; e_flags -- dw ehsize ; e_ehsize -- ELF- (52 ) dw phsize ; e_phentsize -- program header (32 ) dw 1 ; e_phnum -- dw 0 ; e_shentsize -- section header dw 0 ; e_shnum -- () dw 0 ; e_shstrndx -- - , ehsize equ ($-$$) ; $ (+ org), ehsize elf- phdrs: ; program header dd 1 ; p_type = PT_LOAD -- " , " dd 0 ; p_offset -- , dd $$ ; p_vaddr -- , dd $$ ; p_paddr -- , - - , , dd file_size ; p_filesz -- , dd file_size ; p_memsz -- . , e_filesz, . -- 6 . . !!11 , , . . dd 7 ; p_flags (=PF_RWX) -- , . dd 0x1000 ; p_align -- , , . 0x1000 phsize equ ($-phdrs) ; program header _start: ; xor eax, eax ; eax = 0 inc eax ; eax = 1 (exit syscall) int 0x80 ; syscall file_size equ ($-$$) ;
(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдЕрд╕рднреНрдп рдХреЛ рджреЗрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдЕрдкрдорд╛рдирдЬрдирдХ, рдПрдПрд╕рдПрдо рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ, рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЖрдк, рдореЗрд░реЗ рдкреНрдпрд╛рд░реЗ рдкреНрдпрд╛рд░реЗ, рдЧрд▓реЗ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдбрд╝реЗ рдИрдПрд▓рдПрдл рдкреНрд░рд╛рд░реВрдк рдЖрд░реЗрдЦ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдПрдХ рдЬреЛрдбрд╝реЗ рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрдЧрд╛ред рд╡рд░реНрд╖)
рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЗрдбрд░ рдХреЗ рдмрд┐рдирд╛ "рдлреНрд▓реИрдЯ" рдмрд╛рдЗрдирд░реА рдореЗрдВ рд╕рдВрдХрд▓рди рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$ nasm -f bin simple.asm -o simple-asm
рдпрд╣ рд▓рд╛рдЗрди 89-рдмрд╛рдЗрдЯ рд╕рд┐рдВрдкрд▓-рдПрдПрд╕рдПрдо рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдЧреА, рдЬреЛ рдХрд┐ 206-рдмрд╛рдЗрдЯ рдореЙрдиреНрд╕реНрдЯрд░ рдХрд╛ рдПрдХ рдлрдВрдХреНрд╢рдирд▓ рдПрдирд╛рд▓реЙрдЧ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛ред рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ 206 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореВрд▓ рдЕрд╕рдВрдкреАрдбрд╝рд┐рдд рдкрд╛рдЧрд▓рдкрди рдХреЗ 657 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
chmod +x simple-asm
рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реИрдз рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ 89 рдмрд╛рдЗрдЯреНрд╕ рд╕реАрдорд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВ, рдФрд░ рдЖрдк рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рд▓рдЧрднрдЧ рджреЛ рдмрд╛рд░ рдЧрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдкрд░ рдПрд▓реНрдл рд╣реЗрдбрд░ рдбрд╛рд▓реЗрдВ, рдФрд░ рди рдХреЗрд╡рд▓ рдПрдХ рд╕реБрдкрд░-рд╡реИрдз рдпреЛрдЧрд┐рдиреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЖрдХрд╛рд░ рдореЗрдВ рдЫреЛрдЯрд╛ рд╣реЛрдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдХреНрд╖рдо рд╣реИ, рдПрд▓реНрдл рд╣реЗрдбрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрд╡рдпрдВ (рдЗрд╕рд╕реЗ рдЕрдВрддрд┐рдо 6 рдмрд╛рдЗрдЯреНрд╕ рд╕реНрд╡рддрдГ рд╣реА рд╢реВрдиреНрдп рджреНрд╡рд╛рд░рд╛ рдорд╛рд░реЗ рдЬрд╛рдПрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)
[1] ред рдпрд╣ рдЕрдиреИрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЕрджреНрднреБрдд рдлрд╛рдЗрд▓реЗрдВ / рджреЗрд╡ / fb0 рдФрд░ / рджреЗрд╡ / рдбреАрдПрд╕рдкреА рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк 128-256-512 рдмрд╛рдЗрдЯреНрд╕ рдбреЙрд╕-рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рдЗрдВрдЯреНрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдпрд╣рд╛рдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдПрдХ рдЕрд▓рдЧ рдвреЗрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред
рдФрд░ рд╣рдо рдпрд╣рд╛рдВ рдУрдкрдирдЬреАрдПрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗред
рд░рд╛рдХреНрд╖рд╕реА рд▓рд┐рдВрдХ
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдУрдкрдирдЬреАрдПрд▓ рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрд╕рдбреАрдПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдерд╛, рдЬреИрд╕реЗ рдХрд┐ libSDL.soред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдореЗрдВ рдЦреБрдж рднреА OpenGL рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ libGL.so рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╣реЛрдордореЗрдб рдмрд╛рдЗрдирд░реА рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдХрдо рд╕реНрддрд░ рдкрд░ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХрд╛ рддрдВрддреНрд░ рдмрд╣реБрдд рд╣реА рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╣реИред рдмрд╛рдЗрдирд░реА рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╕рд┐рд╕реНрдЯрдо PT_INTERP рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЗрдбрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред "рд╣рд╛рдБ, рдЖрдк рдЕрдкрдиреЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЧрдзреЗ рдХреЗ рдкрд╛рд╕ рдЧрдП, рдЕрдЧрд░ рдЖрдк рдмрд╣реБрдд рд╕реНрдорд╛рд░реНрдЯ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЦреБрдж рд╣реА рд╕реБрд▓рдЭрд╛ рд▓реЗрдВ," рд╕рд┐рд╕реНрдЯрдо рдХрд╣рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдирд░реА рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рджреБрднрд╛рд╖рд┐рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЖрдЧреЗ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИ - рдпрд╣, рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖ рдерд╛, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ PT_LOAD рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, PT_DYNAMIC рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ - рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдирд╛рдо, рдлрд╝рдВрдХреНрд╢рди, рдЬрд╣рд╛рдВ , рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПред PT_DYNAMIC рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рджреЛрд╣рд░реЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ d_tag тАЛтАЛрдФрд░ d_val, рдЬрд╣рд╛рдВ d_tag тАЛтАЛрдкреИрд░рд╛рдореАрдЯрд░ рдХреЛрдб рд╣реИ рдФрд░ d_val рдЗрд╕рдХрд╛ рдорд╛рди рд╣реИ, рдЬреЛ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрддрд╛ рд╣реИ (рдпрд╛ рдЬреЛ рднреА рд╣реЛ рдЙрд╕рдХреЗ рдмрд╛рдж)ред
рдХрд┐рди рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЖрдЗрдП рдЕрдкрдиреА рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рдбрдВрдк рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рд╕рдм рдХреБрдЫ рджреЗрдЦреЗрдВред рд▓рд╛рдЗрди рдХреЗ рдмрд╛рдж "рдСрдлрд╕реЗрдЯ рдкрд░ рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕реЗрдХреНрд╢рди ..."ред
рдбрд░рд╛рд╡рдирд╛!
рд╣рдо рдЦреБрдж рдХреЛ рдЗрд╕ рд╕реЛрдЪ рдХреЗ рд╕рд╛рде рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рддрд┐рд╣рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЙрддреНрд╕рд╛рд╣, рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреВрд░ рдирд╣реАрдВ рд╣реИ - рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рдЕрднреА рднреА рднрдпрд╛рдирдХ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЙрдирдХреЗ рдЕрд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рдКрдВрдЧрд╛ - рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдЦреБрдж рдпрд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЙрдард╛рдпрд╛ рдерд╛), рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рднреВрд▓ рдЬрд╛рдКрдВрдЧрд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдпрд╛рдж рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЖрдк рдХреЗ рд▓рд┐рдП, рдкреНрд░рд┐рдп рдкрд╛рдардХ, рдореИрдВ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдПрдХ рдкрддрд▓реА рдкрд░рдд рдХреЗ рд╕рд╛рде рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рддреИрдпрд╛рд░ рдПрдХ рддреИрдпрд╛рд░ рдиреБрд╕реНрдЦрд╛ рд▓рд╛рддрд╛ рд╣реВрдВред рд╕реНрд╡рд╛рд╕реНрдереНрдп рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдпрд╣ рдЯреБрдХрдбрд╝рд╛ phsize рдЧрдгрдирд╛ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж phdrs рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:
dd 2 ; p_type = PT_DYNAMIC dd dynamic - $$ ; p_offset dd dynamic ; p_vaddr dd dynamic ; p_paddr dd dynamic_size ; p_filesz dd dynamic_size ; p_memsz dd 6 ; p_flags = PF_RW dd 4 ; p_align dd 3 ; p_type = PT_INTERP dd interp - $$ ; p_offset dd interp ; p_vaddr dd interp ; p_paddr dd interp_size ; p_filesz dd interp_size ; p_memsz dd 4 ; p_flags = PF_R dd 1 ; p_align ; PT_DYNAMIC ; dynamic: dd 1, st_libdl_name ; DT_NEEDED -- , st_libdl_name ( ) ; , , ;dd 1, st_libSDL_name ;dd 1, st_libGL_name dd 4, dt_hash ; DT_HASH -- dd 5, dt_strtab ; DT_STRTAB -- . dd 6, dt_symtab ; DT_SYMTAB -- dd 10, dt_strtab_size ; DT_STRSZ -- dd 11, dt_symtab_size ; DT_SYMENT -- dd 17, dt_rel ; DT_REL -- dd 18, dt_rel_size; DT_RELSZ -- dd 19, 8 ; DT_RELENT -- dd 0, 0 ; DT_NULL -- DT_DYNAMIC dynamic_size equ $ - dynamic ; DT_HASH ; - ; , ; dt_hash: dd 1, 3, 0, 0, 0, 0 ; DT_SYMTAB ; , dt_symtab: ; 0 -- (?!) dd 0, 0, 0 dw 0, 0 ; SHN_UNDEF ; 1 'dlopen' dd st_dlopen_name, 0, 0 dw 0x12 ; = ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), .., , -- dw 0 ; SHN_UNDEF , , ; 2 'dlsym' dd st_dlsym_name, 0, 0 dw 0x12, 0 ; --//-- dt_symtab_size equ $ - dt_symtab ; DT_REL ; . , dt_rel: dd rel_dlopen ; , dd 0x0101 ; ELF32_R_INFO(1,R_386_32) : dt_symtab[1] ('dlopen'), = + r_addend(=0 ) dd rel_dlsym ; --//-- dd 0x0201 ; ELF32_R_INFO(2,R_386_32) : dt_symtab[2] ('dlsym'), --//-- dt_rel_size equ $ - dt_rel ; -- , ; DT_STRTAB ; . , PT_DYNAMIC -- dt_strtab: st_libdl_name equ $ - dt_strtab ; db 'libdl.so.2', 0 ; -- - st_dlopen_name equ $ - dt_strtab db 'dlopen', 0 st_dlsym_name equ $ - dt_strtab db 'dlsym', 0 dt_strtab_size equ $ - dt_strtab ; interp: db '/lib/ld-linux.so.2', 0 interp_size equ $ - interp
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ e_phnum рдХреЛ 3 рдореЗрдВ рдмрджрд▓реЗрдВ
- рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
; BSS-, absolute $ bss: ; rel_dlopen: resd 1 rel_dlsym: resd 1 mem_size equ ($-$$)
- PT_OAD рд╣реЗрдбрд░ p_memsz рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП mem_size
рдпрд╣реА рд╣реИ, рдЕрдм рд╣рдорд╛рд░реЗ рдорд╛рдирд╡ рдирд┐рд░реНрдорд┐рдд рдпреЛрдЧрд┐рдиреА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рджреЗрдЦреЗрдВред
рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЗрдВрдЯреНрд░рд╛, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ intro.asm рд╣реИред рдЪрд▓реЛ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ:
$ nasm -f bin intro.asm -o intro && chmod +x intro
рдФрд░ рд╕реНрдЯреНрд░реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝реЗрдВ рдХрд┐ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдФрд░ рдЗрддрдиреЗ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ:
$ strace ./intro execve("./intro", ["./intro"], []) = 0 [ Process PID=24135 runs in 32 bit mode. ] ... open("/lib32/libdl.so.2", O_RDONLY) = 3 ...
рдЕрдм рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ - 368 рдЕрд╕рдореНрдкреАрдбрд┐рдд рдмрд╛рдЗрдЯреНрд╕ред рдЖрдк рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ (cc + ld) рдПрдХ рд╕рдорд╛рди рдЕрд╕рдореНрдкреАрдбрд┐рдд рдлрд╝рд╛рдЗрд▓ рддреБрд░рдВрдд 4 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдореЗрдВ рдЖ рдЬрд╛рдПрдЧреАред
рд╕рдВрдкреАрдбрд╝рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рдЬрди рдХрд┐рддрдирд╛ рд╣реЛрдЧрд╛?
nasm -f bin intro.asm -o intro && chmod +x intro && \ cat intro | 7z a dummy -tGZip -mx=9 -si -so > intro.gz && \ cat unpack_header intro.gz > intro.sh && \ wc -c intro.sh && chmod +x intro.sh && \ ./intro.sh
254 рдмрд╛рдЗрдЯреНрд╕ред
рд▓реЗрдХрд┐рди рд╡рд╣ рдлрд┐рд░ рднреА рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ред
рдЙрд╕реЗ рдХрд░рдиреЗ рджреЛ!
рдЕрдм, рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдЕрдкрдиреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ dlopen рдФрд░ dlsym рдорд┐рд▓рд╛ рд╣реИ, рд╣рдо рдЕрдВрдд рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА libSDL рдФрд░ libGL рд╕реЗ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдХрд┐рдП рдЧрдП рд╣рд░ рдЪреАрдЬрд╝ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:
; , libs_to_dl: st_libSDL_name equ $ - dt_strtab db 'libSDL-1.2.so.0', 0 ; - , db 'SDL_Init', 0 db 'SDL_SetVideoMode', 0 db 'SDL_PollEvent', 0 db 'SDL_GetTicks', 0 db 'SDL_ShowCursor', 0 db 'SDL_GL_SwapBuffers', 0 db 'SDL_Quit', 0 db 0 ; = st_libGL_name equ $ - dt_strtab db 'libGL.so.1', 0 db 'glViewport', 0 db 'glCreateShader', 0 db 'glShaderSource', 0 db 'glCompileShader', 0 db 'glCreateProgram', 0 db 'glAttachShader', 0 db 'glLinkProgram', 0 db 'glUseProgram', 0 db 'glRectf', 0 db 0, 0 ; = _start: ; mov ebp, bss ; ebp bss -- , ! ; - , %define BSSADDR(a) ebp + ((a) - bss) %define F(f) [ebp + ((f) - bss)] ; mov esi, libs_to_dl+1 ; +1, .. ld_load , lea edi, [BSSADDR(libs_syms)] ; edi = , ld_load: dec esi ; 1, ; dlopen, push 1 ; RTLD_LAZY push esi ; call F(rel_dlopen) ; eax = dlopen([esi], 1) ; , <s> </s> mov ebx, eax ; , dlopen , ebx ; 0 ld_skip_to_zero: lodsb test al, al jnz ld_skip_to_zero ; \0 lodsb test al, al jz ld_second_zero dec esi ; 1 push esi ; push ebx ; dlopen call F(rel_dlsym) ; eax = dlsym([ebx], [esi]) stosd ; eax ( ) [edi], edi += 4 jmp ld_skip_to_zero ; ld_second_zero: ; , - ! lodsb test al, al jnz ld_load ; ! ; ! xor eax, eax ; eax = 0 inc eax ; ex = 1 (exit syscall) int 0x80 ; syscall file_size equ ($-$$) ; ; BSS-, absolute $ bss: ; libdl_syms: rel_dlopen: resd 1 rel_dlsym: resd 1 libs_syms: SDL_Init: resd 1 SDL_SetVideoMode: resd 1 SDL_PollEvent: resd 1 SDL_GetTicks: resd 1 SDL_ShowCursor: resd 1 SDL_GL_SwapBuffers: resd 1 SDL_Quit: resd 1 glViewport: resd 1 glCreateShader: resd 1 glShaderSource: resd 1 glCompileShader: resd 1 glCreateProgram: resd 1 glAttachShader: resd 1 glLinkProgram: resd 1 glUseProgram: resd 1 glRectf: resd 1 mem_size equ ($-$$)
рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ _start рдХреЗ рдмрд╛рдж рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬрд╝ рдХреЗ рдмрдЬрд╛рдп рдбрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ _start рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рд╣рдо рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЖрдХрд╛рд░ рдореЗрдВ 455 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ, рдЪрд▓рд╛рдПрдВ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рди рд╣реЛред рдпрджрд┐ рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо libSDL рдФрд░ libGL рдХреЗ рд▓рд┐рдП DT_NEEDED рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдкреАрдбрд╝рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рдкрдврд╝рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рдЖрдк рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА OpenGL рдХреЛ shaders рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╣рдо рд╕рд┐рд░реНрдл рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдордХреНрдЦреА рдкрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдерд╛ред
; nasm -f bin intro.asm -o intro && chmod +x intro && \ ; cat intro | 7z a dummy -tGZip -mx=9 -si -so > intro.gz && \ ; cat unpack_header intro.gz > intro.sh && \ ; wc -c intro.sh && chmod +x intro.sh && \ ; ./intro.sh %define WIDTH 640 %define HEIGHT 360 %define FULLSCREEN 0 ;%define FULLSCREEN 0x80000000 bits 32 ; 32- org 0x00040000 ; , , - $$ ; ? . ( ) ; elf- db 0x7f, 'ELF' ; magic , , ELF db 1 ; EI_CLASS = ELFCLASS32 db 1 ; EI_DATA ELFDATA2LSB db 1 ; EI_VERSION = EV_CURRENT times 9 db 0 ; 9 , dw 2 ; e_type = ET_EXEC -- dw 3 ; e_machine = EM_386 dd 1 ; e_version = EV_CURRENT dd _start ; e_entry -- , dd phdrs - $$ ; e_phoff -- , program headers dd 0 ; e_shoff -- --//-- section headers, , , , 0 dd 0 ; e_flags -- dw ehsize ; e_ehsize -- ELF- (52 ) dw phsize ; e_phentsize -- program header (32 ) dw 3 ; e_phnum -- dw 0 ; e_shentsize -- section header dw 0 ; e_shnum -- () dw 0 ; e_shstrndx -- - , ehsize equ ($-$$) ; $ (+ org), ehsize elf- phdrs: ; program header dd 1 ; p_type = PT_LOAD -- " , " dd 0 ; p_offset -- , dd $$ ; p_vaddr -- , dd $$ ; p_paddr -- , - - , , dd file_size ; p_filesz -- , dd mem_size ; p_memsz -- . , e_filesz, . -- 6 . . !!11 , , . . dd 7 ; p_flags (=PF_RWX) -- , . dd 0x1000 ; p_align -- , , . 0x1000 phsize equ ($-phdrs) ; program header dd 2 ; p_type = PT_DYNAMIC dd dynamic - $$ ; p_offset dd dynamic ; p_vaddr dd dynamic ; p_paddr dd dynamic_size ; p_filesz dd dynamic_size ; p_memsz dd 6 ; p_flags = PF_RW dd 4 ; p_align dd 3 ; p_type = PT_INTERP dd interp - $$ ; p_offset dd interp ; p_vaddr dd interp ; p_paddr dd interp_size ; p_filesz dd interp_size ; p_memsz dd 4 ; p_flags = PF_R dd 1 ; p_align ; PT_DYNAMIC ; dynamic: dd 1, st_libdl_name ; DT_NEEDED -- , st_libdl_name ( ) ; , , ;dd 1, st_libSDL_name ;dd 1, st_libGL_name dd 4, dt_hash ; DT_HASH -- dd 5, dt_strtab ; DT_STRTAB -- . dd 6, dt_symtab ; DT_SYMTAB -- dd 10, dt_strtab_size ; DT_STRSZ -- dd 11, 16 ; DT_SYMENT -- dd 17, dt_rel ; DT_REL -- dd 18, dt_rel_size; DT_RELSZ -- dd 19, 8 ; DT_RELENT -- dd 0, 0 ; DT_NULL -- DT_DYNAMIC dynamic_size equ $ - dynamic ; DT_HASH ; - ; , ; dt_hash: dd 1, 3, 0, 0, 0, 0 ; DT_SYMTAB ; , dt_symtab: ; 1 -- (?!) dd 0, 0, 0 dw 0, 0 ; SHN_UNDEF ; 2 'dlopen' dd st_dlopen_name, 0, 0 dw 0x12 ; = ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), .., , -- dw 0 ; SHN_UNDEF , , ; 3 'dlsym' dd st_dlsym_name, 0, 0 dw 0x12, 0 ; --//-- ; DT_REL ; . , dt_rel: dd rel_dlopen ; , dd 0x0101 ; ELF32_R_INFO(1,R_386_32) : dt_symtab[1] ('dlopen'), = + r_addend(=0 ) dd rel_dlsym ; --//-- dd 0x0201 ; ELF32_R_INFO(2,R_386_32) : dt_symtab[2] ('dlsym'), --//-- dt_rel_size equ $ - dt_rel ; -- , ; interp: db '/lib/ld-linux.so.2', 0 interp_size equ $ - interp ; DT_STRTAB ; . , PT_DYNAMIC -- dt_strtab: st_libdl_name equ $ - dt_strtab ; db 'libdl.so.2', 0 ; -- - st_dlopen_name equ $ - dt_strtab db 'dlopen', 0 st_dlsym_name equ $ - dt_strtab db 'dlsym', 0 dt_strtab_size equ $ - dt_strtab ; , libs_to_dl: st_libSDL_name equ $ - dt_strtab db 'libSDL-1.2.so.0', 0 ; - , db 'SDL_Init', 0 db 'SDL_SetVideoMode', 0 db 'SDL_PollEvent', 0 db 'SDL_GetTicks', 0 db 'SDL_ShowCursor', 0 db 'SDL_GL_SwapBuffers', 0 db 'SDL_Quit', 0 db 0 ; = st_libGL_name equ $ - dt_strtab db 'libGL.so.1', 0 db 'glViewport', 0 db 'glCreateShader', 0 db 'glShaderSource', 0 db 'glCompileShader', 0 db 'glCreateProgram', 0 db 'glAttachShader', 0 db 'glLinkProgram', 0 db 'glUseProgram', 0 db 'glRectf', 0 db 0, 0 ; = shader_vtx: db 'varying vec4 p;' db 'void main(){gl_Position=p=gl_Vertex;pz=length(p.xy);}' db 0 shader_frg: db 'varying vec4 p;' db 'void main(){' db 'float ' db 'z=1./length(p.xy),' db 'a=atan(px,py)+sin(p.z+z);' db 'gl_FragColor=' db '2.*abs(.2*sin(pz*3.+z*3.)+sin(p.z+a*4.)*p.xyxx*sin(vec4(z,a,a,a)))+(z-1.)*.1;' db '}', 0 _start: ; mov ebp, bss ; ebp bss -- , ! ; - , %define BSSADDR(a) ebp + ((a) - bss) %define F(f) [ebp + ((f) - bss)] ; mov esi, libs_to_dl+1 ; +1, .. ld_load , lea edi, [BSSADDR(libs_syms)] ; edi = , ld_load: dec esi ; 1, ; dlopen, push 1 ; RTLD_LAZY push esi ; call F(rel_dlopen) ; eax = dlopen([esi], 1) ; , <s> </s> mov ebx, eax ; , dlopen , ebx ; 0 ld_skip_to_zero: lodsb test al, al jnz ld_skip_to_zero ; \0 lodsb test al, al jz ld_second_zero dec esi ; 1 push esi ; push ebx ; dlopen call F(rel_dlsym) ; eax = dlsym([ebx], [esi]) stosd ; eax ( ) [edi], edi += 4 jmp ld_skip_to_zero ; ld_second_zero: ; , - ! lodsb test al, al jnz ld_load ; ! push 0x21 ; SDL_INIT_ TIMER | VIDEO call F(SDL_Init) ; SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO); push 2 | FULLSCREEN ; SDL_OPENGL push 32 ; 32 push HEIGHT push WIDTH call F(SDL_SetVideoMode) ; SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL|FULLSCREEN); ; WxH ! cdecl ftw! push 0 push 0 call F(glViewport) ; glViewport(0, 0, WIDTH, HEIGHT); call F(SDL_ShowCursor) ; SDL_ShowCursor(0); ; call F(glCreateProgram) ; eax = glCreateProgram(); mov edi, eax ; edi = program_id push 0x8b31 pop esi ; esi = GL_VERTEX_SHADER ; 4 ebp temp -- dlopen, mov dword [ebp], shader_vtx push esi call F(glCreateShader) ; eax = glCreateShader(GL_VERTEX_SHADER); mov ebx, eax push 0 push ebp push 1 push eax call F(glShaderSource) ; glShaderSource(shader_id, 1, &shader_vtx, 0); push ebx ; nVidia , call F(glCompileShader) ; glCompileShader(shader_id); push ebx ; ! push edi call F(glAttachShader) ; glAttachShader(program_id, shader_id); dec esi ; esi = GL_FRAGMENT_SHADER mov dword [ebp], shader_frg ; , = ! push esi call F(glCreateShader) mov ebx, eax push 0 push ebp push 1 push eax call F(glShaderSource) push ebx call F(glCompileShader) push ebx push edi call F(glAttachShader) push edi call F(glLinkProgram) ; glLinkProgram(program_id); call F(glUseProgram) ; glUseProgram(program_id); mainloop: call F(SDL_GetTicks) ; eax == SDL_GetTicks(); -- mov [ebp], eax fninit ; FPU, fild dword [ebp] ; st(0) = eax == time , st(1) = 1000 push 400 ; , , fild dword [esp] ; st(0) = 1000 fdiv ; st(0) /= 1000 = fld1 ; st(0) = 1, st(1) = faddp st1 ; st(0) = + 1 fst dword [ebp] mov eax, [ebp] ; eax = (float-ieee)t fchs ; st(0) = -st(0) fstp dword [ebp] mov ebx, [ebp] ; ebx = -(float-ieee)t push ebx push ebx push eax push eax call F(glRectf) ; glRectf(-t,-t,t,t) times 5 pop eax ; , , , .. call F(SDL_GL_SwapBuffers) lea edx, [BSSADDR(SDL_Event)] ; SDL_Event push edx call F(SDL_PollEvent) ; SDL_PollEvent(&SDL_Event); pop edx ; edx cmp byte [edx], 2 ; SDL_Event.type != SDL_KEYDOWN jnz mainloop call F(SDL_Quit) ; ; ! xor eax, eax ; eax = 0 inc eax ; ex = 1 (exit syscall) int 0x80 ; syscall file_size equ ($-$$) ; ; BSS-, absolute $ bss: ; libdl_syms: rel_dlopen: resd 1 rel_dlsym: resd 1 libs_syms: SDL_Init: resd 1 SDL_SetVideoMode: resd 1 SDL_PollEvent: resd 1 SDL_GetTicks: resd 1 SDL_ShowCursor: resd 1 SDL_GL_SwapBuffers: resd 1 SDL_Quit: resd 1 glViewport: resd 1 glCreateShader: resd 1 glShaderSource: resd 1 glCompileShader: resd 1 glCreateProgram: resd 1 glAttachShader: resd 1 glLinkProgram: resd 1 glUseProgram: resd 1 glRectf: resd 1 SDL_Event: resb 24 mem_size equ ($-$$)
рджреЗрдЦреЛ, рдмрд┐рд▓реНрд▓реА рдХреЗ рдмрдЪреНрдЪреЗ, рд╣рдо 750 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ 1024 рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?рдмреЗрд╢рдХ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:- рдХрдИ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЙрд╕реА рдЪреАрдЬ рдкрд░ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИрдВ
- рдпрд╣ рд╕рдорд╛рди рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ (рдвреАрд▓реЗ рд╣реЗрдбрд░ рдПрдХ рд╕рд╛рде, рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде, x86 рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
- рдСрд░реНрдЧрди рдмрджрд▓реЗрдВ
- рдЪрд╛рд░реЛрдВ рдУрд░ рдлреЗрдВрдХ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SDL_ShowCursor рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ
рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рдВрдкреАрдбрд╝рд┐рдд рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдЕрд╕рдореНрдкреАрдбрд┐рдд рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХрд░реВрдкрддрд╛ рд╕реЗ рджреВрд░ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдИ рдмрд╛рд░ 5 рдкреЙрдк рдИрдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕ рдРрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдХрд╛рд░ рдореЗрдВ рдЬреАрддрддрд╛ рд╣реИ, 20редрдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╣рд┐рд▓рд╛рдиреЗ рд╕реЗ 16 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рд▓рд╛рдн рдорд┐рд▓рддрд╛ рд╣реИ, рдЙрд╕реА рд░рд╛рд╢рд┐ рдХреЛ рдЬреАрддрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ рддреАрди рдЕрдирд╛рд╡рд╢реНрдпрдХ рдпреЛрдЧрд┐рдиреА рд╣реИрдбрд░ рдлрд╝реАрд▓реНрдб (e_shentsize рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рджреЛ рдЧреЛрдЬрд╝) рдХреЗ рд╕рд╛рде рдЧрдВрджреА рдЭрд╛рдбрд╝реВ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ phdrs рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХ, dt_hash рдФрд░ dt_mymtab рдХреЗ рдмреАрдЪ рд╢реВрдиреНрдп рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╣рдЯрд╛рдПрдВредрдХреБрд▓: рдЙрд╕реА рдХреЗ рд▓рд┐рдП 718 рдмрд╛рдЗрдЯреНрд╕редрдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╣рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреБрдЬрд▓реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдк рд╡рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рд╕рднреА рдЖрдЬ рдпрд╣рд╛рдВ рдЗрдХрдЯреНрдард╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд░рдЪрдирд╛рддреНрдордХрддрд╛! рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП 306 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВ (рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рддрдереНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рд▓реБрдкреНрдд рд╕реБрд░рдВрдЧ рдХреЗ рд╕рд╛рде рд░рдВрдЧреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ)!рдРрд╕реЗ рдЕрдХрд▓реНрдкрдиреАрдп рд╡рд┐рд╢рд╛рд▓ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдХреБрдЫ
(рдзреНрдпрд╛рди рд╕реЗ, рдЖрдкрдХреЛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ): shader_vtx: db 'varying vec4 p,v;' db 'void main()' db '{' db 'gl_Position=gl_Vertex;' db 'p=vec4(mat3(cos(length(gl_Vertex.xy)),0.,sin(length(gl_Vertex.xy)),0.,1.,0.,-sin(length(gl_Vertex.xy)),0.,cos(length(gl_Vertex.xy)))*vec3(gl_Vertex.xy*.1,-.9),length(gl_Vertex.xy));' db 'v=vec4(mat3(cos(length(gl_Vertex.xy)),0.,sin(length(gl_Vertex.xy)),0.,1.,0.,-sin(length(gl_Vertex.xy)),0.,cos(length(gl_Vertex.xy)))*vec3(gl_Vertex.xy*.1,.1),length(gl_Vertex.xy));' db '}' db 0 shader_frg: db 'varying vec4 p,v;' ;db 'float mx(vec3 a){return max(ax,max(ay,az));}' db 'float mn(vec3 a){return min(ax,min(ay,az));}' db 'float F(vec3 a){return min(mn(vec3(1.)-abs(a)),-mn(abs(mod(a+vec3(.1),vec3(.4))-vec3(.2))-.15));}' ;db 'float F(vec3 a){return min(mn(vec3(1.)-abs(a)),length(mod(a,vec3(.4))-vec3(.2))-.06);}' db 'vec3 n(vec3 a){' db 'vec3 e=vec3(.0001,.0,.0);' db 'return normalize(vec3(F(a)-F(a+e.xyy),F(a)-F(a+e.yxy),F(a)-F(a+e.yyx)));' db '}' db 'vec4 tr(vec3 E,vec3 D){' db 'D=normalize(D);' db 'float L=.01;' db 'int i=0;' db 'for(i;i<512;++i){' db 'float d=F(E+D*L);' db 'if(d<.0001)break;' db 'L+=d;' db '}' ;db 'return vec2(L,float(i)/512.);' db 'return vec4(E+D*L,float(i)/512.);' db '}' db 'float I(vec3 a){' db 'vec3 l=vec3(sin(pw*1.3),cos(pw*4.2),sin(pw*3.2))*.9,la=la;' db 'return length(tr(a,la).xyz-a)*dot(n(a),-normalize(la))/dot(la,la)+.01;' ;db 'return tr(a,-lv).x*F(a+lv)/dot(lv,lv)+.01;' db '}' db 'void main(){' db 'vec4 t=tr(p.xyz,v.xyz);' db 'gl_FragColor=I(t.xyz)*(abs(t)+vec4(tw*5.));' ;db 'vec2 t=tr(p.xyz,v.xyz);' ;db 'vec3 q=p.xyz+normalize(v.xyz)*tx;' ;db 'gl_FragColor=I(q)+vec4(ty);' db '}' db 0
рдпрд╛ рдпрд╣: shader_vtx: db 'varying vec4 p,v;' db 'void main()' db '{' db 'gl_Position=gl_Vertex;' db 'p=vec4(mat3(cos(length(gl_Vertex.xy)),0.,sin(length(gl_Vertex.xy)),0.,1.,0.,-sin(length(gl_Vertex.xy)),0.,cos(length(gl_Vertex.xy)))*vec3(gl_Vertex.xy*.1,-.9),length(gl_Vertex.xy));' db 'v=vec4(mat3(cos(length(gl_Vertex.xy)),0.,sin(length(gl_Vertex.xy)),0.,1.,0.,-sin(length(gl_Vertex.xy)),0.,cos(length(gl_Vertex.xy)))*vec3(gl_Vertex.xy*.1,.1),length(gl_Vertex.xy));' db '}' db 0 shader_frg: db 'varying vec4 p,v;' db 'float mn(vec3 a){return min(ax,min(ay,az));}' db 'float F(vec3 a){return min(mn(vec3(1.)-abs(a)),length(mod(a,vec3(.4))-vec3(.2))-.06);}' db 'vec3 n(vec3 a){' db 'vec3 e=vec3(.0001,.0,.0);' db 'return normalize(vec3(F(a)-F(a+e.xyy),F(a)-F(a+e.yxy),F(a)-F(a+e.yyx)));' db '}' db 'vec3 tr(vec3 E,vec3 D){' db 'D=normalize(D);' db 'float L=.01;' db 'int i=0;' db 'for(i;i<512;++i){' db 'float d=F(E+D*L);' db 'if(d<.001)break;' db 'L+=d;' db '}' db 'return E+D*L;' db '}' db 'vec3 I(vec3 a,vec3 l,vec3 c){' db 'return c*(clamp(length(tr(a,la)-a),0.,length(la))*dot(n(a),normalize(al))/dot(la,la));' db '}' db 'void main(){' db 'vec3 t=tr(p.xyz,v.xyz);' db 'gl_FragColor=vec4(' db 'I(t,vec3(sin(pw*1.3),cos(pw*4.2),sin(pw*3.2))*.7,vec3(.9,.6,.2))+' db 'I(t,vec3(sin(pw*3.2),sin(pw*4.2),sin(pw*1.3))*.7,vec3(.0,.3,.5)),1.);' db '}' db 0
рдпреЗ рд╢рд╛рдпрд░ рдРрд╕реА рддрд╕реНрд╡реАрд░ рдХреНрдпреЛрдВ рджреЗрддреЗ рд╣реИрдВ? рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдЖрд╡реГрддреНрддрд┐ рдХреА рдЕрдЪреНрдЫреА рдкрд░рдВрдкрд░рд╛ рдХреЗ рдмрд╛рдж, рдЕрдЧрд▓реЗ рд╕рд╛рд▓ рдорд╛рд░реНрдЪ рдореЗрдВ! рдЕрдзреАрд░ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб: рджреВрд░реА рдХреЗ рдЦреЗрддреЛрдВ рдореЗрдВ рдХрд┐рд░рдг рдХрд░рдирд╛ ( рдЗрд╕ рдЖрджрдореА рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ )редрдЙрдкрд╕рдВрд╣рд╛рд░
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдкрд╛рда рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИ, рд╕рдмреЙрдкреНрдЯреАрдорд▓рд┐рдЯреА рдФрд░ рдмрд╕ рдЕрднрд┐рдорд╛рдиреА рдЭреВрда рд╣реИ (рдЧрдгрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдХрд┐рддрдиреА рдмрд╛рд░ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ), рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдЕрдм рдХреЛрдИ рджреВрд╕рд░рд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдирд╣реАрдВ рдмрдирд╛рдПрдЧрд╛, рдмрд▓реНрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓, рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕рд╛рд░реНрдердХ рдХреБрдЫ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛редрдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдЕрдм рд╕рд╣рдкрд╛рдард┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рд░реНрдорд┐рдВрджрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдбрд╝реА рдФрд░ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рдЕрдиреНрдп рдЪреМрдХреЛрдВ рдХреА рдмрдврд╝рддреА рдЪрд░реНрдЪрд╛ рд╕реБрдирдиреА рдЪрд╛рд╣рд┐рдП, рдЕрднреА рднреА рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдВрдд рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЕрдВрдд рдирд╣реАрдВ рд╣реИ !рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдХ рдХрд╣рд╛рдиреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рдХрд┐ рдХреИрд╕реЗ рд╕реНрд╡рд┐рдВрдЧрд┐рдВрдЧ рдмрд╛рд╕ рдХреЛ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ рдФрд░ рдбрд╛рдВрд╕ рдлреНрд▓реЛрд░ рдХреЛ рдЙрдбрд╝рд╛ рджреЗрдВредрдЕрдХреНрдЯреВрдмрд░ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ!