ConfuserExi Ayrıştırmak - x86 anahtar yüklemleri
Bu yazıda, ConfuserExteki 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ş
ConfuserExteki 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-0006daki ç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 OllyDbgde 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 + Gye basın 012Cyi yerleştirin ve sonra hedef yöntemin RVAsı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, OllyDbgdeki Kayıtlar(FPU) penceresine bakın ve EAXin ne içerdiğine göz atın:
EAX = 00000001 ilk atlamanın Durum 1e gittiği anlamına gelir:
Uygulama şimdi girdinin üzerine bekliyor. Konsola herhangi bir şey girin ve EAXe tekrar bakın:
EAX = 0000000D (13) ikinci atlamanın Durum13e 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 dnlibi 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
Bu yazıda, ConfuserExteki 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ş
ConfuserExteki 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-0006daki ç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 OllyDbgde 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 + Gye basın 012Cyi yerleştirin ve sonra hedef yöntemin RVAsı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, OllyDbgdeki Kayıtlar(FPU) penceresine bakın ve EAXin ne içerdiğine göz atın:
EAX = 00000001 ilk atlamanın Durum 1e gittiği anlamına gelir:
Uygulama şimdi girdinin üzerine bekliyor. Konsola herhangi bir şey girin ve EAXe tekrar bakın:
EAX = 0000000D (13) ikinci atlamanın Durum13e 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 dnlibi 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: