Çö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ı
- Çağrılan adresin, process mimarisinin ve fonksiyon imzasının doğru olduğunu doğrulayın.
RIP,RSP,RCX,RDXile çağrı sonrasıRAXdeğerini trace loglardan karşılaştırın.- Stack argümanı varsa dönüş zincirinin çağrıdan sonra geri yüklendiğini doğrulayın.
- Hedef thread'in exit code'unu, suspend sayacını ve lock durumunu inceleyin.
- 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.
Thread seçimi
NThread tek bir hedef thread'i yakalar ve yaşam döngüsü boyunca onu sürer. Bu nedenle thread seçimi yalnızca performans tercihi değildir;...
NThread sorun giderme
Bu sayfa hata mesajını belirti olarak ele alır. Amaç, hemen daha büyük timeout vermek değil, çağrının hangi aşamada bozulduğunu ayırmaktır.