title  25-6-98  hre productionĝ inc.. CIWATAĝ
;ipe.asm ve ipexe.asm dosyalarini bu dosyada topladim. *.exe ve *.com
;dosyalarina sifre ekleyen bu program zaten aciklamalariyla birlikte
;yazilan diger iki programlarin birlesmesinden olustugu icin fazla uzerine
;dusmedim. Tek farkli modul program basinda dosyanin exe yada com oldugu 
;arastirilip o procedure yonlendirilmesi..
;Bu programin com dosyalara sifre ekleyen modulunu 25/5/98 tarihinde yazdim
;son derece profesyonelce yazmaya calistim ve olduda..
;Exe dosya yapilari son derece karmasik oldugu icin bir ay boyunca sadece
;Exe file header uzerinde calistim. Ve bugun 25/6/98 yani tam bir ay sonra
;bunuda yazmayi basardim. Ama bu konuda yeni ve acemi oldugum icin exe modulu
;fazla estetik olmadi. Daha uzerinde calismam gerekiyor. Fazla buyuk exe dosya
;larina ekleme yapilirken exe header de bir overlay,stack hatasi olusuyor..
;Boyle bir durumda buyuk bir ihtimalle sistem kilitlenecek veya resetlenecek
;tir. Bu durumdan tekrar dosyaya ayni sifreyi vererek sifreyi iptal etmek
;suretiyle kurtulunulabilinir.
;                                               Hre productionĝ inc.. CIWATA
model tiny
codeseg
org 100h

basla:  mov al,es:[80h]   ;komuta kuyruguna girilen parametre says
        cmp al,0          ;sfr ise mesaj ver ck
        jne @1            ;degilse devam et
        lea dx,ink        ;mesaj adresi
        call bas          ;mesaj bas
        ret               ;programdan ck

@1:     mov al,[82h+bx]   ; psp komuta kuyruk adresi sonunda enter yani 13
        inc bx            ; bulunuyor bunu arayip buluyoruz
        cmp al,13         ; 
        jne @1            ; bulunamadiysa devam
        mov byte ptr [82h+bx-1],0 
                          ;ve bunu 0 ile degistiriyoruz. bunun nedeni acilacak  
                          ;olan dosya isminin daima sifir ile bitmesi gerekli
                          ;ligidir.
        mov ah,3dh            ;yapisilacak dosya aciliyor
        mov dx,82h            ;dosya ismi
        mov al,2              ;okuma-yazma modunda ac
        int 21h
        jNc KIL               ;acilamaz ise hata ver
        JMP HATA
KIL:    mov dosno,ax          ;acilirsa handle noyu degiskene ver

        MOV DX,OFFSET BYT
        MOV CX,2
        CALL OKU 
        CMP BYT,'ZM'
        JE EXE
        JMP COM

EXE:    call son              ;kesme sonrasi ax:dx te dosyadaki toplam byte adeti 
                              ;bulunur.
        mov d_a,ax            ;orjinal dosya boyutunu degiskenlere 
        mov d_d,dx            ;sakliyoruz

        cmp ax,0              ;uzunluk sifir ise hata ver
        jNe HAT
        JMP HATA

hat:    mov konum,0           ;dosyanin basina konumlaniyoruz
        xor cx,cx             ;0
        xor dx,dx             ;0
        call seek             ;konumlan

        mov dx,offset mes     ;dosyann ilk 32 byte i okunup degiskene
        mov cx,32             ;konuluyor (exe header)
        call oku              ;procedure
        
        mov si,offset mes     ;okunan bu baslik icerisindeki register icerik
        mov ax,[si+2]         ;lerini teker teker sakliyoruz
        mov oys,ax            ;ikinci word son sectordeki byte sayisi
        
        mov ax,[si+4]         ;ucuncu word
        mov ots,ax            ;dosyanin kac sector kapladigi
        mov ax,[si+14]        ;sekizinci word 
        mov oss,ax            ;stack segment degeri
        mov ax,[si+16]        ;dokuzuncu word
        mov osp,ax            ;stack pointer degeri
        mov ax,[si+20]        ;onbirinci word
        mov oip,ax            ;instruction pointer degeri
        mov ax,[si+22]        ;onikinci word
        mov ocs,ax            ;code segment degeri
;buradan sonra program arkasina ekleyecegimiz kodun baslangicina sistemi yon
;lendirmemiz gerekiyor. gerekli hesaplamalar yapiliyor
        
        call son               ;dosya sonuna konumlan

        add ax,16              ;bu satirlarda program boyutu 16 kati yapiliyor
        adc dx,0               ;cf durumuna gore dx i artir
        and ax,0fff0h          ;ax paragraf sinirina ayarlandi
        push ax                ;ve saklaniyor
        push dx                ;iki kere sakliyoruz ileride
        PUSH AX                ;lazim olacak
        PUSH DX

        
        add ax,182     ;eklenecek program byte adeti
        adc dx,0       ;cf durumuna gore dx i artir

        mov cx,512     ;programin kac sektor oldugunu
        div cx         ;program uzunlugu 512 ye bolunerek
        or dx,dx       ;bulunuyor. sonuc ax:dx te dx te kalan varsa
        jz @2          ;sector adeti 
        inc ax         ;bir arttiriliyor
@2:                    ;yoksa devam et
        mov word ptr [si+2],dx  ;si da exe file header bulunuyordu
        mov word ptr [si+4],ax  ;buranin iki ve ucuncu wordlerine degerler  
                                ;yaziliyor
        pop dx                  ;dosya boyutu aliniyor parca haric orjinal
        pop ax                  ;16 ya bolunebilinen

        mov cx,4                ;DX:AX         (burada stack ve code segmente)
do:     shr dx,1                ;16 YA BOLUNUP (verilecek degerler hesaplani)
        rcr ax,1                ;PARAGRAF OLARAK  (yor)
        loop do                 ;DOSYA BOYU BULUNUYOR..
        
        sub ax,word ptr [si+8]  ;8 exe header basligindaki 5.word (baslik uz.)
        sbb dx,0                ;cf durumuna gore dx i artir

        mov word ptr [si+14],ax  ;stack segment yeni degeri yaziliyor
        mov word ptr [si+22],ax  ;code segment yeni deger yaziliyor
        mov word ptr [si+16],0  ;stack pointer degeri 0
        mov word ptr [si+20],0  ;instruction pointer degeri 0
       
H:      CALL SIFRE 
        
        call son             ;dosya sonuna konumlan
        sub ax,16            ;dosyanin sonundaki security yazisinin ilk uc
        sbb dx,0             ;byte ini almak icin dosya boyundan 16 cikariyo
                             ;ruz
        mov cx,dx            ;ve bu alana konumlaniyoruz
        mov dx,ax            ;
        mov konum,0          ;
        call seek            ;konumlan
        
        mov dx,offset ink    ;konumlanilan yerden uc byte i oku degiskene
        mov cx,3             ;at
        call oku             ;procedure
        
        mov cx,3             ;okunan uc byte ile security ifadesinin uc byte i
        mov si,offset var    ;kiyaslaniyor. eger ayni ise dosya daha onceden
        mov di,offset ink    ;sifrelenmis demektir.
        rep cmpsb            ;kiyasla 3 byte
        je vv                ;
        jmp @yok             ;ayni degilse atla
        
