iToverDose/Yazılım· 26 MAYIS 2026 · 12:03

TinyLoad v6: PE Paketleyiciyi Tamamen Yeniden Tasarladı

Windows PE dosyalarını paketleyen TinyLoad’un yeni sürümü, sanal makine tabanlı koruma katmanlarını daha da derinleştirdi. Opcode tablolarının parçalanması, şifreli dispatch sistemi ve kontrol akışı karmaşıklaştırmasıyla man-in-the-middle saldırılara karşı dayanıklılığı artırdı. Geliştiriciler, paketleme sürecini basitleştiren yeni özelliklerle tanışabilir.

DEV Community4 dk okuma0 Yorumlar

Windows uygulamalarını paketleyerek koruma altına almayı sağlayan TinyLoad, altıncı versiyonuyla beraber sanal makine (VM) tabanlı koruma mekanizmalarını bir üst seviyeye taşıdı. Projenin geliştiricisi tarafından MIT lisansı altında yayınlanan bu açık kaynak araç, sadece tek bir .cpp dosyasından oluşuyor ve harici bağımlılık gerektirmiyor. Peki, TinyLoad v6 neler getiriyor?

Sanal Makine Dispatch Mekanizmasını Tamamen Değiştirdi

Önceki versiyonlarda, TinyLoad’un sanal makine yorumlayıcısı vmRun fonksiyonunda devasa bir switch(op) yapısı bulunuyordu. Bu yapı, 28 farklı opcode işleyicisini yönlendiriyordu ve disassembler araçları tarafından hemen tanınan bir desen olarak görülüyordu. Geliştiriciler, bu desen sayesinde opcodelerin ne yaptığını yeniden inşa edebiliyor ve böylece koruma sistemini kolayca kırıp analiz edebiliyorlardı.

TinyLoad v6 ise bu sorunu hesaplanmış etiket (computed-goto) dispatch tablosu kullanarak çözüyor. GCC’nin desteklediği &&label uzantısını kullanan bu sistemde, opcode işleyicilerinin adresleri çalışma zamanında dinamik olarak oluşturuluyor. İşte temel adımlar:

static void* s_tbl[32] = {}; // Dosya kapsamında tanımlı, çalışma zamanında doldurulur

// Paketleme zamanı: Canlı etiket adreslerini oku ve rastgele bir anahtarla şifrele
uint64_t dispKey = rng3();
for (int i = 0; i < 32; i++) {
    uintptr_t addr = (uintptr_t)s_tbl[i];
    s_tbl[i] = (void*)(addr ^ dispKey);
}

// Anahtar, paketlenmiş dosyanın son kısmında saklanır

// Çalışma zamanı: Şifreyi çöz ve atla
dispatch:
    uint8_t raw = vmCode[ip++];
    uint8_t sub = raw >> 3, slot = raw & 7;
    uint8_t op = decodeOp(sub, slot);
    void* handler = (void*)((uintptr_t)s_tbl[op] ^ dispKey);
    goto *handler;

Bu yaklaşım sayesinde, s_tbl içinde hiçbir statik adres bulunmuyor. Paketleyici, kendi çalışan sürecinden etiket adreslerini okuyarak bunları rastgele bir anahtarla XOR işlemine tabi tutuyor ve sonuçları paketlenmiş dosyanın son kısmına yerleştiriyor. Paketlenmiş stub ise çalışma zamanında bu tablonun şifresini çözerek yeniden oluşturuyor. Artık analiz araçları için statik bir atlama tablosu bulunmuyor ve switch yapısının tanınabilir deseni ortadan kalkıyor.

Opcode Tablolarını Parçalayarak Güvenliği Artırdı

Beşinci versiyonda, tüm 32 opcode tek bir FNV türevi anahtarla şifrelenmişti. Bu anahtarı kırmak, tüm opcode tablosunu açığa çıkarıyordu. TinyLoad v6 ise bu sorunu dört bağımsız 8’lik alt tabloya bölerek çözüyor. Her alt tablo, farklı veri parçalarından türetilen bağımsız anahtarlarla şifreleniyor:

// Dört adet bağımsız 8’lik alt tablo, her biri farklı anahtarlarla XOR şifreli
BYTE sub0[8], sub1[8], sub2[8], sub3[8];

// Her alt tablo için anahtar, farklı veri parçalarından türetiliyor
uint32_t k0 = fnv(origSz, packSz, vmCode[0..7]);
uint32_t k1 = fnv(packSz, vmCodeSz, payload[0..7]);
uint32_t k2 = fnv(vmCodeSz, origSz, vmCode[8..15]);
uint32_t k3 = fnv(origSz ^ packSz, vmCodeSz, payload[8..15]);

// Şifreleme işlemi
for (int i = 0; i < 8; i++) {
    sub0[i] ^= (uint8_t)(k0 >> (i % 4 * 8));
    sub1[i] ^= (uint8_t)(k1 >> (i % 4 * 8));
    // ...
}

