  Ŀ
  Ŀ
                                                                          
             "Recep'in Kesi"  Virsler IV                              
                                                                          
  ٳ
   PS 23  Haziran'95                                 Recep Tezkol          
  



> Merhaba Dostlar,

  Bahar, yeillii dolaysyla Mays ayn severdim. Severdim diyorum
  because, bir insann hayatnn 5-10 ylnda karlaaca aksiliklere ben
  bir ayda, bu ayda karlatm.

> Hi-tech fuarndan mutlu ve de umutlu bir ekilde dndkten ksa bir sre
  sonra hard disk'im tngrdayarak br dnyaya gt. Yetiemedim, eminim
  mundar gitti. nemsiz bir konu diyordum iimden, nk garantisi vard ve
  hemen yenisini verdiler. Ama kazn aya yle deilmi. Yeni disk'imi alp
  bilgisayarma taktm, tak-altr moda ya... G dmesini ap beklemeye
  baladm. O da ne... Bilgisayarm almyordu. Bu kadar da olmaz be
  kardeim. Yeni diye verdikleri disk de bozuk. Eee ne demiler "bozuk diske
  den telefona sarlr"m. Ben de "tabiyatynan" hemen telefona sarldm:

    -Ayhan abi bu disk bozuk yaa.
    -Olamaz arkadiim.. yenidir o meret.
    -Abi soketleri normal taktm, makinay atm, hh.. duvar.
    -Formatlamadn m?
    -Yahu manyadn m abi. Benim o kadar almam var ierde, hepsi gider.
    -#4&^~#o<-#O!! ..tiiir ordan, manyaaaaag.. yeni diskte senin almalarn
     ne gezer...
     ....
    -H...abi hepsi gitmi beya. Artk bir debuk'um bile yok!..

  Ertesi gn, "metiiin ol Recep, vatan saolsun" diyerek kendimi teselli ettim
  ve lisansl bir kopyac olarak tm programlarm sadan soldan temin ettim.
  Artk sfrdan balayacam iin alma tempomu arttrdm ve gecikmi mays
  yazm bitirerek (zarardaym ya) kargoya alc demeli verdim.

  Bir hafta sonra Ziya telefonda mays yazsnn nerde olduunu soruyordu.
  Haydaaa... bu da ne ki. Bir iki gn sonra mesele anlald. Gnderdiim
  disketin kargo creti alc tarafndan denmedii iin geri geldi.
  Hem de 50 kaatlk diskete hi acmadan iade makbuzu zmbalanarak...

> Bakmayn siz elalemin ne dediine, Ayhan abim iyi ocuktur (aktrmayn,
  yalyorum). Geenlerde kullanmam iin bana almayan bir modem verip,
  al una bir bak bakalm adam olur mu? dedi. Aman be abi, biz neleri adam
  ettik, evelallah onu da beceririz...

  Bir gn sonra...

  Dedim size abi burada tecrbe konuur. Modem blbl oldu. yle aylarca
  portla mortla uramak ne kelime, onu (modemi) yle eitmiim ki, kerata
  aktrmadan Doruk BBS'i aram beni kaydettirmi. adresim de
  tezkolr@doruk.com.tr'imi.

  Ne derler yiidi ldr, hakkn yeme. Modem de modem hani. imdi reklama
  girer diye markasn vermiyorum ama isterseniz kulanza aktrmadan
  sylerim.

  Eh madem bizde "Interneti" olduk bari bir merhaba diyelim dedim.
  Orada bir virus-f forumu var. Kumandanlar da Murat Sakarya
  (murats@doruk.com.tr). Kendisi oralarn anti virs yazarlarndan...
  Ferhat apan (ferhatc@doruk.com.tr), Ziya Akar(ziyaa@doruk.com.tr), Grol
  Demir (gurold@doruk.com.tr) aklma ilk gelen virs formunun mdavimleri.
  Ha bir de Teknik Eleman diye biri var. ok pheci biri, her yerde virs
  yazar aryor. Elma dersem k, armut dersem kma diye. Elmaaaaaa...

  Kendilerine gsterdikleri scak ilgiden dolay buradan bir kere daha
  teekkr etmek istiyorum. Ne diyordum, efendim biz buralardayz, sizi de
  bekleriz..

  Neyse biz tam oradakilerle muhabbeti koyulatracaz bizim Ayhan abi
  modemin altn duymu, hnzr hemen, ya paray ya modemi diye haber
  etmi. Anlyacanz bizim modem muhabbeti orada bitti. En ok bozulduum
  imdi 190 kredim hapis. Ama siz yine de arayabilirsiniz. En ksa zamanda
  bir modem alp, mektuplarnz cevaplamaya alrm.

  