vv:     call son             ;ayni ise buradayiz dosya sonuna konumlan
        sub ax,41            ;girilen sifre ile dosya icerisindeki sifreyi
        sbb dx,0             ;karsilastirmak icin dosya icerisindeki sifrenin
        mov cx,dx            ;bulundugu alana konumlaniyoruz
        mov dx,ax            ;
        mov konum,0          ;
        call seek            ;konumlaniyoruz. (burada sifre bulunuyor)

        mov dx,offset new    ;konumlanilan yerden 6 byte okuyup degiskene
        mov cx,6             ;atiyoruz.
        call oku             ;procedure
        
        CALL SIF_CON

        call son             ;dosya sonuna konumlan

        sub ax,59            ;dosya sonu eksi 59 dosya basina yazilacak
        sbb dx,0             ;register icerik bilgilerini barindiriyor
        
        mov cx,dx            ;bu alana konumlaniyoruz.
        mov dx,ax            ;
        mov konum,0          ;
        call seek            ;konumlan

        mov dx,offset ink    ;bu alandaki 12 bytelik verileri 
        mov cx,12            ;oku
        call oku             ;ink adli degiskene at
        
        xor cx,cx            ;dosyanin ilk ikinci byte ina 
        mov dx,2             ;konumlan
        mov konum,0          ;buraya okunan eski bilgi yazilacak
        call seek            ;son sector byte adeti ve toplam sector adeti

        mov byt,4            ;dort bylik veri 
        mov dx,offset ink+8  ;bu konuma yaziliyor (degisken icerisindeki adresi)
        call yaz             ;yaz
        
        xor cx,cx            ;dosya basindan 14. byte konumlaniyoruz
        mov dx,14            ;buraya 4 byte lik stack segment ve stack pointer
        mov konum,0          ;eski degerlerini yazacagiz
        call seek            ;konumlan
        
        mov byt,4            ;bu 4 byte lik bilgiyi yaz
        mov dx,offset ink+4  ;bu bilginin degisken icerisindeki konumu
        call yaz             ;yaz
        
        xor cx,cx            ;son olarak ip ve cs degerlerini yazmaya
        mov dx,20            ;geldi. dosya basin dan bu alana konum
        mov konum,0          ;laniyoruz
        call seek            ;konumlan

        mov byt,4            ;bu alanada
        mov dx,offset ink    ;bu 4 byte lik eski degeri yaz
        call yaz             ;yaz
        
        call son             ;dosya sonuna git
        sub ax,4             ;dosya sonu-4 te dosyanin sifrelenmeden onceki
        sbb dx,0             ;orjinal boyutu bulunuyor
        mov cx,dx            ;bu alan dan bu degeri alip asagida dosyayi
        mov dx,ax            ;o alandan truncate yapacagiz
        mov konum,0          ;aslinda dosya sonuna eklenen program boyumuz
        call seek            ;belli dosya sonundan bu boyutu cikarip buradan
        mov cx,4             ;dosyayi truncate edebilirdik ama bizim program 
        mov dx,offset ink    ;sector boyunu tamamlamak icin ne kadar cop byte
        call oku             ;ekledigini bilmedigimiz icin orjinal kodlara 
        
        mov si,offset ink    ;zarar verip bir daha duzeltilemeyen hatalar
        mov cx,[si+2]        ;yapar ve dosya yapisini bozariz
        mov dx,[si]          
        mov konum,0          ;dosyanin orjinal boyutuna konumlaniyoruz
        call seek            ;konumlan

        CALL TRUNCATE
        
        lea dx,ipt           ;sifre iptal edildi mesajini ver
        call bas             ;procedure
        int 20h              ;programi terket
        

@yok:   POP CX
        POP DX
        mov konum,0          ;o alana konumlaniyoruz.
        call seek            ;konumlan
        
        mov dx,offset programE ;yazilacak bilgi adresi
        mov byt,182           ;yazdigimiz program 181 byte tan olustugu icin
        call yaz              ;procedure
        
        xor cx,cx             ;dosya basina konumlaniyoruz
        xor dx,dx
        mov konum,0           
        call seek             ;konumlan

        mov dx,offset mes     ;yazilacak bilgi dizisinin adresi programimiza
        mov byt,32            ;dallanma yapacak header i yaziyoruz.
        call yaz              ;procedure
        
        lea dx,ekle           ;sifrelendi mesajini verip
        call bas              ;programi terk ediyoruz.
        int 20h               ;isimiz bitti. programdan cikiyoruz.

seek proc
        mov ah,42h        ; dosya icerisinde konumlanma procedure 
        mov al,konum      ; bastan,0 normal,1 sondan,2
        mov bx,dosno      ; dosya no
        int 21h
        ret
seek endp

SIF_con PROC
        mov cx,6             ;iki sifre kontrol ediliyor. sifreler ayni
        mov si,offset new    ;ise asagidaki satirlarda sifre iptal edilecek
        mov di,offset old    ;ayni degilse daha onceden sifrelendi demektir.
        rep cmpsb            ;kiyasla
        je sec               ;ayni ise sifre iptal kismina atla
        mov ah,9             ;ayni degilse 
        lea dx,ik            ;daha onceden sifrelenmis mesajini ver 
        int 21h              ;programi terket
        int 20h
