Soru En sevdiğin anti-hata ayıklama hilesi nedir?
Önceki işverenimde temelde sadece bir DLL ve bir başlık dosyası olan üçüncü taraf bir bileşen kullandık. Bu özel modül Win32'da yazdırmayı ele aldı. Ancak, bileşeni yapan şirket banka kredisi aldı, böylece bulduğum bir hatayı bildiremedim.
Bu yüzden hatayı kendim düzeltmeye ve hata ayıklayıcısını başlatmaya karar verdim. Hemen hemen her yerde anti-hata ayıklama kodunu bulmak için şaşırdım, her zamanki
IsDebuggerPresentama dikkatimi çeken şey şuydu:
; some twiddling with xor
; and data, result in eax
jmp eax
mov eax, 0x310fac09
; rest of code here
İlk bakışta iki kez çağrılan rutinin üzerine adım attım, sonra işler sadece muzlara gitti. Bir süre sonra, bit çıldırtma sonucunun her zaman aynı olduğunu fark ettim, yani jmp eax her zaman
mov eax, 0x310fac09 talimat.
Baytları parçalara ayırdım ve oradaydı.
0f31,
rdtsc DLL'deki bazı çağrılar arasında harcanan zamanı ölçmek için kullanılan talimat.
Yani benim sorum şu: En sevdiğin anti-hata ayıklama hilesi nedir?
25
2018-02-21 14:28
Menşei
Cevaplar:
En sevdiğim oyun, anlaşılmaz bir mikroişlemci için basit bir komut emülatörü yazmak.
Kopya koruma ve bazı temel işlevler daha sonra mikroişlemci için derlenecek (GCC burada büyük bir yardımdır) ve programa ikili bir blok olarak bağlanır.
Bunun arkasındaki fikir, kopya korumanın sıradan x86 kodunda bulunmaması ve bu nedenle demonte edilememesidir. Tüm emülatörün tamamını kaldıramazsınız, çünkü bu, çekirdek işlevini programdan kaldırır.
Programı kırmanın tek şansı mikroişlemci emülatörünün ne yaptığını tersine çevirmektir.
Emülasyon için MIPS32 kullandım çünkü öykünmesi çok kolaydı (sadece 500 satırlık basit C kodu aldı). İşleri daha da karanlık hale getirmek için ham MIPS32 opcodes kullanmamıştım. Bunun yerine her bir opcode kendi adresi ile xor'ed.
Kopya korumanın ikili verileri çöp verisine benziyordu.
Şiddetle tavsiye! Bir çatlak ortaya çıkmadan önce 6 aydan fazla sürdü (bir oyun projesi içindi).
27
2018-02-21 15:08
Birçok RCE topluluğunun bir üyesi oldum ve hackleme ve çatlama konusunda adil payıma sahip oldum. Benim zamanımdan bu tür çirkin püf noktaları genellikle uçucu ve oldukça nafile olduğunu fark ettim. Genel anti-hata ayıklama püf noktaları çoğu OS'ye özgüdür ve hiç 'taşınabilir' değildir.
Yukarıda belirtilen örnekte, büyük olasılıkla satır içi montajı ve
naked fonksiyon
__declspecHer ikisi de x64 mimarisini derlerken MSVC tarafından desteklenmez. Elbette yukarıda bahsi geçen hile uygulamak için hala yollar vardır, ancak yeterince uzun süredir geri dönen herkes bu hileyi birkaç dakika içinde tespit edip yenebilir.
Genelde anti-hata ayıklama hileleri kullanmanın dışında
IsDebuggerPresent Algılama için API. Bunun yerine, bir saplama ve / veya sanal bir makine kodlamanızı öneririm. Kendi sanal makinemi kodladım ve uzun yıllardır bunun üzerinde ilerliyorum ve dürüstçe, kodumu bugüne kadar koruyacak en iyi karar olduğunu söyleyebilirim.
6
2018-02-21 14:46
Ebeveyne bir hata ayıklayıcı olarak bağlanan ve temel değişkenleri değiştiren bir alt işlemden çıkın. Çocuk süreçlerini saklamak ve hata ayıklayıcı bellek işlemlerini belirli anahtar işlemler için bir tür IPC olarak kullanmak için bonus puanları.
Sistemimde, aynı işlem için iki hata ayıklayıcı ekleyemezsiniz.
Bu konuda iyi bir şey, hiçbir şey kırılmayacak şeyleri kurcalamaya çalışmadıkça.
6
2018-02-21 16:50
4
2018-02-28 18:39
En modern gizleme yöntemi sanal makine gibi görünüyor.
Temel olarak nesne kodunuzun bir kısmını alıp kendi bytecode biçiminize dönüştürüyorsunuz. Sonra bu kodu çalıştırmak için küçük bir sanal makine ekleyin. Bu kodu doğru bir şekilde ayıklamanın tek yolu, sanal makinenizin komut formatı için bir emülatör veya disassembler kodlamak olacaktır. Tabi ki performansınızı da düşünmelisiniz. Çok fazla bayt kodu programınızın yerel koddan daha yavaş çalışmasını sağlar.
En eski hileler şimdi işe yaramaz:
- Isdebuggerpresent: çok gevşek ve kolay yama
- Diğer hata ayıklayıcı / kesme noktası algılamaları
- Ring0 şeyler: kullanıcılar sürücüleri yüklemeyi sevmiyor, aslında sistemlerinde bir şeyleri kırıyor olabilirsiniz.
- Herkesin bildiği ya da yazılımınızı kararsız kılan diğer önemsiz şeyler. Bir çatlağın programınızı kararsız hale getirse de hala işe yaradığını bile hatırlayın, bu kararsızlık sizin için sorumlu tutulacaktır.
VM çözümünü gerçekten kodlamak istiyorsanız (satış için iyi programlar var), sadece bir yönerge biçimi kullanmayın. Polimorfik yapın, böylece kodun farklı bölümlerinin farklı formatları olabilir. Bu şekilde tüm kodlarınız sadece bir emülatör / disassembler yazılarak kırılamaz. Mesela, MIPS çözüm formatı iyi belgelendirildiğinden ve IDA gibi analiz araçları halihazırda kodu parçalara ayırabildiğinden, MIPS çözümünün sunduğu bazı kişiler kolayca kırılmış gibi görünmektedir.
IDA pro disassembler tarafından desteklenen talimat formatlarının listesi
3
2018-02-21 15:21
İnsanların sağlam, güvenilir ve ne yapması gerektiğini bildiren bir yazılım yazmasını tercih ederim. Aynı zamanda makul bir lisansla makul bir fiyata satıyorlar.
Müşteriler ve satıcılar için sorunlara yol açan karmaşık lisanslama şemalarına sahip satıcılarla uğraşmak için çok fazla zaman harcadığımı biliyorum. Bu satıcılardan kaçınmak her zaman benim tavsiyemdir. Bir nükleer santralde çalışmak, belirli satıcı ürünlerini kullanmaya zorlanmakta ve bu nedenle lisanslama programlarıyla uğraşmak zorunda kalmaktadır. İşe alınmış bir lisanslı ürün vermedeki başarısız girişimleriyle kişisel olarak uğraştığım zamanı geri almanın bir yolu olsaydı. Sormak için küçük bir şey gibi görünüyor, ama yine de kendi iyilikleri için çok zor olan insanlar için zor bir şey gibi görünüyor.
3
2018-02-21 16:32
Ben sanal makine önerisi ikincisi. Mipsel-elf-gcc ile üretilen ikili dosyaları çalıştırabilen bir MIPS I simülatörü uyguladım. Bu kod / veri şifreleme yeteneklerini (AES veya seçtiğiniz herhangi bir başka algoritma ile), kendi kendine simülasyon yeteneğini ekleyin (böylece iç içe simülatörlere sahip olabilirsiniz) ve oldukça iyi bir kod obfusatörünüz var.
MIPS I'i seçmenin güzel özelliği, 1) uygulaması kolaydır, 2) C'ye kod yazabilirim, masaüstümde hata ayıklayabilir ve tamamlandığında MIPS için çapraz derleme yapabilirim. Özel op kodları hata ayıklamaya veya özel bir VM için elle kod yazmaya gerek yok.
2
2018-02-21 15:01
Benim kişisel favorim bir işlemcinin olduğu Amiga'daydı. Blitter) İşlemciden bağımsız olarak büyük veri transferleri yapmak; Bu çipin tüm belleği temizlemesi ve zamanlayıcının IRQ'sundan sıfırlanması talimatı verilecektir.
Bir Action Replay kartuşunu taktığınızda, CPU’yu durdurmak Blitter’ın belleği temizlemeye devam edeceği anlamına gelir.
2
2018-03-09 07:21