Editor Login | Register
Ekle

> Bilgisayar > Güvenlik
New Exe Virüsleri - Güvenlik - Bilgisayar -
SanaL_DabbE
(Relased 01.02.2008 22:15:03)


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











Derecelendir
Kaynak SanaL_DabbE Tarafından yazılmış/derlenmiştir.
İçerik İhbarı
Bağlantılar: bilgininefendisi.net

Open Source Document Project AUP&TOS