exoproc
NThread

Çökme ve hata ayıklama

Süreçler arası context ve stack düzenleme hataları çoğu zaman host'ta değil, hedef süreçte erişim ihlali olarak görünür. Aşağıdaki liste, NThread...

Süreçler arası context ve stack düzenleme hataları çoğu zaman host'ta değil, hedef süreçte erişim ihlali olarak görünür. Aşağıdaki liste, NThread tasarımının doğrudan ele aldığı veya hâlâ kullanıcıdan doğru seçim beklediği riskleri açıklar.

Stack dönüş zincirinin ezilmesi

Thread serbest bırakılırken özgün RIP/RSP geri yüklenir. Eğer geçici dönüş zinciri özgün stack pointer'a fazla yakınsa, hedefin normal yürütmesi daha sonra bu alana inebilir ve eski bir stub adresini dönüş adresi sanabilir. Sonuç yanlış adrese ret ve çökmedir.

Bu yüzden NThread, yakalanan RSP'nin altında bir tam sayfa (4096 byte) boşluk ayırır (STACK_ADD = -4096). Kaynak kodundaki not, 256 byte'ın loader lock veya string dönüşümü gibi makul call chain'lerde yetersiz kaldığını belirtir. Bu koruma riski azaltır; seçilen thread'in stack sınırına olağandışı yakın olması gibi durumları tamamen ortadan kaldırmaz.

ABI veya imza uyuşmazlığı

Yanlış argüman türü, yanlış argument sayısı, f32/f64 değerini yanlış register'dan geçirmek ya da dönüş türünü yanlış yorumlamak hedef fonksiyonun geçersiz pointer kullanmasına yol açabilir. Fonksiyon imzasını doğrulayın; özellikle struct-by-value, variadic fonksiyonlar ve özel calling convention'lar için varsayım yapmayın.

Fonksiyon geri dönmez veya thread ölür

ExitThread, uzun süren bloklayıcı fonksiyonlar, exception ile kaçan akış veya sonsuz döngü, thread'in spin stub'a dönmesini engeller. Kütüphane bunu CallTimeoutError veya CallThreadDiedError olarak bildirir. Timeout sonrasında thread context'ini körlemesine tekrar değiştirmeyin; hedefin hâlâ hayatta olup olmadığını ve thread'in durumunu inceleyin.

Yanlış zamanda suspend etmek

Thread bir mutex'i, loader lock'u veya uygulamaya özgü kritik kaynağı tutarken askıya alınırsa diğer thread'ler kilitlenebilir. Bu doğrudan access violation olmasa bile hedefi donmuş gibi gösterir. Kısa çağrılar seçin, timeout kullanın ve thread seçimini denetlenebilir hale getirin.

Stub bulunamaması veya sürüm varsayımları

Başlatma, ntdll, kernel32 ve kernelbase içinde gerekli küçük talimat dizilerini tarar. Tarama tamamlanmadan erişim yapılması yanıltıcı “stub yok” hatasına dönüşebildiği için async başlatma whenStubsReady() bekler. NoSleepAddressError, NoPushretAddressError, NoJumpAddressError, NoRetAddressError veya NoAddRsp28RetAddressError alınırsa önce hedef platformun Windows x64 olduğunu, modüllerin erişilebilirliğini ve tarama yaşam döngüsünü doğrulayın.

İnceleme sırası

  1. Çağrılan adresin, process mimarisinin ve fonksiyon imzasının doğru olduğunu doğrulayın.
  2. RIP, RSP, RCX, RDX ile çağrı sonrası RAX değerini trace loglardan karşılaştırın.
  3. Stack argümanı varsa dönüş zincirinin çağrıdan sonra geri yüklendiğini doğrulayın.
  4. Hedef thread'in exit code'unu, suspend sayacını ve lock durumunu inceleyin.
  5. Sorunu en küçük, hızlı dönen ve yan etkisiz fonksiyonla yeniden üretin.

Hedef süreç çöktüyse aynı thread/context ile devam etmeye çalışmayın. Yeni bir hedef örneği başlatıp adres ve ABI varsayımlarını önce orada doğrulayın.