A szerelő egyszerű! Megtanulni az n 10 kiadást (vásár)

Miért kezdtem a sörrel? Igen, ezért van: jelenleg négy jó hír:

Köszönöm mindenkinek, aki a foglalkoztatásra vonatkozó javaslatokat küldött nekem. Drágám! Alacsony íj neked és egy hála a tengernek.







Ha nem fér hozzá a Hálózathoz, írjon nekem egy levelet, amelyhez kérni kell ezt vagy ezt a problémát, vagy együtt:

És itt van Leonid levele. Rengeteg hasonló levél létezik, ezért mindenkinek válaszolok:

Jó napot, Oleg!

Szeretnék összeszerelni, de nem tudom, miből. Mondja el, hol kezdjem (a semmiből); ha van valami elektronikus formában, akkor, ha nem nehéz, kijött.

Tisztelettel Leonid.

Program az utolsó kiadástól.

Most az előző kérdésről. Mi volt a programra? Igen! Letöltötte magát a memóriába. Ie a tetején (a kód tetején). Tudatosan arra kértem, hogy nevezze el less009.asm. mert ha a program nem talál ilyen fájlt (*. com), akkor csak kilép, és hangjelzést ad. Egy lány, aki érdeklődik a programozói programozás iránt (igen, kedvesem, vannak olyan nők a sorainkban, amelyekre nagyon boldog vagyok!), A "ördög" program munkájának nevezte. Valójában nincs semmi bonyolult benne. Remélem, megértetted, hogy Assemblerben olyan hihetetlen dolgokat tehetsz, amelyek nem állnak rendelkezésre magas szintű nyelveken (BASIC, C, Pascal).

; A program a tárolóhelyére írja magát.

feltételezzük, CS: CSEG, DS: CSEG, ES: CSEG, SS: CSEG

mov dx, offset File_name; Nyissa meg a fájlt

hívj Open_file; egy speciális eljárás segítségével (lásd alább).

jc Error_file; Menjen a Error_file-hez hiba esetén.

mov bx, ax; A fájlazonosító és a

mov cx, offset Befejezés-100h; Megjegyezzük a programunk hosszát (olvasható bájtok száma),

mov dx, offset Begin; és olvassa el a fájlt a memóriába,

hívja a Close_file nevet; A fájlt külön eljárással zárjuk le (lásd alább).

mov ah, 9; Megjelenítjük a sikeres üzenetet.

mov dx, offset Mess_ok

; Ha a megadott névvel rendelkező fájl nem található (File_name db 'less009.com', 0), akkor betöltjük és kilépünk. (megjegyzés - OK)

Open_file proc; A fájl megnyitásához szükséges eljárás az olvasáshoz,

cmp fogantyú, 0FFFFh; amelyben meghatározzák, hogy a fájl nyitva van-e,

stb Quit_open; és ha nem nyitott - nyitjuk meg.

STC; Állítsa a hordozót 1-re, szükséges

ret; annak megerősítésére, hogy a fájl megnyílt (jc).

Fogja meg a dw 0FFFFh értéket

Close_file proc; A fájl lezárásának eljárása,

cmp fogantyú, 0FFFFh; feltéve, hogy megnyitásra került.

Fájlnév db 'less009.com', 0

Mess_ok db 'Ez rendben van!', 0Ah, 0Dh, '$'; 0Ah, 0Dh - menj a következő sor elejére,

; típus writeln vagy puts ().

Részletesebben megnézzük, hogyan működnek ezek a programok később.

Önök többsége azért szavazott, hogy így tanulmányozza az Assembleret:

gyorsan DOS, majd Windows. Úgy gondolom, hogy érdekesebb és célszerűbb lesz, mint a DOS tanulmányozása, vagy azonnal megy a Windows-ra. Így kezdjük tanulmányozni a DOS-t.

Ami a programot, amelyet írásban fogunk készíteni, az Assembler párhuzamos tanulmányozása során az eredmények:

1. Norton Commander;

Először azonban a kagyló kijött, de nem sokkal a vírus előtt.

Ma van kísérleti kiadásunk. Próbáljunk gyorsabban átvinni a témát, mint a fektetett. Ha nem értesz valamit, írj. Jöjjön a fórumra a webhelyen. Írj nekem. A levelezés végén külön felmérést készítek.

Mi a vírus? A vírus általában az Assemblerben írt program (bár vannak vírusok a Pascal, a C és a Visual Basic programban). Ez a program képes reprodukálni magát, más programokat megfertőzni egy programozó részvétele nélkül, aki maga írta ezt a vírust. Hogy lehet ez? Elementary!

Egy vírus összeállítása az Assemblerben elég dolog. Egy időben vírusokat írtam rezidensnek (tartósan a memóriában) és nem rezidensnek. Ráadásul írtam és antivirust (saját vírusom ellenére, természetesen).