> Biliyorum skldnz. Eh hadi gelin kaldmz yerden virslere devam
  edelim.

  



 Virsler Yaz Dizisi IV 




                             EXE FILE HEADER
                             

            1EXE program tantcs MZ ............. 1 word
            2dosya uzunluu MOD 512................. 1 word
            3dosya uzunluu DIV 512................. 1 word
            4Number of segment addesses for passing. 1 word
            5Headeri oluturan paragraf adedi....... 1 word
            6Minimum number of paragraphs needed.... 1 word
            7Maximum number of paragraphs needed.... 1 word
            8Stack sgment displacement ............ 1 word
            9Program altnda SP'nin ierii.... 1 word
           10Checksum based on EXE file header...... 1 word
           11Program altnda IP'nin ierii.... 1 word
           12Start of code segment in EXE file ..... 1 word
           13Relocation table addres in EXE file.... 1 word
           14Overlay number......................... 1 word
             Buffer memory.......................... ??
             Address of passing segment address..... ??
              (relocation table)
             Program code,data,stack segment........ ??


  Yukarda verdiim "ingrke" tablo, EXE dosyalarn banda bulunan header'i
  aklamaya yetmeyecei gn gibi aktr. in bir yn de tablodaki baz
  ksmlar ben de anlamyorum. Aslnda anlamak iin pek aba gstermiyorum.
  Bu nedenle tablomuzun, virsleri ilgilendiren blmleri zerinde duracam.

 Tablomuzun ilk word'nde bulunan 'MZ' (Mark Zbikowski) virsler iin
  nemlidir. Bu iki karakter ile dosya tipini renir ve bulama ilemini
  buna gre yapar. Bir virs (hangisi imdi hatrlamyorum) incelerken
  ilgin bir durumla karlamtm. Virs dosyann ilk iki byte'nnda nce
  'MZ' aryor, bulamaz ise bir de 'ZM' olabilirmi diyerek kontrol ediyor.
  ilk nceleri buna bir anlam verememitim. Daha sonra bu virs hem 'MZ' hem
  de 'ZM' aradna gre herhalde bir bildii var ve de neden olmasn diyerek
  yakaladm bir EXE'nin bana 'ZM'yi kondurdum, alt. Denemedim ama
  profesyonal anti virs programlarnda bu kontrol vardr (bazlarnda belki
  de yoktur) ama amatrler tarafndan yazlm bir ok shareware anti virs
  program 'ZM' ile balayan dosyalar COM program gibi taryor. Bu nedenle
  sonu tam bir fiyasko oluyor. imdi meraktan yazy brakp PSAV' kontrol
  ettim, ayn eksiklik PSAV'da da mevcut. imdi bir virs yazar kp
  bulat EXE dosyalarn ilk iki baytn 'ZM' yapsa epey ses getirir.

  Hatta hatta MSDOS.SYS dosyasnn iinde yanyana duran MZ...ZM karakterlerini
  deitirip kendi isminin ba harflerini koyarsa seyreyleyin mb...
  Ben bu karakterlerden ZM olann RT ile deitirip, bir EXE'nin bana da
  RT koyup denedim. Ya ite byle.. u EXE'nin ie yaramaz dediimiz iki harfi
  bile ne ilere yaryormu.

 imdi de MZ'den sonra gelen 2 word necidir ona bakalm. DOS, EXE dosyalar
  bellee yklerken bu iki adet word'de yer alan bilgiyi kullanr. nc
  word'de bulunan deer bellee yklenecek EXE dosyann disk'te kaplad
  sektr adedini, ikinci word ise ksrat bildirir. EXE dosyann uzunluu
  sz konusu word'lerde bulunan deerlerin ok ok stnde olabilir. Dediimiz
  gibi DOS program bellee yklerken bu deerleri gz nne aldndan
  dosya yzlerce Mbyte bile olsa yalnzca gerekeni bellee ykler.

  EXE dosyalar hedef alm virsler kodunu dosyaya eklediklerinde buradaki
  bilgileri gncellemek zorundadr. Buradaki deerlerin hesaplanmasna bir
  rnek verelim:

      2. word =  dosya_boyu mod 512
      3. word =  (dosya_boyu div 512)

   2. word'e EXE dosyann uzunluunun 512'ye blmnden artan sonu aktarlr.
   3. word'e dosya uzunluunun 512'ye blm, bu blm sonucu artan varsa
   3. word'teki deere 1 eklenir. nk kalan byte'lar 512'den az da
      olsa bir sektr igal edecektir. 3.word'te yer alan deer dosyann
      kaplad sektr adedini tuttuunu unutmayn.
   5. word, incelemekte olduumuz EXE header'n paragraf olarak uzunluunu
      tutar. Bir paragraf 16 byte'tr.
   8. word, stack segmentin dosya zerindeki yerini tutar.
   9. word, stack pointerin deerini saklar. Bu deer sabittir ve program
      altrldnda SP yazmacna aktarlr.
  11. word, CODE offsetin deerini tar ve program altnda IP yazmacna
      aktarlr. Virsler bu deeri deitirerek kontrolu ele geirir.
  12. word, CODE segmentin dosyadaki yerini belirtir.


> Yukarda ve tabloda verilen bilgileri anlamak iin bir virs gibi dnp,
  bu bilgileri kullanarak EXE dosyaya bulayormu gibi yapalm..

  Virsmz TSR, interrupt 21h'e taklm ve her int 21h kesilmesinde ax
  yazmacnda 4B00h deeri var m diye kontrol ediyor. Kontrol sonucu olumlu
  ise bulama ilemine geebiliriz. Bir dosyaya bulama yapmak iin bize o
  dosyann ismi yeterlidir. Ki bu da DS:DX yazmalarnn iaret ettii adreste
  bulunmaktadr. Dosya alarak ilk word'te 'MZ' veya 'ZM' olup olmadna
  baklr. Bu kontrol dosyann EXE olup olmadn anlamak iindir.

  EXE olduuna emin olduktan sonra dosyann 8, 9, 11 ve 12. word'leri virsn
  iinde bir alanda saklanr. Bunlar dosyann orjinal SS,SP,IP,CS
  deerleridir. Virsn CODE SEGMENT'inin hesaplanmas iin dosyann
  uzunluunuda bir kenarda saklyoruz. Bundan sonra dosya sonuna virsn kodu
  eklenir ve dosyann virslenmi uzunluu bulunur. Bu uzunluk 512'ye
  blnr. Artan varsa blm bir arttrlr ve EXE headerin 3. word'nde,
  kalan ise 2. word'ne konulur.

  u anda dosya virslendi ama 8,9,11 ve 12. word'ler deitirilmedii iin
  altrldnda kontrol virse gemez.

  Header'n 9. ve 11. word'ndeki deerler olduu gibi yazmalara (SP,IP)
  aktarlaca iin bunlar aklamay sonraya brakyoruz.

 8. ve 12. word'lerin deerlerini bulmak iin biraz hesap yapmak gerekir.
  Bundan nce bir ema vererek yaplacak ilemler hakknda bir fikir vermek
  istiyorum.

     Ŀ
              EXE header            
     Ŀ
                                      
                                      
                                      CODE SEGMENT
                                    Ŀ
       orjinal programn kodu       bu ksmn uzunluunu 16'ya  
                                    blp,bulunan paragraf adedi
                                    headerin 12. word'ne konur.
                                    
                                      
                                    ĳĿ STACK SEGMENT
                                        Ŀ
     Ĵ bu ksmn uzunluunu 16'ya    
             virs kodu                  blp,bulunan paragraf adedi  
                                         headerin 8.word'ne konur.    
                                         
     Ĵ
             virs stack'          
                                    
     > SP (9.word)



  Yukardaki ema ile iin nasl olaca hemen hemen ortaya kt.
    -Hk... Mk...
    -Efendim..
    -yi de abi, u orjinal programn uzunluunu nasl bulucaz.
    -Sabret ocuum.. Anlataz herhalde di mi?..

  Ne diyordum?.. EXE header'n uzunluu paragraf cinsinden 5. word'de
  bulunmaktadr. Bunu 16 ile arparsak, header uzunluunu byte olarak
  bulabiliriz.

  Byte olarak bulduumuz bu header boyunu virssz dosya uzunluundan
  karrsak, orjinal programn uzunluunu bulabiliriz. Bu deeri 16'ya
  blersek (CODE SEGMENT) header'in 12. word'nde konulacak deeri buluruz.
  Bu blmden kalan (IP) 11. word'e konulacaktr.

  STACK SEGMENT iin de ayn ilem yaplr.

  Burada tek fark, virs kodunun uzunluu orjinal program uzunluuna eklenip
  16'ya blnecek, kan sonu 8.word'e konacaktr. SP'nin (9. word) deeri
  stack olarak belirlediiniz uzunluu verebilirsiniz.

  Virs header'i bu ekilde dzenledikten sonra dosyay kapatr ve
  altrlmak zere kontrolu sisteme devreder.


> Efendim bu ayki beraberliimiz de burada sona eriyor.
  Mays ayndaki boluk iin tekrar tekrar zr dilerim. :'-{(

  Sorularna hzl cevap almak isteyenler iin adresim:

  tezkolr@doruk.com.tr
  ====================




        Gk altnda kalan PSAV 3'ten blmler....


------------
PSAV_DIR.ASM
------------
jumps
locals @@
.model tiny
.data
extrn doserrno:word
.code

public _findnext
_findnext proc near
        mov     ah,4fh
        int     21h
        jnc     @@tamam
        mov     doserrno,ax
        stc
@@tamam:
        ret
_findnext endp

public _findfirst
_findfirst proc pascal ara:dword,fattr:word
        push    ds cx dx
        mov     cx,fattr
        mov     ah,4eh
        lds     dx,ara
        int     21h
        pop     dx cx ds
        jnc     @@tamam
        mov     doserrno,ax
        stc
@@tamam:
        ret
_findfirst endp


public _SetDtaAdr
_SetDtaAdr proc pascal adr:dword
        push    ds
        lds     dx,adr
        mov     ah,1ah
        int     21h
        pop     ds
        ret
_SetDtaAdr endp

public _GetDtaAdr
_GetDtaAdr proc near
        push    es
        mov     ah,2fh
        int     21h
        mov     dx,es
        mov     ax,bx
        pop     es
        ret
_GetDtaAdr endp

public _Getdisk
_Getdisk proc  near
        mov     ah,19h
        int     21h
        ret
_GetDisk endp

public _Setdisk
_SetDisk proc pascal sur:byte
        mov     dl,sur
        mov     ah,0eh
        int     21h
        ret
_SetDisk endp

public _Chdir
_Chdir  proc pascal dir:dword
        push    ds
        lds     dx,dir
        mov     ah,3bh
        int     21h
        pop     ds
        jnc     @@tamam
        mov     doserrno,ax
        stc
@@tamam:
        ret
_ChDir  endp

public _GetCurrDir
_GetCurrDir proc pascal buffer:dword
        push    ds
        lds     si,buffer
        xor     dl,dl
        mov     ah,47h
        int     21h
        pop     ds
        ret
_GetCurrDir endp
end





































 