On 29 May 98 at 8:55, wrote:
> > C:\>copy con prg.com
> > 5b$-!#PZ4AP[4\(GM(GR(gA(gB(gC(gDs$
> > (C) Marosi Istvan 1998 V. 24.T{jb$P5))5)!)!5)E)!
>
> Aruld mar el, Istvan, mit csinal ez a joszag. Nem mertem elinditani a
> 386-osomon -- ahogy kidisassemblaltam, olyan halom zagyvasagot lattam, hogy
> szerintem pentiumul van.
Nincs abban zavarossag, csak elso latasra :) Es persze 386-oson is
menni kell. (A Pentiumoknak alig van tobb utasitasa, mint a 386-osnak,
koznapi hasznalatban meg azok sem igen erdekesek, cache kezelesre,
meg szemaforok krealasara valoak.)
A zagyvasagot bizonyara a kozepen elhelyezett copyright szoveg
visszafejtesekor lattad, de az a terulet nem fut. Ennek ellenere van
funkcioja, mindjart leirom, hogy mi.
Volt egy masik level is:
On 29 May 98 at 8:10, wrote:
> Oke, rendben. Most meggyonom buneimet, a program tenyleg tokeletesen
> mukodik.
Huhhh, megnyugodtam :))
> Az az igazsag, hogy eloszor csak debug-gal neztem meg, aztan a sok
> xor-ban nem sok erdekesseget lattam. Viszont ebbol tenyleg egy
> "Szia" sul ki a vegere. Igazan rafinalt es elismeresre melto.
Koszi :)
Es meg is fejtetted, hogy hogyan jon abbol ki a "Szia"? (Nem
bonyolult, de mindjart le is irom)
> Azert valljuk be igy magunk kozott: ugy nem gepi kodban irtad? :)
De igen. Mi masban lehetne? :)) Egy utasitaslistabol keresgeltem,
hogy milyen utasitasok azok, amik ertelmesen hasznalhatoak az adott
feladatra, es ami a legfontosabb: 0x20 es 0x7e kozott van a kodjuk!
Aztan ezt beirtam egy szovegfile-ba, ahol ... no egyszerubb, ha
idemasolom az en szia.com nevu szovegfile-omat: (A 8< egy ollo akar
lenni :))
-------------8<----------------
5b$-!#PZ4AP[4\(GM(GR(gA(gB(gC(gDs$
(C) Marosi Istvan 1998 V. 24.T{jb$P5))5)!)!5)E)!
100 5b$ xor ax,2462
103 -!# sub ax,2321 ; ax=0141
106 P push ax
107 Z pop dx ; dx=0141
108 4A xor al,41 ; ax=0100
10a P push ax
10b [ pop bx ; bx=0100
10c 4\ xor al,5c ; ah=1 al=5c
10e (GM sub [bx+4d],al ; ) -> int
111 (GR sub [bx+52],al
114 (gA sub [bx+41],ah ; T -> S
117 (gB sub [bx+42],ah
11a (gC sub [bx+43],ah
11d (gD sub [bx+44],ah
120 s$ jae 146
122 ... CrLf
(C) Marosi Istvan 1998 V. 24.
141 T{jb$ Szia$
146 P push ax
147 5)) xor ax,29xx ; ah=28
14a 5)! xor ax,21xx ; ah=09
14d )! int 21 ; cd+5c=29 ')'
14f 5)E xor ax,45xx ; ah=09 -> 4c
152 )! int 21 ; cd+5c=29 ')'
------------->8----------------
A masodik sor utolso felkialtojele utani resz persze mar nem fut,
ugyhogy az ott levo dolog a program szempontjabol komment. (Ja, ha
ilyesmire gondoltal, hogy nem gepi kodban irtam, akkor felig igazad
van :) A bal oldali oszlopba irtam, hogy az utasitas milyen cimre
kerul majd a memoriaban, a kovetkezo oszlopba kezzel beleforditottam
a gepi kodjat, ami mindig egy ascii karakterkod is, aztan meg a
szimbolikus asm mnemonikokat, hogy ne zavarodjak nagyon bele :))
Nehany megjegyzes:
- A kepernyore irni a dos-ban pl. 'int 21h' utasitassal lehet. A
kiirashoz a dx-be kell a string kezdocimet tenni, ez egy hexa
100-nal kicsit nagyobb szam lesz (141h). Az int21 kodja 0cdh 21h. A
21h az rendben, ez a '!' kodja. A cd viszont nagyon sok, azzal
valamit kell buheralni, ugyhogy onmodosito kodot kell irni.
- Vagyis a hexa 100-as cim utan nem sokkal a memoriaban byte-okat
kell modositani, erre a 'sub [bx+byteoffset],reg' utasitast talaltam,
mint olyat, aminek a kodja billentyuzheto [ '(G' illetve '(g' ].
Ehhez hexa 100-at kell bevarazsolni a bx regiszterbe, az offset igy
mar hexa 20-nal nagyobb lesz, van ra billentyu.
- A mov kodja nem olyannak felel meg ascii-ban, amit billentyuvel
lehet irni, viszont kihasznalhato, hogy indulaskor nullak vannak a
regiszterekben, igy egy xor ugyanaz, mint a mov. Az 'xor ax,konstans'
kodja viszont szep: '5' es mogotte a konstans erteke ket byte-ban,
ugyhogy ha a konstans nagyobb hexa 2020-nal, akkor ok. A 'sub
ax,konstans' is szerencses utasitas, igy mar konnyu ket nagy szambol
kicsit csinalni.
- Mindezekkel az ax-ban lesz a kivant szam, azt megint csak mov-val
nem jo atrakni mas regiszterbe a mov kodja miatt, erre a push-pop
parosat hasznaltam, azoknak is 'szep' kodjuk van.
- Az int21 0xcd-jet ugy csinaltam, hogy hexa 29-bol levontam 5c-t.
Azert pont 29-et valasztottam, mert annak ')' a kodja, igy a
nyito-csuko zarojelek szama azonos lesz :) Ehhez meg azt kellett
tennem, hogy azoknal az utasitasoknal, ahol az ax regiszternek a
tetejet (ah) alakitottam megfelelo ertekre a 16 bites xor
utasitassal, ott az al regiszterben tok mindegy, mi alalkul ki, igy
ezekbe az xx-ekkel jelolt byte-okba is tehettem ')'-et, hogy parban
legyen az osszes :))
- Ha mar modositom a kodot, modositottam a stringet is, ne latszodjon
kapasbol, hogy "Szia" van benne. A legegyszerubbet tettem, 1-gyel
novelt kodok szerepelnek a programban, amikbol aztan 1-et levonok. A
kozbulso copyright szoveg hosszaval meg egy felesleges 'push ax'
utasitassal (146-os cim) meg azt is beallitottam, hogy olyan cimre
keruljenek a modositott byte-ok, amikbol (a '(G' illetve '(g' utani
betukbol) a MR ABCD szoveg jon ki :)
- MOST JON A LEGFONTOSABB: Az onmodosito kod gondot okoz! Ugyanis a
processzor prefetch queue-jaba (durvan: eloreolvaso puffer) mar
korabban bekerulhetnek a byte-ok, mint hogy modositana oket a
program!!! Ez a processzortol magatol fugg, hogy hogyan csinalja az
utasitasok eloreolvasasat (prefetch-et). Ezert kellett kozepre tenni
egy hosszu valamit (a copyright szoveget), hogy kilogjon a prefetch
queue-bol a modositott resz (az int utasitasok kodja). Raadaskent
meg egy ugro utasitast is betettem (amivel atugrom a copyright
stringet), mert a legtobb processzor ilyenkor ujratolti a prefetch
queue-t.
Ez volt a legcikisebb resz, mert nem tudom (nem neztem utana), hogy
az ujabb processzorok mennyire okosan kezelik a prefetch-et, meg
milyen hosszu a queue-juk. Ezert kerdeztem, hogy fut-e modern
procikon.
Ja, a stringbe sorveget is tettem (ket byte-os CRLF kod), hogy a HIX
ne torje a hosszu szoveget ket sorba valahol akarhol :)) Es
remenykedtem, hogy mindenki, aki kiprobalja, olyan shell-et hasznal,
ami CRLF-fel jelzi a sorveget, es nem egyetlen LF-fel, mint unix-okon
szokas. Bar nem is tudom, lehet, hogy a DOS-hoz forditott GNU-s BASH
shell is CRLF-et ad, nem csak LF-et, hiaba unix-os program
eredetileg.
No, jo hosszu lettem ma is, bocs attol, aki unta :))
Istvßn
-- Istvan Marosi -- http://www.sch.bme.hu/~marosi --
-- Recosoft Ltd. -- mailto: --
|