Mielőtt folytatnám a vírus szerkezetének vizsgálatát, szeretném figyelmeztetni Önt a vírusszerű programok terjesztésére vonatkozó büntetőjogi felelősségről. Ha vírust írsz, majd felengeded "a fénybe", küldhetsz "olyan helyekre, amelyek nem olyan távoliak" (az orosz jog szerint); például Kolyma.

Ki ír vírusokat? Igen, mindenki nem lusta! Először is olyan programozók, akik csak tanulmányozták az Assembler-et, és nem látnak más lehetőséget, amint vírust írnak, és megsértik barátjukat, szomszédjukat stb. ezzel bemutatva magát. Például egy barátnak van egy nagy Pen-433, és van egy kis "trojka". És elégetni a Penna vágyával, hogy "megtörje".

Most képzeljünk el egy másik helyzetet: az X cégnek van egy versenytársa - Y cégnek. Hogyan kell megtenni, hogy Y egy bizonyos időre megkaphassa a problémát? És miért ne vírussal fertőződjenek meg a számítógépeik a saját termelésükből származó vírussal, amely ilyen vagy ilyen időpontban vagy ilyen körülmények között törli az összes információt a merevlemezről? A vírust az X cég alkalmazottja írja fel, majd a (vírus) a versenyzőbe kerül a számítógépbe. És ez minden! Rendszerint a számítógépek nem csak az Y cégnél vannak fertőzöttek, hanem mások is (a dolgozó átírta a fertőzött fájlt, és költözött otthonába, az ismerős fájlt újraírta őt stb.).







Most tekintsük át a vírus szerkezetét és működésének elvét. Mindennek célja, hogy megtanítsa, hogy felismerje a vírusokat és eloszlassa a félelemtől.

Mi a vírus? Először is - annak meghatározásához, hogy letöltődik-e egy fájlból, vagy ez az első letöltés (továbbiakban meg fogja érteni, mi a tét). Ezután keresse meg az első fájlt, ellenőrizze, hogy már fertőzött-e vagy sem, ha igen, akkor keresse meg a következőt, és ha nem, akkor megfertőzze. Mindez nagyon gyorsan megtörténik, és a felhasználó számára szinte észrevétlenül.

Mennyi ideig tart a vírus a memóriában? Mindez a programozó képzeletétől függ (amit a számítógép / fájlok meg akar csinálni). A vírus átlagos mérete 500-600 byte. Bár vannak szakemberek, akiknek vírusa 100-150 byte, és vannak olyanok is, akiknek a legegyszerűbb vírusa 1,5-3 vagy több kilobájt van.

Mit tehet egy vírus? Bármi! Például, hogy töröl minden adatot a merevlemezről a 0,5-1 másodperc (alapján az fdisk működik), éget a monitor, a merevlemez fizikai sérülés, sőt megölik a felhasználó (bár nem láttam még)! Minden a programozó képzeletétől függ.

Melyik vírust fogunk tanulni? Figyelembe vesszük a nem fertőzött vírust, amely fertőzi a * .com-fájlokat (a legegyszerűbb). Mit fog tenni? Azt hiszem, semmi különös, kivéve a szaporítást és a kisebb interferenciát a felhasználónak.

Hogyan regisztrálhatsz egy vírust? Általában:

feltételez cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG

Itt van a vírus teste.

Ie a szokásos *. com-fájl formátuma, amelyet már tud. Létrehozhat egy * .exe fájlt, de annak mérete nagyobb lesz.

Azt hiszem, van elég vírus ma. Sőt, a szavazás eredménye szerint a vírus nem az, amire összpontosítani szeretnél a Assembler tanulmányozása során.

Folytassuk a legnehezebb szakaszt. Nagyon nehéz lesz. Ki tudja megérteni - egy igazi hős lesz!

A rezidens program (rezidens) olyan program, amely folyamatosan a memóriában van. A rezidens példája az egér-illesztőprogram, a Norton Guide, mindenféle antivírus, amely nyomon követi, hogy egy adott program milyen műveletet hajt végre és jelentést tesz a felhasználó számára.

Általában a rezidens programnak meg kell szakítania a megszakítást, hogy a programozó vagy más programok hozzáférhessenek hozzá. Vessünk egy pillantást a megszakításokra (egy kicsit, amit a korábbi kiadásokban tanulmányoztunk).

Megszakítás - egyfajta eljárás (rutin), amelynek nincs neve (pl print_string) és számát. A számítógép 256 különböző megszakítási számmal rendelkezik. Néhány szoba van fenntartva a BIOS (ROM) a számítógép (például 16h; emlékezni: mov ah, 10h / int 16h?) Vagy az operációs rendszer (MS-DOS, PC-DOS, OS / 2) (például 21h: mov ah, 9 / mov dx, eltolás String / int 21h).