SEC:    RET
SIF_CON ENDP

yaz proc
        mov ah,40h        ;dosyaya yazma procedure
        mov bx,dosno      ;dosya no
        mov cx,byt        ;yazilacak byte adeti
        int 21h           
        ret
yaz endp
oku proc
        mov ah,3fh            ;dosyadan okuma procedure
        mov bx,dosno          ;dosya no  (zannedersem su anda 5)
        int 21h               ;okunacak byte i cx e veriyoruz
        ret
oku endp
SIFRE PROC
@:      xor bx,bx               ;sayac olarak kullanilacak sifirliyoruz
        lea dx,var              ;sifre giris mesajini ver 
        call bas

        mov ah,0ah              ;bufferli veri giris servisini cagiriyoruz
        mov dx,offset buf       ;girilen verinin bulunacagi adres
        int 21h                 ;kesme cagrisi
        
        mov cl,byte ptr offset buf[1]   ;girilen sifrenin uzunlugunu aliyoruz
        or cl,0                    ;sifir ise bos enter tusuna basilmis demek
        je @                       ;tir. tekrar basa gidiyoruz
        mov si,offset buf[2]       ;sifrenin ilk karakterini alip
@4:     add byte ptr [si],30       ;30 ekliyoruz ve dosya icerisine yazmak
        mov al,byte ptr [si]       ;icin al ye alip
        mov byte ptr offset old[bl],al ;degisken icerisine yerlestiriyoruz
        mov byte ptr offset Cold[bl],al ;degisken icerisine yerlestiriyoruz
        inc si                     ;ikinci karaktere gec
        inc bl                     ;ikinci karaktere gec
        loop @4                    ;cl bitene kadar devam et
        RET
SIFRE ENDP        

son proc
        xor cx,cx           ;dosya sonuna konumlanan
        xor dx,dx           ;procedure
        mov konum,2
        call seek
        ret
son endp

bas proc                  ;21h-09h servisi ile ekrana mesaj basan
        mov ah,9                  ;bas proceduremiz
        int 21h
        ret
bas endp

TRUNCATE PROC
        mov ah,40h           ;21h-40h fonksiyonu ile dosyayi bulundugumuz
        xor cx,cx            ;yerden truncate (kesip) edip dosyayi kapatiyoruz.
        int 21h              ;bu islemde cx e 0 dx e ise bir sey vermeden 
        mov ah,3eh           ;kesmeyi cagiriyoruz.
        int 21h              ;dosyayi kapat.
        RET
TRUNCATE ENDP        
                          
COM:    XOR CX,CX
        XOR DX,DX
        MOV KONUM,0
        CALL SEEK

        mov dx,offset ILK     ;dosyann ilk uc byte i okunup degiskene
        mov cx,3              ;konuluyor
        call oku              ;procedure
        call sON              ;procedure
                              ;kesme sonrasi ax:dx te dosyadaki toplam byte adeti 
                              ;bulunur.
        push ax               ;dosya boyutunu sakla
        cmp ax,0              ;uzunluk sifir ise hata ver
        jNe @@@
        JMP hata

@@@:    cmp ax,65286          ;dosya boyutu bu sinirda ise ekleme yapma
        jnae dev              ;mesaj ver programi terket
        lea dx,mes1           ;dizi adresi
        call bas              ;dizi basan procedure
        lea dx,ekl            ;dizi adresi
        call bas              ;dizi basan procedure
        INT 20H               ;programi terket


