Merhaba arkadaşlar ben Tuğra yani ExploitBey. Bu yazıda Windows ortamında statik ve dinamik analiz yaparak basit bir şifre korumasını nasıl aşacağımızı adım adım göstereceğim. Konu low-level meraklıları için biçilmiş kaftan, assembly bilmeyenler zorlanabilir ama takıldığınız yerleri sorabilirsiniz.
Reverse engineering, bir programın kaynak koduna sahip olmadan davranışını ve iç işleyişini anlama sanatıdır. Özellikle malware analizi, güvenlik açığı araştırması ve yazılım uyumluluğu gibi alanlarda kritik bir yetenektir. Bugünkü hedefimiz, basit bir Windows crackme'si olacak. Amacımız, programın istediği şifreyi bulmak veya şifre kontrolünü devre dışı bırakmak.
Reverse engineering, bir programın kaynak koduna sahip olmadan davranışını ve iç işleyişini anlama sanatıdır. Özellikle malware analizi, güvenlik açığı araştırması ve yazılım uyumluluğu gibi alanlarda kritik bir yetenektir. Bugünkü hedefimiz, basit bir Windows crackme'si olacak. Amacımız, programın istediği şifreyi bulmak veya şifre kontrolünü devre dışı bırakmak.
Araçlarımızı Hazırlayalım
Windows üzerinde reverse engineering için kullanacağımız araçlar:
- x64dbg: Dinamik analiz için olmazsa olmaz debugger. (x64dbg)
- IDA Freeware: Statik analiz için kullanacağız. (IDA Free: Disassembler & Decompiler at No Cost)
- Ghidra: Alternatif statik analiz aracı, açık kaynak. (GitHub - NationalSecurityAgency/ghidra: Ghidra is a software reverse engineering (SRE) framework)
- PE-bear: PE dosya yapısını incelemek için. (GitHub - hasherezade/pe-bear: Portable Executable reversing tool with a friendly GUI)
- CFF Explorer: Benzer amaçlı. (Explorer Suite – NTCore)
Ben IDA Free ve x64dbg kullanacağım. Dilerseniz Ghidra ile de aynı işlemleri yapabilirsiniz.
Hedef Crackme
İnternetten basit bir Windows crackme indirelim veya kendimiz yazalım. Örnek olarak "crackme.exe" isimli bir program düşünelim. Program çalıştırıldığında bir şifre soruyor, yanlış girilince "Hatalı şifre!" yazıp kapanıyor. Doğru şifreyi bulacağız.
crackme.exe'yi x64dbg ile açalım. Program başladığında giriş noktasında (Entry Point) duracak. Öncelikle programın import ettiği fonksiyonlara bakalım. "Symbols" sekmesinde modülümüzü (crackme.exe) seçip, import tablosunu inceleyelim. Hangi Windows API'lerini kullandığını görmek bize fikir verir. Örneğin GetDlgItemTextA, MessageBoxA, strcmp gibi fonksiyonlar varsa, şifre kontrolü buralarda yapılıyor olabilir.
Şimdi, programa bir şifre girip mesaj kutusu çıktığında yakalamak için MessageBoxA fonksiyonuna breakpoint koyalım. Bunun için "Breakpoints" sekmesinden "Symbol" ekleyip MessageBoxA yazabiliriz veya direkt kodda MessageBoxA çağrısını bulup F2 basarız. Programı çalıştıralım (F9). Karşımıza şifre giriş ekranı gelecek, rastgele bir şey girip "OK" diyelim.
Eğer breakpoint'imiz MessageBoxA'da patlarsa, stack trace ile hangi fonksiyonun bu mesajı gösterdiğini buluruz. Geriye doğru adımlayarak (F8) veya call stack'e bakarak şifre kontrolünün yapıldığı yere ulaşabiliriz.
Şifre Karşılaştırmasını Bulmak
Program genelde şifreyi ya sabit bir stringle karşılaştırır ya da bir dönüşümden geçirip öyle karşılaştırır. x64dbg'de, şifre girişini alan fonksiyonun hemen ardından bir cmp veya call (strcmp gibi) ararız. Örneğin, GetDlgItemTextA ile alınan girdi, bir tampona kopyalanır. Ardından bu tamponun adresi, strcmp veya benzeri bir fonksiyona verilir.
strcmp gibi fonksiyonlara breakpoint koyarak, karşılaştırılan iki stringi görebiliriz. strcmp iki parametre alır: str1 ve str2. x64dbg'de fonksiyon çağrısı sırasında parametreler stack üzerinde veya registerlarda olur (x86'da stack, x64'te rcx, rdx). Hemen breakpoint anında bellekte bu adreslere bakarak doğru şifreyi okuyabiliriz.
Eğer şifre dönüşüme uğruyorsa (örneğin XOR, ekleme gibi), döngüleri takip etmek gerekir. Döngü içinde genelde bir sayaç (ecx) ve bir dizi işlemi olur. x64dbg'nin "Dump" penceresinde belleği izleyerek şifrenin nasıl değiştiğini görebiliriz.
strcmp gibi fonksiyonlara breakpoint koyarak, karşılaştırılan iki stringi görebiliriz. strcmp iki parametre alır: str1 ve str2. x64dbg'de fonksiyon çağrısı sırasında parametreler stack üzerinde veya registerlarda olur (x86'da stack, x64'te rcx, rdx). Hemen breakpoint anında bellekte bu adreslere bakarak doğru şifreyi okuyabiliriz.
Eğer şifre dönüşüme uğruyorsa (örneğin XOR, ekleme gibi), döngüleri takip etmek gerekir. Döngü içinde genelde bir sayaç (ecx) ve bir dizi işlemi olur. x64dbg'nin "Dump" penceresinde belleği izleyerek şifrenin nasıl değiştiğini görebiliriz.
Şifreyi Bulma veya Patch'leme
Doğru şifreyi bulduktan sonra programı kapatabiliriz. Alternatif olarak, şartlı dallanmayı değiştirerek (patch) her zaman başarılı olmasını sağlayabiliriz. Örneğin, jnz (eğer eşit değilse zıpla) talimatını jmp (her zaman zıpla) ile değiştiririz. Bunun için ilgili adreste sağ tıklayıp "Assemble" seçeneğiyle yeni talimatı yazarız. Daha sonra değişiklikleri "Patch file" ile kaydedebiliriz.
(ai tarafından yapılan temsili görsel)
(ai tarafından yapılan temsili görsel)
Sonuç
Bu yazıda sadece x64dbg kullanarak basit bir Windows crackme'sini nasıl çözeceğimizi gösterdim. Statik analiz için ekstra araçlara ihtiyaç duymadan, debugger üzerinden hem kod akışını izleyebilir hem de belleği inceleyerek şifreyi bulabiliriz. Unutmayın, reverse engineering sabır ve pratik gerektirir. Kendi crackme'lerinizi çözerek veya çevrimiçi platformlardaki zorluklarla (crackmes.one gibi) yeteneklerinizi geliştirebilirsiniz.
Sorularınız olursa konu altında tartışabiliriz. Bir sonraki yazıda daha karmaşık bir koruma (anti-debug, obfuscation) ile nasıl başa çıkacağımızı anlatma gibi bir isteğim var. Görüşmek üzere
NOT:BU MESAJDAKİ YAZIM YANLIŞLARI VB: YAPAY ZEKA TARAFINDAN DÜZENLENMİŞTİR....
İyi Forumlar/exploitbey
Sorularınız olursa konu altında tartışabiliriz. Bir sonraki yazıda daha karmaşık bir koruma (anti-debug, obfuscation) ile nasıl başa çıkacağımızı anlatma gibi bir isteğim var. Görüşmek üzere
NOT:BU MESAJDAKİ YAZIM YANLIŞLARI VB: YAPAY ZEKA TARAFINDAN DÜZENLENMİŞTİR....
İyi Forumlar/exploitbey

