ConfuserEx’i Ayrıştırmak - x86 anahtar yüklemleri

Qgenays

Katılımcı Üye
20 Haz 2020
254
3
Los Santos
ConfuserEx’i Ayrıştırmak - x86 anahtar yüklemleri
Bu yazıda, ConfuserEx’teki yerli yüklem anahtarlarının nasıl çalıştığını ve sistemin asıl akışını açığa çıkarmak için onları nasıl düzeltebileceğinizi açıklamaya çalışacağım.
Kullanılan araçlar:
• Reflector (Yansıtıcı)
• ILSpy
• OllyDbg
• CFF Explorer (CFF Kaşifi)
Hedef dosya:
http://www.multiupload.nl/34A98ZNG8Y
Giriş
ConfuserEx’teki yeni özelliklerden biri, gelişmiş kontrol akışı gizlemedir. Bu özellik daha iyi hale getirilmiştir ve de4dot’ın açığa çıkaramayacağı anahtarlar yaratabilir. Bunun nedeni kısmen, anahtar talimatının yerel bir yöntem aracılığıyla alınan bir değere bağlı olmasıdır, bu da de4dot'un ilk atlamanın nereye gittiğini taklit etmesini veya değerlendirmesini imkansız hale getirir. Reflector'da "yerel anahtar" ın nasıl göründüğüne dair bir örnek:
Eğer bu tür konularla ilgiliyseniz, buna benzer daha fazla içerik koymaya çalışacağım bloguma göz atın:
http://ubbecode.wordpress.com/

5IYwGj.jpg


Buna bakarsanız, her durum, aynı kodu tekrar çalıştıracak olan Label_0006'ya geri döndüğü için, sonsuz bir döngü gibi göründüğünü görebilirsiniz. Olay bundan ibaret değil. Eğer bunun arkasındaki IL koduna bakarsak,neden olduğunu göreceğiz. Hadi bu bloğun IL koduna bakalım:

5IYdhH.jpg


Burada, anahtara geri dönmeden önce yığına yeni bir değer ittiğini görüyoruz, yani sonsuz bir döngü değil. Reflector'ın bunu neden doğru yorumlamadığından emin değilim ama bunun pek bir önemi yok. Bundan sonra, bu yazıda kodu görüntülemek için ILSpy'ı kullanacağım çünkü daha doğru bir kod gösteriyor.
Bu anahtarı anlamlı hale getirmek için yapmamız gereken ilk şey, ilk atlamanın nereye gittiğini bulmaktır. Bunu bulabilmek için anahtarın bağlı olduğu değeri geri döndüren yöntemi analiz etmemiz gerek. Koda bakalım:

5IHUMv.jpg


IL-0006’daki çağrıyı takip ediyoruz ve bulduğumuz:

5IH3X6.jpg


İsim net olmasa da, okunabilir karakterler ILSpy, sistemin **** veri simgesini ismin sonuna ekler. Bu, PST06000002'den hedef yöntemimizin 2. sıradaki Yöntem tablosunda olduğunu söyleyebileceğimiz anlamına gelir.

5IH0cH.jpg


Bu JITting karışmamış yerli bir yöntemtir, ki bu da OllyDbg’de bir dosya açabileceğimiz ve sistemin ne yaptığına bakabileceğimiz anlamına gelir:
OllyDbg içine dosyayı yükleyin Üst menüdeki “View (Görüntüle)” tuşuna basın  Executable modules (Çalıştırılabilir modüller)  bizim modulümüzü bulun (dumped.exe) ve iki kez tıklayın. CPU penceresinin en üstüne kaydırın ve şuna benzer bir şey göreceksiniz:

5ILRxS.jpg


Bu, yürütülebilir dosyanın .NET dizinidir, yani tüm yöntem gövdelerinin hemen ardından gelmesi gerekir. Şimdi hedef yöntemimizi bulmak için:
Adresin en solundaki ilk 4 numarayı kopyalayın, bu durumda 012C  Ctrl + G’ye basın  012C’yi yerleştirin ve sonra hedef yöntemin RVA’sını yerleştirin, bu durumda 229C

5ILVpb.jpg


Bu bizi doğruca koda yönlendirecek:

5ILbNR.jpg


Peki şimdi anahtardaki ilk atlamanın nereye gittiğini bulmak için, RETN talimatına bir kesme noktası koyun ve ayıklanmış uygulamayı çalıştırın (F9). Kesme noktasına ulaştığımız zaman, OllyDbg’deki Kayıtlar(FPU) penceresine bakın ve EAX’in ne içerdiğine göz atın:

5INV7M.jpg


EAX = 00000001 ilk atlamanın Durum 1’e gittiği anlamına gelir:

5INCyj.jpg


Uygulama şimdi girdinin üzerine bekliyor. Konsola herhangi bir şey girin ve EAX’e tekrar bakın:

5INzCY.jpg


EAX = 0000000D (13) ikinci atlamanın Durum13’e gittiği anlamına gelir:

5INXis.jpg


Sistemin sonuna kadar bunu yapmaya devam edersek, kodun asıl akışını görebiliriz. Açıkçası bu sistemi aöığa çıkarmak için uygun bir yol değildir çünkü el yordamıyla yapmak çok uzun sürer ve yükleme neyin aktarıldığına bağlı olarak farklı durumlar vardır, örneğin:

5INDTN.jpg


Umarım bu yazı size anahtarların nasıl uygulandığı ve kod ile nasıl çalıştıkları hakkında en azından bir fikir vermiştir. Anahtarları açığa çıkarmanın kolay bir yolu yoktur. Bunu bir uygulamada otomatik olarak yapmak için, her bir yüklemin dönüş değerini belirlemek için küçük bir x86 emülatörü (öykünücüsü) oluşturmanız gerekir, ve buradan IL bloklarını yeniden bölümleyin, böylece temiz bir sistem oluştururlar veya dönüş değerini elde etmek için dinamik olarak sistemi çalıştırırlar.

İşte yazdığım BeaEngine ve dnlib’i kullanarak yöntemleri nasıl taklit edebileceğinize dair bir örnek (dağınık, ancak temel bir örnek olarak olabilir):
https://github.com/UbbeLoL/ConfuserDeobfuscator/tree/x86emu/ConfuserDeobfuscator/Confus
erDeobfuscator/Engine/Routines/Ex/x86


 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.