Bu sayede, tek bir alt tablo anahtarını kırmak en fazla 8 opcode’u açığa çıkarırken, diğer 20 opcode üç farklı anahtarın arkasında gizlenmiş oluyor. Her paketlenmiş dosya, dört alt tablo üzerinden tamamen farklı bir opcode kodlamasına sahip oluyor. Bu da analizcilerin tablonun tamamını yeniden inşa etmesini neredeyse imkansız hale getiriyor.

Kontrol Akışı Karmaşıklığını Artırdı

TinyLoad’un tryRun ve runInMem fonksiyonları, artık fonksiyon işaretçi tabloları aracılığıyla aşamalı olarak çalıştırılıyor. Bu sayede, doğrusal bir akış yerine karmaşık bir kontrol akışı oluşturuluyor:

  • tryRun: s_chks_lds_prss_vms_dcs_ex
  • runInMem: sp_hdrsp_mapsp_relocsp_importsp_go

Buna ek olarak, her aşama geçişinde ve sanal makine her 64 adımında noiseDecrypt() fonksiyonu devreye giriyor. Bu fonksiyon, rastgele anahtarlarla atık tamponlara sdec2 çağrısı yapıyor. Dinamik analiz sırasında, gerçek dize şifreleme çağrıları (IAT kancası aramaları gibi) bu benzeri çağrılar arasında kayboluyor. Hangi çağrının önemli olduğunu anlamak için tüm yolları çalıştırmak gerekiyor.

Diğer Önemli Geliştirmeler

TinyLoad v6, sadece VM tabanlı koruma sistemini değil, aynı zamanda genel PE yükleyici güvenliğini de artırıyor:

  • Tam kaynak kopyalama: Önceki versiyonlarda yalnızca RT_ICON, RT_VERSION ve RT_MANIFEST gibi sabit kaynak türleri destekleniyordu. Altıncı versiyonda ise EnumResourceTypesA kullanılarak tüm kaynak türlerinin paketlenmesi sağlandı.
  • LZ sıkıştırma düzeltmesi: Eşleme zincirinde oluşan bir self-loop hatası nedeniyle sıkıştırma kalitesinde hafif bir düşüş yaşanıyordu. Bu hata giderilerek sıkıştırma performansı yaklaşık %2 oranında iyileştirildi.
  • PE yükleyici sertleştirmesi: SizeOfBlock alt taşması koruması, relokasyon sınırı doğrulaması, negatif e_lfanew reddi ve ithalat thunk yineleme sınırı gibi güvenlik önlemleri eklendi. Hata yayılımı da daha iyi yönetiliyor.

Kullanım ve Gelecek Planları

TinyLoad’un altıncı versiyonunu kullanmak için basit bir komut satırı arayüzü bulunuyor:

TinyLoad.exe --i myapp.exe --vm --c

Kaynak kodundan derlemek içinse şu komut kullanılabilir:

g++ -o TinyLoad.exe TinyLoad.cpp -static -O2 -s

Güncel ikili dosyalar GitHub üzerindeki yayımlar bölümünden indirilebilir.

Geliştiriciye göre TinyLoad’un gelecekteki yediinci versiyonunda çözülmesi gereken en büyük sorun, bellek dökümlerinin (memory dump) işe yaramaz hale getirilmesi. Şu anda payload bellekte deşifre edildiğinde self-kontrollü bir yapıya sahip. Yedinci versiyonda, payload’ın çalışma zamanında stub’a geri çağırmalar yapması ve böylece bellek dökümlerinin çalışmaz hale getirilmesi hedefleniyor. Ayrıca, daha opak öngörü (opaque predicate) çeşitliliği ve bytecode şifrelemesi gibi ek koruma katmanları da planlanıyor.

Eğer TinyLoad’un bazı dosyaları paketlerken sorun yaşadığınızı fark ederseniz, lütfen bir issue açın. Yıldız vermeyi de unutmayın ❤️

Yapay zeka özeti

Windows PE dosyalarını paketleyen TinyLoad’un yeni sürümü, sanal makine tabanlı koruma katmanlarını daha da derinleştirdi. Opcode tablolarının parçalanması, şifreli dispatch sistemi ve kontrol akışı karmaşıklaştırmasıyla man-in-the-middle saldırılara karşı dayanıklılığı artırdı. Geliştiriciler, paketleme sürecini basitleştiren yeni özelliklerle tanışabilir.

Yorumlar

00
YORUM BIRAK
ID #QB36FL

0 / 1200 KARAKTER

İnsan doğrulaması

9 + 2 = ?

Editör onayı sonrası yayına girer

Moderasyon · Spam koruması aktif

Henüz onaylı yorum yok. İlk yorumu sen bırak.