THT DUYURU

chat
Tersine Mühendislik Reverse Engineering ve Cracking ile ilgili dökümanları bulabileceğiniz bölüm.

ugursuz reklam
takipci
Seçenekler

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

Qgenays - ait Kullanıcı Resmi (Avatar)
Çevirmen
Üyelik tarihi:
06/2020
Nereden:
Los Santos
Mesajlar:
248
Konular:
43
Teşekkür (Etti):
458
Teşekkür (Aldı):
143
Ticaret:
(0) %
2
381
3 Hafta önce
#1
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/



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:



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:



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



İ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.



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:



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



Bu bizi doğruca koda yönlendirecek:



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:



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



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



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



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:



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/ConfuserD...uscator/Confus
erDeobfuscator/Engine/Routines/Ex/x86


---------------------
I WANT TO PLAY GAME
Konu 'Adige tarafından (bir Hafta önce Saat 20:00 ) değiştirilmiştir.
"Bin4ry, Ertugrul Bey Teşekkür etti.
'Adige - ait Kullanıcı Resmi (Avatar)
Ar-Ge Tim Lideri
Üyelik tarihi:
10/2012
Nereden:
Secure Shell
Yaş:
26
Mesajlar:
9.129
Konular:
560
Teşekkür (Etti):
797
Teşekkür (Aldı):
1537
Ticaret:
(0) %
bir Hafta önce
#2
Emeğinize sağlık
---------------------
"Kendinizi geliştirmeye o kadar çok zaman harcayın ki Başkalarının yaptıklarıyla ilgilenmeye ve onları eleştirmeye vaktiniz olmasın"



Ertugrul Bey - ait Kullanıcı Resmi (Avatar)
Tamamen Askıya Alındı
Üyelik tarihi:
10/2020
Nereden:
Söğüt
Mesajlar:
22
Konular:
0
Teşekkür (Etti):
151
Teşekkür (Aldı):
0
Ticaret:
(0) %
2 Gün önce
#3
harikasın dostum, ellerine sağlık.

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler