Java, VB.NET, C #, ActionScript 3.0 vb.Gibi bayt kodu tabanlı sanal makine dilleri ile, bazen İnternet'ten bazı decompiler indirmenin, bayt kodunu iyi bir zaman geçirmenin ne kadar kolay olduğunu ve Çoğu zaman, saniyeler içinde orijinal kaynak kodundan çok uzak olmayan bir şey ortaya çıkarın. Sözde bu tür bir dil buna karşı özellikle savunmasızdır.
Son zamanlarda, en azından orijinal olarak hangi dilde yazıldığını (ve böylece hangi dilde içine ayrılmaya çalışacağınızı) bildiğinizde, neden yerel ikili kodla ilgili daha fazla şey duymadığınızı merak etmeye başladım. Uzun zamandır, bunun yerel makine dilinin tipik bayt kodundan çok daha çılgın ve daha karmaşık olması olduğunu düşündüm.
Peki bayt kodu neye benziyor? Şöyle görünüyor:
1000: 2A 40 F0 14
1001: 2A 50 F1 27
1002: 4F 00 F0 F1
1003: C9 00 00 F2
Yerel makine kodu neye benziyor (onaltılı olarak)? Elbette şöyle görünüyor:
1000: 2A 40 F0 14
1001: 2A 50 F1 27
1002: 4F 00 F0 F1
1003: C9 00 00 F2
Ve talimatlar biraz benzer bir zihin çerçevesinden geliyor:
1000: mov EAX, 20
1001: mov EBX, loc1
1002: mul EAX, EBX
1003: push ECX
Diyelim ki, C ++ diyelim, bazı yerel ikili dosyaları ayrıştırmaya çalışacak dil göz önüne alındığında, bu kadar zor olan ne? Hemen akla gelen iki fikir şunlardır: 1) gerçekten bytecode'dan çok daha karmaşık veya 2) işletim sistemlerinin programları sayfalandırmaya ve parçalarını dağıtmaya meyilli olduğu hakkında bir şey çok fazla soruna neden oluyor. Bu olasılıklardan biri doğruysa, lütfen açıklayın. Ama her iki durumda da, bunu neden hiç duymuyorsunuz?
NOT
Cevaplardan birini kabul etmek üzereyim, ama önce bir şeyden bahsetmek istiyorum. Hemen hemen herkes, farklı orijinal kaynak kodu parçalarının aynı makine koduyla eşleşebileceğinden bahsetmektedir; yerel değişken adları kaybolur, başlangıçta ne tür bir döngü kullanıldığını bilmezsiniz.
Ancak bahsettiğim ikisi gibi örnekler gözlerimde önemsiz. Bazı cevaplar, makine kodu ile orijinal kaynak arasındaki farkın, bu önemsiz bir şeyden çok daha fazla olduğunu ifade etme eğilimindedir.
Ancak, örneğin, yerel değişken adları ve döngü türleri gibi şeyler söz konusu olduğunda, bytecode bu bilgileri de kaybeder (en azından ActionScript 3.0 için). Bunun decompiler aracılığıyla şeyler geri öncesi çekti ettik ve gerçekten bir değişken olarak adlandırılan umursamıyordum strMyLocalString:String
veya loc1
. Hala bu küçük, yerel kapsamı inceleyebilir ve çok fazla sorun olmadan nasıl kullanıldığını görebilirim. Ve bir for
döngü hemen hemen aynı şeydir.while
Eğer düşünürseniz döngü. Ayrıca, kaynağı irrFuscator aracılığıyla çalıştırdığımda bile (secureSWF'den farklı olarak, üye değişkenini ve işlev adlarını rastgele sıralamaktan çok daha fazlasını yapmaz), yine de daha küçük sınıflarda belirli değişkenleri ve işlevleri izole etmeye başlayabileceğiniz gibi görünüyordu, şekil nasıl kullanıldıklarını öğrenin, onlara kendi adlarınızı atayın ve oradan çalışın.
Bunun çok önemli olması için, makine kodunun bundan çok daha fazla bilgi kaybetmesi gerekir ve bazı cevaplar buna girer.