| Editor Login | Register | ||
| > Bilgisayar > Güvenlik |
|
|
| New Exe Virüsleri |
| Bu tür dosyalara bulaşabilmek için öncelikle DOS EXE tipi dosyalara nasıl bulaşıldığını iyice anlamış olmak gerekir. DOS EXE tipi programlara bulaşma konusunu daha önceki sayılarda anlatmıştım. Bu yazıyı okumadan önce o yazıya bir kez okursanız daha iyi olur. Pek çok kullanıcı New Exe tipi dosyalarla Windows 3.1x ile birlikte karşılaştı. New Exe tipi dosyalar yapı itibarıyle DOS Exelerinden farklı oldukları için exe programın ilk başında bir DOS EXE header ve DOS kodu yeralmaktadır. Bu sayede bir new exe programı DOStayken çalıştırdığımızda ’This program requires Windows - Bu program Windows gerektirir’ türünden mesajlarla karşılaşabiliyoruz. Şimdi New Exe başlığının ne olduğuna bakalım Ofset Uzunluk Açıklama 00h 2 bayt ’NE’ imzası (4Eh 45h) 02h 2 bayt Linker sürümü (Major, Minor) 04h 1 word New exe başlıktan giriş tablosuna olan ofset 06h 1 word Giriş tablosunun uzunluğu 08h 1 dword Dosya yükleme CRC değeri (Turbo Pascal for Windows ile derlenen programlarda=0) 0Ch 1 bayt Program işaretleri (flags) 0Dh 1 bayt Uygulama işaretleri 0Eh 1 word Otomatik data segmenti indeksi 10h 1 word initial local heap size 12h 1 word initial stack size (data segmentine eklenir, SS<>DS ise 0000h değeri alır) 14h 1 dword CS:IP adresi, CS is index into segment table 18h 1 dword SS:SP adresi, SS segment indeksini gösterir 1Ch 1 word Segment sayacı 1Eh 1 word Modül referans sayacı 20h 1 word Bellekte yerleşik kalmayan isim tablosu uzunluğu 22h 1 word Bu başlığın segment tablosuna göre ofseti 24h 1 word Bu başlığın Resource tablosuna göre ofseti 26h 1 word Bu başlığın kalıcı isim tablosuna göre ofseti 28h 1 word Bu başlığın Modül referans tablosuna göre ofseti 2Ah 1 word Bu başlığın import tablosuna göre ofseti 2Ch 1 dword Bu başlığın kalıcı olmayan isim tablosuna göre ofseti 30h 1 word Giriş tablosunda listelenen taşınabilir giriş noktası sayısı 32h 1 word file alignment size shift count 34h 1 word Resource tablosu giriş sayısı 36h 1 bayt Hedef işletim sistemi 00: Bilinmiyor 01: OS/2 02: Windows 03: European MS-DOS 4.x 04: Windows 386 05: Borland Operating System Services 37h 1 bayt Diğer EXE işaretleri 38h 1 word offset to return thunks or start of gangload area 3Ah 1 word offset to segment reference thunks or length of gangload area 3Ch 1 word Minimun kod takas alanı boyutu 3Eh 2 bayt Beklenen Windows sürümü (Minor+Major) (Not: Bazı kısımların tercümelerini beceremedim Bu arada tablolar M$’dan alınma)New Exe program bayrakları; Bit Açıklama 0-1 DGROUP tipi 0 : none 1 : single shared 2 : multiple (unshared) 3 : null 2 global initialization 3 Sadece korunumlu mod 4 8086 komutları 5 80286 komutları 6 80386 komutları 7 80x87 komutları New Exe uygulama bayrakları; Bit Açıklama 0-2 Uygulama tipi 001 :Tam ekran 010 :Windows uyumlu 011 :Windows kullanır 3 OS/2 uygulamasıdır 4 ??? 5 0: çalıştırılabilir, 1:hatalı 6 non-conforming program (valid stack is not maintained) 7 DLL veya uygulamadan çok bir sürücü (SS:SP geçersizdir, CS:IP yazmaçları AX=modul handle ile çağrılan FAR init rutinini gösterir. Hata varsa AX=0 döner) New Exe segment tablosunun yapısı; Ofset Uzunluk Açıklama 00h 1 word Dosyadaki ofset (shift left by align shift to get bytes) 02h 1 word Dosyadaki görüntü uzunluğu (0000=64K) 04h 1 word Segment öznitelikleri 06h 1 word Segment için yeniden yerleştirilecek bayt sayısı (0000=64K) Segment Özellikleri; Bit Açıklama 0 Data segmenti 1 Kullanılmıyor 2 Gerçek mod 3 iterated 4 Taşınabilir 5 Paylaşılabilir 6 Preloaded rather than demand loaded 7 Sadece çalıştır (Kod) veya sadece oku (data) 8 Yeniden konumlandırmalar (Bu segment için direkt izleyen kod) 9 Debug info hazır 10-11 80286 DPL bitleri 12 Gözardı edilebilir 13-14 Öncelik gözardı edilebilir. New Exe yeniden konumlandırılabilir Veri Yapısı; Ofset Uzunluk Açıklama 00h 1 word Yeniden konumlandırılabilir öğe sayısı 02h 8x? bayt Yeniden konumlandırılabilir öğeler Yeniden konumlandırılabilir öğeler; Ofset Uzunluk Açıklama 00h 1 bayt Konumlandırma tipi 00h: LOBYTE 02h: BASE 03h: PTR 05h: OFFS 0Bh: PTR48 0Dh: OFFS32 01h 1 bayt İşaretler - Bit 2: additive 02h 1 word Segment içerisindeki ofset 04h 1 word Hedef Segment adresi 06h 1 word Hedef Ofset adresi Önce New Exe tipi dosyaların yapılarına bir bakalım. 0000h DOS EXE Başlığı DOS Kodu 0400h New Exe Başlığı ve bazı tablolar Segment tablosu Diğer tablolar CS:IP Windows kodu ve segmentleri Şimdi de virüslü bir New Exe programının yapısına bakalım 0000h DOS EXE Başlığı DOS Kodu 03F8h New Exe Başlığı ve bazı tablolar Segment tablosu Virüs segmenti Diğer tablolar Windows kodu ve tabloları CS:IP Virüs segmenti (Virüsün kodu+data) Yeniden konumlandırma başlangıcı Of be ne tablo ama ! Tablolarla işimizi bitirdikten sonra şimdi de New Exelere nasıl bulaşıldığına bakalım. NEW EXE TESTİ İlk aşamada bulaşılacak programın bir DOS EXE’mi yoksa New Exemi olduğuna karar vermek gerek. Bunu DOS EXE başlığının 18h ofsetine bakarak, buradaki değerin 40h veya daha yukarısı bir değer alıp almadığını kontrol ederek anlamak mümkün. Bunun yanısıra yukarıdaki New Exe headerda da göreceğiniz gibi başlığın ilk iki karakterinin ’NE’ olup olmadığını kontrol edilerek de bu olay halledilebilir. (NOT: Bu alanda eğer PE bulursanız, bu o programın Portable Executable olduğu anlamına gelir. Bu tip programlarda PE header denen ayrı bir tablo kullanılır.İleride bu konuya da değinicem) DOS BAŞLIĞINDAKİ DÜZENLEMELER Dos başlığında düzeltmeler yapılırken DOS kodunun çalıştığında set edilecek olan SP yazmacı değeri 8 azaltılmalıdır. SP yazmacı bir new exe programda DOS kodunun sonunu yada bir başka deyişle new exe başlığının başlama konumunu gösterir.Ancak gerçekte New Exe başlık göstergeci 3Ch adresinde yer alır. NEW EXE BAŞLIĞINDAKİ DÜZELTMELER 14h ofsetinde yeralan CS:IP ikilisi programa giriş noktasını göstermektedir. Bu ikiliden CS, segment tablosundaki ilk segment numarasını gösterir. Bu değer virüsün kontrolü programa devredeceği anda kullanılmak üzere saklanmalıdır. Tabi CS:IP ikilisi de virüs segmentine ayarlanmalıdır ki öncelikle virüs çalışsın. Segment sayacı, ofset 1Ch konumunda yeralan bir worddür. Programa ekleyeceğimiz virüs kodunu ayrı bir segment olarak düşünmemiz gerekir. Bu yüzden 1Ch ofsetindeki wordu 1 arttırmak gerekir. Segment tablosu pointeri NE başlıkta da görecebileceğiniz gibi 22h ofsetinde bulunan bir worddür. Eğer 4h, 24h, 26h,28h,2Ah ofsetlerindeki değerler 22h ofsetindeki değerden büyük ise büyük olan ofsetteki değerlerin 8 azaltılması gerekecektir. Bu alan virüsün segment başlangıcının hesabında kullanılır. VİRÜS SEGMENT BAŞLANGICI Virüs segmentinin başlangıcı segment tablosunun yapısı ile aynıdır. Bu yapının 2 ve 6 ofsetlerindeki word değeri virüsün uzunluğuna bağlı olarak değişir. 4 ofserindeki sayı ise segmentin çalışabilir kısmının yeniden konumlandırılabilir olmasını sağlamak için 180h değeri almalıdır.Bu şekilde orjinal programın çalıştırılması sağlanabilir. VİRÜSÜN EKLENMESİ Virüsün eklenmesi olayında şimdiye kadar anlattığımdan farklı bir olay yok. Aynı şekilde virüs kodu dosyanın sonuna yazılır. YENİDEN KONUMLANDIRMA BAŞLANGICI Bu olay da aslında New Exe yeniden konumlandırılabilir veri yapısı ile aynıdır. Bu yapıdaki ilk word 1 adet yeniden konumlandırma başlangıcı olduğundan (kontrolü orjinal programa devretmek için) 0001 değeri alacaktır.Sonraki bayt ise 3 (PTR) değeri alacaktır.Buradaki 3 değeri 32 bitlik JMP FAR olayını göstermektedir.Sonraki baytın değeri de 4 olmalıdır.Takip eden word, JMP FAR komutundan sonra gelecek olan dword uzunluğundaki adresin segment içindeki konumunu gösterir. Sonraki 2 word sırayla; orjinal programa ait CS ve IP değerlerini gösterir. Virüsü kodlarken dikkat etmek gereken bir-iki noktayı da böylece geçtikten sonra şimdi de bir new exe çalıştırılmaya başlandığında registerların aldıkları değerlere bakalım Ax : Ortam segmenti Bx : Ortam segmentindeki komut kuyruğunun ofseti Cx : Otomatik data degmentinin uzunluğu (0000h ise bu 64K anlamına gelir) BP : 0000h DS : Otomatik data segmenti ES : Program Segment Prefix SS:SP : Stack |
|
| Bağlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |