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


Benim sistemimde kodun hata ayıklamasını önlemek için yapılan kodları gerçekten istemediğini düşünüyorum. Kod yazarının güvenilemeyeceğini gösterir. - bruceatk
Bruceatk ile, özellikle de uygulamayı oluşturmak için kullandığım DLL'ler ve diğer bileşenler için katılıyorum. Kullandığım tüm uygulamalarla daha az ilgileniyorum. Firmanın iflas ettiğine şaşırmadım :) - iyi kodlar üretmekten daha iyi zaman geçiriyorlar. - Michael
Bruceatk yani, Windows çalıştırmazsın? İşletim sisteminin kendisi, daha ilginç koruma mekanizmalarının bir kısmını saklamaya yardımcı olmak için bazı hata ayıklayıcı kodlar içeriyor. - mrduclaw
@mrduclaw. Evet, ama ifademi değiştirmiyor. Gerçek şu ki, insanların sevmediğiniz şeylerle yaşamak zorundasınız. Microsoft'un yaptığı her şeye kesinlikle güvenmiyorum. Özellikle de, HP dizüstü bilgisayarlarımdan 3 tanesinin tümünü orijinal olarak işaretlemeyen Windows Orijinal Ürün Avantajı Bildirimi'nde bir kusur yaşadıkları zaman. Çözümleri hepsini yeniden görüntüledim, hayır dedim. Sorunlarını çözdüler. Yeniden görüntü almadım. - bruceatk
@bruceatk, yazılımda anti-debugger hilelerinin yaygın olduğunu belirttim. Onlardan kaçamazsın. Özellikle dünyadaki en baskın işletim sistemi onları kullandığında, anti-debugger hileleri kullanan yazılımlardan nefret etmenin bir nedeni yoktur. - mrduclaw


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



Birisinin denemesinden 6 ay önce geldiğini söyleyebilirim. Bu çabaya değmez. Eminim ne yaparsan yap, hiç düşünmediğin bir şey tarafından kolayca atlandı. - bruceatk
evet, koruma sadece atlandı. Kraker "sadece", kopya kontrolünden sonra (dondurucu stili) çalışan yürütülebilir dosyanın bir görüntüsünü yaptı. Oyununuzu neredeyse altı ay boyunca warez sitelerinde bulamamanız büyük bir başarıydı. - Nils Pipenbrinck
Yazılımınızı makul bir fiyattan satmak daha iyi olmaz ve oyun topluluğunuz için bir eklenti içeriği oluşturmak için bir kullanıcı topluluğunu tanıtan bir mekanizma sağlayın ve sizin adınıza oyununuz için addons satabilirsiniz. Bunu warez sitelerinde alan insanlar sizin müşterileriniz değildir ve asla olmayacaktır. - bruceatk
Birçok potansiyel müşteri, yazılımı satın alabilecek ve hatta bir kredi kartına sahip olsa bile, satın almadan önce korsanları kontrol edebilir. Nils ile aynı fikirdeyim. Korumayı bir ay bile kesintisiz tutabiliyorsanız, bu büyük bir başarıdır ve kendisi için ödeme yapabilir. - John Smith
"Kopyalama koruması ve bazı temel işlevler daha sonra mikroişlemci için derlenecek (GCC burada çok yardımcı oluyor) ve programa ikili bir blok olarak bağlanıyor." Eğer sadece rms biliyorsa ... - leftaroundabout


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





Referans başlatılmamış hafıza! (Ve diğer kara büyü / vodoo ...)

Bu çok güzel bir okuma: http://spareclockcycles.org/2012/02/14/stack-necromancy-defeating-debuggers-by-raising-the-dead/


4
2018-02-28 18:39



Eminim ki, jokerlerin adım adım atması daha az ozeye özgü şeylere bağlı olarak bu yönüyle daha karışık bir şey bulabilirim. - Joshua


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



Saldırgan? Bu saldırganı etiketlemeyi kiminle benimle iletişime geçeceğini ve onun hakkında neyin rahatsız edici olduğunu açıklamayı çok isterim. bruceatk@comcast.net - bruceatk
+1 "saldırgan" ın karşıtı olarak hareket etmek. Nükleer güç kaygıları için +1 sanal nokta. - Bob Cross
Seni saldırgan olarak işaretlemedim, ama senin mesajın gerçekten konu dışı olduğu için seni reddettim. - rhinovirus
@rhinovirus. Hedefe çıktı. Hata ayıklamayı caydırma ihtiyacı, kopya koruma mekanizmanızı bozan kişileri yavaşlatmaktır. Bu kopya koruma mekanizması, lisansın yazılıma nasıl uygulanacağını ve benim ortaya koyduğum noktayı kapsayabilir. - bruceatk
Anti-hata ayıklama yazılımı yaygın bir şeydir. Ayrıca, lisanslama ile ilgili noktanız benim için alakasız gibi görünüyor. Yazılım nasıl çağırıyor IsDebuggerPresent() (ya da benzer hile) yazılımın nasıl lisanslandığı konusunda bir etkisi var mı? - mrduclaw


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



Wtf - MIPS da kullanıyorsunuz? Bunu böyle yapan tek kişi olduğumu düşünmüştüm. - Nils Pipenbrinck
İlk olarak, özel bir komut seti tasarlamak istedim, ancak kendim için kendimi elle yazmayı ve hata ayıklama yapmayı kınadığımı anladı. Bu yüzden gcc :-) tarafından desteklenen basit bir işlemci aramaya gittim - zvrba


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