dev:    sub ax,3       ;dosyanin ilk basindan uc byte okumustuk ve dosya 
                       ;boyutu uzamisti. bu uc bytelik uzamayi cikariyoz
        
        mov byte ptr offset cal[1],al  ;dosya basina yazilacak olan uc bytelik
        mov byte ptr offset cal[2],ah  ;diziyi hazirliyoruz. call komutuna adres 
                                       ;adres olarak dosya uzunlugunu veriyoruz.    
        CALL SIFRE

        pop ax               ;dosya boyutu alip    
        push ax              ;tekrar koyuyoruz
        sub ax,12            ;dosyanin sonundaki security yazisinin ilk 
        MOV CX,0
        MOV DX,AX
        MOV KONUM,0
        call seek            ;konumlan
        
        mov dx,offset INK   ;konumlanilan yerden uc byte i oku degiskene
        mov cx,3             ;at
        call oku             ;procedure
        
        mov cx,3             ;okunan uc byte ile security ifadesinin uc byte i
        mov si,offset var    ;kiyaslaniyor. eger ayni ise dosya daha onceden
        mov di,offset INK    ;sifrelenmis demektir.
        rep cmpsb            ;kiyasla 3 byte
        je HE
        JMP @yok1             ;ayni degilse atla

HE:     pop ax               ;dosya boyu aliniyor
        push ax              ;tekrar konuluyor
        sub ax,37            ;girilen sifre ile dosya icerisindeki sifreyi
        MOV CX,0
        MOV DX,AX
        MOV KONUM,0
        call seek            ;konumlaniyoruz. (burada sifre bulunuyor)

        mov dx,offset New   ;konumlanilan yerden 6 byte okuyup degiskene
        mov cx,6             ;atiyoruz.
        call oku             ;procedure
        
        CALL SIF_CON
        
        pop ax               ;dosya boyutunu al
        push ax              ;tekrar koy
        sub ax,46            ;dosyanin basindaki ilk uc karakterin bulundugu
        
        MOV CX,0
        MOV DX,AX
        MOV KONUM,0
        call seek            ;buraya konumlaniyoruz
        
        mov dx,offset INK   ;buradan uc byte okuyup
        mov cx,3             ;degisken icerisine atiyouz
        call oku             ;procedure

        XOR CX,CX
        XOR DX,DX
        MOV KONUM,0
        call seek            ;procedure
        
        mov byt,3            ;ve buraya uc byte i yaziyoruz.
        mov dx,offset INK    ;dosya su anda orjinal haline geldi
        call yaz             ;yalniz alt kisimdaki sifre kismi kaldi..
        
        pop ax               ;dosya boyunu al (bu sefer geri koymayacagiz...)
        sub ax,161           ;dosyanin sonunda yer alan kismimiz 161 byte tan
        MOV CX,0
        MOV DX,AX
        MOV KONUM,0
        call seek            ;procedure
        
        CALL TRUNCATE

        lea dx,ipt           ;sifre iptal edildi mesajini ver
        call bas             ;procedure
        int 20h              ;programi terket


@yok1:   mov konum,0           ;dosya basina konumlaniyoruz
        XOR CX,CX
        XOR DX,DX
        call seek             ;procedure

        mov dx,offset cal     ;yazilacak bilgi dizisinin adresi
        mov byt,3             ;dallanma komutunu yaziyoruz.
        call yaz              ;procedure
        
        call sON              ;procedure
        
        mov dx,offset programC  ;yazilacak bilgi adresi
        mov byt,161             ;yazdigimiz program 161 byte tan olustugu icin
        call yaz                ;procedure
        
        lea dx,ekle           ;sifrelendi mesajini verip
        call bas              ;programi terk ediyoruz.
        int 20h               ;isimiz bitti. programdan cikiyoruz.


programC:                 ;dosya arkasina yapisan programin baslangici
        push cx           ;program baslangicinda cx te program uzunlugu
        call ip           ;bulunur. bunu sakliyoruz
ip PROC
        pop bx            ;ip in degerini stack a atip oradan bx registerine
        push bx           ;pop ediyoruz. stack konumunu korumak icin tekrar
                          ;ayni yere koyuyoruz.
        mov ah,9          ;mesaj bas
        add bx,145        ;dizinin adresini ip degerine 145 ekleyerek bulup 
        mov dx,bx         ;dx registerine aktariyoruz.
        int 21h           ;mesaj basiliyor
        
        sub bx,31         ;girilen sifrenin bulunacagi dizinin adresini
        mov si,bx         ;bx ten 31 cikartarak buluyoruz.
        mov cx,6          ;girilecek karakter adeti

@@:     xor ax,ax         ;veri gir servisi icin hazirlik
        int 16h           ;klavye kesmesi
        cmp ah,01ch       ;girilen karakter enter ise cik
        je cik
        
        push bx           ;bx degerini sakla. ip buluyor
        mov ah,0eh        ;girilen karakteri
        xor bx,bx         ;kesme 10h-0eh servisi ile 
        int 10h           ;ekrana basiyoruz
        pop bx            ;ip degerini geri aliyoruz
        
        add al,30         ;girilen karaktere 30 ekle
        mov byte ptr [si],al ;dizi icerisine koyuyoruz
        inc si               ;ikinci karakter icin bir artim
        loop @@              ;cx bitene kadar devam et
cik:    mov cx,6             ;sifre ile girilen bilgiyi kiyaslayacagiz
        mov si,bx            ;sifremiz max.6 oldugundan cx e 6 degerini 
        add bx,6             ;si ya girilen bilgi adresini
        mov di,bx            ;di ya sifre adresini verip
        rep cmpsb            ;byte byte kiyaslama yapiyoruz
        je @3                ;girilen ve sifre ayni ise @3 e git
        mov ah,9             ;aksi halde
        add bx,6             ;ekrana mesaj bas
        mov dx,bx            ;ve programi
        int 21h              ;terket..
        int 20h
@3:
        sub bx,9        ;bx ten 9 cikartarak ilk uc byte adresini buluyoruz
        mov al,byte ptr [bx]      ;satirno+kod_uzunlugu ndaki deger alinip 
        mov byte ptr ds:[100h],al ;programin ilk satirina yaziliyor
        mov al,byte ptr [bx+1]    ;ikinci byte aliniyor
        mov byte ptr ds:[101h],al ;programin ikinci satirina yaziliyor
        mov al,byte ptr [bx+2]    ;ucuncu byte alip 
        mov byte ptr ds:[102h],al ;programin ucuncu satirina yaziliyor.
        xor dx,dx     ;program memory icerisinde calisacak hale geliyor.            
        xor ax,ax     ;tum register iceriklerini sifirliyoruz 
        xor bx,bx
        xor si,si
        xor di,di
        mov sp,0fffah ;stack icinde cx registeri vardi. stack i oraya kadar 
        pop cx        ;kisaltip cx registerini aliyoruz.
        pop ax        ;stack ta kalan son bilgiyide alip stack i ilk hale
        mov ax,100h   ;getiriyoruz. programin basangic adresini stack a 
        push ax       ;atip ret diyoruz. ret stack taki 100h bilgisini alip
        sub ax,ax     ;ip ye veriyor ve program calismis oluyor.
        ret           ;ax teki 100h bilgisini sifirliyoruz.            
ip endp                           ;procedure bitisi

    
ILK db 3 dup(?)                   ;program basindan alinan ilk uc byte in bulundugu dizi
    db '      '                   ;girilen sifrenin duracagi yer
COLD db '      '                   ;eski sifrenin bulundugu yer
    db 13,'You can`t use it.$'    ;kullanamazsin mesaji
    db 'Security..:$'             ;sifre giris mesaji

programE:                 ;dosya arkasina yapisan programin baslangici
        call iip           ;program satir noyu ogrenmek icin procedure cagirip    
iip:    pop bx            ;ip in degerini stack a atip oradan bx registerine
        
        push ds           ;dosya ya lazim olacak verileri sakliyoruz
        push es
        push cx
        push cs           ;code yi data ve es e esitliyoruz
        push cs
        pop es
        pop ds
        
        mov ah,9          ;mesaj bas
        add bx,163        ;dizinin adresini ip degerine 163 ekleyerek bulup 
        mov dx,bx         ;dx registerine aktariyoruz.
        int 21h           ;mesaj basiliyor
        
        sub bx,31         ;girilen sifrenin bulunacagi dizinin adresini
        mov si,bx         ;bx ten 31 cikartarak buluyoruz.
        mov cx,6          ;girilecek karakter adeti

@1@:    xor ax,ax         ;veri gir servisi icin hazirlik
        int 16h           ;klavye kesmesi
        cmp ah,01ch       ;girilen karakter enter ise cik
        je CIK1
       
        push bx           ;bx degerini sakla. ip buluyor
        mov ah,0eh        ;girilen karakteri
        xor bx,bx         ;kesme 10h-0eh servisi ile 
        int 10h           ;ekrana basiyoruz
        pop bx            ;ip degerini geri aliyoruz
        
        add al,30         ;girilen karaktere 30 ekle
        mov byte ptr [si],al ;dizi icerisine koyuyoruz
        inc si               ;ikinci karakter icin bir artim
        loop @1@              ;cx bitene kadar devam et

cik1:    mov cx,6             ;sifre ile girilen bilgiyi kiyaslayacagiz
        mov si,bx            ;sifremiz max.6 oldugundan cx e 6 degerini 
        add bx,6             ;si ya girilen bilgi adresini
        mov di,bx            ;di ya sifre adresini verip
        rep cmpsb            ;byte byte kiyaslama yapiyoruz
        je @3@               ;girilen ve sifre ayni ise @3 e git
        mov ah,9             ;aksi halde
        add bx,6             ;ekrana mesaj bas
        mov dx,bx            ;ve programi
        int 21h              ;terket..
        mov ah,4ch
        int 21h

@3@:    xor di,di            ;kullanilan registerleri sifirliyoruz
        xor si,si
        xor ax,ax
        xor dx,dx
        
        pop cx               ;yukarida saklanan ilk degerleri veriyoruz
        pop es
        pop ds
        
        push es              ;es degerini ax alip
        pop ax
        add ax,10h           ;uzerine 16 psp degerini ekliyoruz
        add cs:[bx-16],ax    ;daha sonra code segment degerine ax i ekliyoruz
        add cs:[bx-14],ax    ;stack segment degerine ax i ekliyoruz
        
        cli                 ;interruptionlari kes
        mov ss,cs:[bx-14]   ;stack segmente yeni degerini ver
        sti                 ;interruptionlari birak
        mov sp,cs:[bx-12]   ;stack pointere yeni degerini ver
        
        push cs:[bx-16]     ;code segment degerini stack a at
        push cs:[bx-18]     ;instruction pointer degerini stack a at
        retf                ;retf komutu stack taki degerleri alip programi
                            ;calistiriyor

oip dw         ;instruction pointer orjinal degeri icin degisken
ocs dw         ;code segment orjinal degeri icin degisken
oss dw         ;stack segment orjinal degeri icin degisken
osp dw         ;stack pointer orjinal degeri icin degisken
oys dw         ;son sector byte adeti icin degisken
ots dw         ;sector olarak dosya boyutu icin degisken
new db '      '                   ;girilen sifrenin duracagi yer
old db '      '                   ;eski sifrenin bulundugu yer
yok db 13,'You can`t use it.$'    ;kullanamazsin mesaji
var db 'Security..:$'             ;sifre giris mesaji
d_a dw         ;orjinal dosya boyutu alcak word
d_d dw         ;orjinal dosya boyutu yuksek word


BUF DB 7
    DB 0
    DB 7 DUP(?)

cal db 0e8h,0,0                   ;program basina yazilan dallanma komutu dizisi
ink db '*.exe *.com dosyalarna sifre ekler..',13,10
    db '  Hre Productionĝ inc..       Assembly`98$'
mes db 'Dosya bulunamadi yada boyutu cok kucuk..$'        
mes1 db 'Dosya boyutu 65535 sinirini geciyor..',13,10,'$'
ekle db 'Dosyanza sifre eklendi..$'
ik db 7,'Bu dosya daha once sifrelenmis..!',10,13
ekl db 'Dosya sifrelenemedi..$'
ipt db 'Sifre iptal edildi..',13,10,7
    db 'Hre Productionĝ inc..',9,'Assembly`98$'
yer dw
konum db
byt dw
DOSNO DW
hata:   lea dx,mes    ;hata soz konusu olmus ise bu satira gelinip
        call bas      ;mesaj ekrana basilip programi terk ediyoruz.
        int 20h       ;programi terket
end basla
