- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
0100 push si ; V ; в DOS обычно SI=100h (но полагаться на это нельзя)
; в debug.com SI=0, поэтому отладить не получится
0101 pop dx ; Z ; dx = 100h <- адрес строки для функции 9 DOS равен образу самой программы
0102 dec si ; N ; si = 0ffh
0103 dec si ; N ; si = 0feh
0104 pop ax ; X ; ax = 0
0105 push ax ; P ;
0106 dec ax ; H ; ax = 0ffffh
0107 xor ax, 3535h ; 555 ; ax = 0cacah
010A aaa ; 7 ; поскольку a>9, прибавляем 6 к al и 1 к ah; очищаем старшую тетраду al
; ax = 0cb00h
010B xor ax, 4B30h ; 50K ; ax = 08030h
010E xor al, 50h ; 4P ; ax = 08060h
0110 push ax ; P ; в стек 08060h
0111 xor ax, 4D44h ; 5DM ; ax = 0cd24h
0114 xor ax, [si+30h] ; 3D0 ; ax = 0cd24h + мусор
0117 xor [si+30h], ax ; 1D0 ; [12eh] = 0сd24h
011A pop ax ; X ; ax = 08060h
011B xor ax, 4341h ; 5AC ; ax = 0c321h
011E xor ax, [si+32h] ; 3D2 ; ax = 0c321h + мусор
0121 xor [si+32h], ax ; 1D2 ; [130h] = 0c321h
0124 pop ax ; X ; ax = 0
0125 push ax ; P
0126 xor ax, 3935h ; 559 ; ax = 3935h
0129 xor ax, 3035h ; 550 ; ax = 900h
012C dec bx ; K ;
012D xor al, 20h ; 4
; после самомодификации (после xor ax, [si+30h] и xor [si+32h], ax)
012D xor al, 24h ; 4$ ; $ — конец строки для функции 9 DOS
; просто безобидная инструкция, потому что значение al не важно
012F int 21h ;
0131 ret ;
Куайн в виде COM-файла для DOS.
VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP559550K4
Последний символ — пробел.
1. Полагаемся на то, что si=100h при старте программы.
2. Накладываем в три (четыре?) байта за концом программы.
Второй пункт можно поправить, нафигачив в конец три-четыре пробела. Но тогда это не совсем чистый куайн: финальные пробелы мы же не печатаем.
COM-поргамме доступен весь сегмент и всё что за ним, так можно.
ЗЫ. А чо понельку с ббкодами убрали?
За программой обычно следует стек. Поскольку стек растёт вниз, то есть шанс, что какой-то кусок стека, смежный с программой, никогда не будет использован. Но надеяться на это --- прогулка по тонкому льду, прогулка по минному полю.
Не убирал. Если знаешь как повторить баг - скажи.