Azonban semmi sem akadályozza meg a programozót abban, hogy elfogja, mondja, egy 21 órás megszakítást, ezáltal ellenőrizve, hogy ki és mit csinál vele.

Nos, például. Mutassuk meg a sort:

mov dx, offset Our_string

Our_string db 'Hello! $'

képzeljük el, hogy ez a megszakítási kezelőnk egy darabja 21h.

; itt átirányítjuk az "igazi" 21h irányítását.

mov dx, offset My_string

Itt ellenõrizzük, hogy hívják-e meg a képernyõn (09) vagy más sorban megjelenõ sort. Ha egy másik funkciót hívunk (pl. 3Dh), akkor csak az eredeti kezelőt irányítjuk.

Mi az interrupt kezelő? Ez az eljárás véglegesen (vagy abban az időben) a memóriában, amely átveszi az irányítást az első, amit akar, majd átadja a vezérlést az eredeti felvezető (azaz egy eljárást, amely már a memóriában, hogy letöltse a kezelő). Azt is előad néhány műveletet, majd a vezérlést más kezelő, stb

Ha valami nem világos - ne kétségbeesj! Nagyon nehéz! Hamarosan minden a helyére fog kerülni.

Most menj a kezelőhöz (olvassa el figyelmesen a leírást a pontosvessző után):

feltételez cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG

; Ugrás az inicializálási címkére. Meg kell szakítanunk a 21 órás megszakítást, és el kell hagynunk a programot a memóriában

; Az alábbiakban valójában a 21h megszakításkezelő (lakóhelye). A program kilépése után az Int_21h_proc eljárás a memóriában marad, és figyeli a 09. megszakítás funkciót 21h. Nagyon kövér lesz.

jmp dword ptr cs: [Int_21h_vect]; Ha nem, menj az eredeti interrupt kezelőhöz 21h. Ez minden. A program nem tér vissza az Ok_09 címkére

Melyek a zászlók, amelyekre emlékszel? Éppen ezért, nézzük meg ismét egy példát:

Itt, az 1 vonal végrehajtása után, a nulla zászló be van állítva / visszaáll. A (2) sorban ezt a zászlót ellenőrizzük. Ha be van állítva, akkor az összehasonlítás parancs helyes (pl. AX = 23). Ha nincs telepítve, akkor az AX <> (nem egyenlő) 23.

Most figyeljenek az Int_21h_proc eljárás elejére. Amit látunk:

Töröljük a programot (változtassuk meg a nulla zászlót). Ez komoly változásokat okozhat a program során, ami 21 órás megszakítást okozott. Ehhez valójában megtartjuk a zászlókat a veremben. Remélem, megértetted, hogy a megszakításkezelőben (a mi esetünkben - Int_21h_proc) minden használt regisztert, beleértve a zászlók nyilvántartását is, tárolni kell.

Vegye figyelembe a következő sort:

Ez a változó kettős szót (D efine D ouble szó) tárolhat (négy bájt). Emlékezzünk arra, hogy egy 16 bites 2 bájtot (egy szót) foglal el (DX, AX, ES, SS stb., De nem AH, DL, BH 8 bites regiszterek, amelyek egy bájtot foglalnak el!).

Ha egy szót szeretne betölteni a változóba (két bájt), akkor ezt meg kell adnunk:

mov szó ptr Int_21h_vect, ax

Ha egy byte-ot akarunk betölteni, akkor ezt írjuk:

mov byte ptr Int_21h_vect, ah

Ne feledje, hogy a szó egy szó, és a byte egy byte. Megoldott valami?

Ezután hozzon létre egy egyszerű programot, amely megjeleníti a vonalat a 09h megszakítási funkció hívásával 21h. Ez például:

feltételezzük, CS: CSEG, DS: CSEG, ES: CSEG, SS: CSEG

mov dx, eltolás String

String db 'Saját karakterlánc. $'

Indítsuk el először a Programot N 01. Miután visszatér a DOS-hoz (a Norton Commanderben, a DOS Navigatorban, a Far és más shellekben), futtassa a N 02 programot. Mit fog látni?

Most futtassa a N 02 programot a debuggerben. Gyere bátran "belül" a 21 órás megszakítás. Mit látsz most?

Nos, kedvesem! Nehéz?

1. Többször is elolvastam mindent, de nem értettem semmit.

2. Alaposan megmagyarázod. "Came" a harmadik napon.

3. "Nemsokára" jött. Kívánatos részletesebb magyarázatot adni. És így minden rendben van.

4. Kemény, de érdekes. Folytassa a jó munkát!

5. Minden rendben van! Cool magyarázza!

6. Elemi! Inkább Windows-ra mennem.

Ma, mindent! A héjat jövő héten fogják megfontolni (a byte nem elég). Sikeres programozás Önnek!