Natural

natural

Breaking News

Patch Çeşitleri

Bir dosyayı patch yapmak

Inceleme sonucunda tam ve kesin yeri/yerleri bulduğumuza inanıyorsak eğer mümkünse önce
debugger içinde değişikliği yapıp deneyin. Bu şekilde hem tam olduğuna hemde patch ettiğiniz kodu
doğru kod olduğuna kanaat getirebilirsiniz. Bundan sonra yapacağımız programda patch edeceğimiz
yerlerin adreslerini ve buradaki kodları bulmak ve buradaki orjinal kod dizinini almaktır.


00401008 B8 4E 61 BC 00 3D B1 7F .Na..=±.
00401008 39 05 *74 02*EB 10 50 68 9.t.ë.Ph
00401010 09 20 40 00 68 1D 20 40 . @.h. @
00401018 00 E8 20 00 00 00 6A 00 . è ...j.
00401020 68 00 20 40 00 68 1D 20 h.@.h.



Yıldız içene aldığım yer bizi ilgilendiren bölge, değişikliği burada yapacağız. Sayınca buranın
40100a adresine eşit geldiğini görüyoruz. Buradaki bulunan 74 sayısını EB olması gerekiyor.
Bunu dışarıdan kalıcı olarak yapmanın iki yolu var. Ilki hiew, hexedit gibi programlarla dosyanın
üzerine gidip buradaki 74 02 sayısını EB 02 olarak değiştirmek ve kaydetmek.

Not: +-128 byte sonraki atlamalarda EB değil E9 kullanılır. Bunu patch yaptığınız yerdeki dallanma
tek haneli ise eb birden fazla ise E9 kullanılır. Zaten debuggerde herşey görülür.


İkinci yol ise bunun için bir patch programı yazmak. Düşünüldüğünün aksine patch programı yazmak
çok kolaydır. Bir patch programı yazmak için elimizde patch yapacağımız yer yada yerlerin fiziksel
adresleri, patch yapılacak yerdeki orjinal kodlar, orjinal dosyanın uzunluğu gerekir.

Bir patch programı sırasıyla şu işlemleri yapar:

- Dosyanın isminin girilmesini, yada aynı dizinde olup - olmadığını kontrol eder.
- Orjinal dosyanın readonly yada o anda çalışır durumda olup olmadığın kontrol eder.
- Orjinal dosyanın patch edilmemiş bir yedeğini alır.
- Versiyon kontrolü için dosyanın boyunu kontrol eder. Eğer boy yanlış ise patchde yanlış olacağı
için kullanıcıyı uyarır yada çıkar.
- Dosyayını patch yapacağı adresden okuma yapar ve kodların aynı olup olmadığını kontrol eder. Eğer
aynı değilse patch işlemi program zarar vereceğinden uyarılır yada patch işleminden vazgeçilir.
- Eğer buraya kadarki tüm şartlar uyuyorsa o zaman dosyanın fiziksel patch adresine / adreslerine
konumlandırma yapılarak istenilen değişiklik yapılır.


Memory Patch

Bu patch çeşidi genelde EXE dosyası iyi korunmuş programlarda kullanılır. Bundaki amaç unpack
edilemeyen yada edildiğinde tam olarak düzelmeyen yada düzelmesi zor veya mümkün olmayan dosyalar
ile hem pack hemde encrypt kullanan dosyalar bu gruba girer. Böyle bir program üzerinde patch
yapmak ancak program sistemin hafızasına yüklenip çalışmak üzere açıldığında mümkün olur.
Reverse dilinde bu tip patch dosyalarına 'loader' olarak geçer. Korunmuş programı çalıştırmak
için programın kendisi değilde bu memory patch işlemlerini yapan program çalıştırılır. Bu sayede
limitler ve kapalı fonksiyonlar açılır.

Bu tür programlar üzerinde reverse yapabilmek biraz daha tecrübe ister. Genelde program çalışırken
Procdump yada Process Eng gibi bir programla imajı kopyalanıp bir dosya halinde kaydedilir. Fakat
bu programlar genelde çalışamaz bir haldedir. Patch yerlerini arama işlemi bir dedektif gibi
debug etmeden ve trace etmeden iz sürerek bulunması gerekir. Bununla ilgili en iyi yöntem disassembly
ederek incelemektir. Denemeler ise yine hafızada patch yaparak yapılır. Buna örnek olarak bu gibi korumaları
ile ünlü olmuş Elcomsoft firmasının programları verilebilir.

Memory patch için orjinal kod dizini, programın çalıştıktan sonraki hafıza adresi ve patch dizini
gerekiyor.

Bir memory patch dosyası şu işlemleri yapar:

- Dosyanın aynı dizinde olup olmadığını ve dosya isminin doğruluğun tesbit eder.
- Dosyayı yükler ve çalıştırır. Bu sayede program hafızada açılır ve çalışmaya başlar.
- API ler vasıtasıyla açılma safhası kontrol edilir ve tam çalışma başlıyacağı anda program askıya
alınarak durdurulur.
- Patch yapılacak adres/adresler orjinal kod dizinleri ile karşılaştırılarak kontrol edilir. Eğer
kodlar aynı değilse uyarılır ve patch işlemi yapılmaz.
- Herşey yolunda ise patch/patchler yapılır ve program beklemeden çıkarılıp çalıştırılır.


İkinci nesil loader 'lar sistemin debug registerlerini ve API' leri kullanılmakta. Yapılan
loader bir debugger gibi çalışarak istenilen adrese yada koda gelince durup patch yapmakta
ve tekrar kaldığı yerden programı devam ettirmektedir.

Generic Patch

Generic patch, eğer aynı programın değişik yada takip eden versiyonlarında aynı koruma mekanizması
kullanılıyorsa yapılabilir. Dolayısıyla bu patch birden fazla versiyonu kapsamaktadır. Bu işlem
paketli yada Encrypt dosyalara uygulanmaz. Ayrıca Checksum kontrolu yapan programlara uygulanması
reverse yapan kişinin checksum' ı tekrar hesaplayıp kontrol ettiği yeri güncellemesine bağlıdır.

Generic patch konusunda verebileceğim en iyi örnekler oyunlardır. genelde oyunlarda farklı yerlerde
aynı kod dizilimi oluşur. Çünkü oyunların her ne kadar matematik isteyen kısımları assembly ile
yapılıyor olsada büyük çoğunluğunun cd kontrol kısımlari C++, Delphi, VB gibi dillerle kombine
olarak yapılıyor. Örneğin Monolith firmasını yaptığı bütün oyunlarda EXE' nin değişik yerlerinde
aynı kod dizilimi ile kontroller sağlanmakta. Yine herkezin bildiği Halflife, Quake gibi
oyunlarda da bu gibi generic olabilecek durumlar mevcuttur.

Programlar içinde aynı mantık sözkonusudur. Programlar genelde anahtar oluşturdukları bölümleri
değiştirirler ancak büyük bir kısmı kontrol bölümünü aynen bırakır.


Generic patch 'in yukarıda anlattığım diğer patch den tek farkı istenilen kod dizilimini
tarayıp bulması ve buraya kendisini patch yapmasıdır. Yani adres belirmiyoruz. Bunun için
öncelikle elimizde generic patch yapacağımız programın/oyunun en az 2 versiyonu yada
yükseltmesi olması gerekiyor. versiyonlar arası patch yerlerinin değişmesi normaldir ama
genelde koruma sistemleri pek değişmez. Bunun için sadece bu işle ilgili olan kod
dizilimini bulmamız gerekiyor. Bu kod diziliminin iyi bir araştırma sonunda ortaya
çıkması gerekir çünkü yanlış bir yere patch yapma ihtimalide var.

Bir generic patch programının işlem sırası:

- Dosyanın isminin girilmesini, yada aynı dizinde olup - olmadığını kontrol eder.
- Orjinal dosyanın readonly yada o anda çalışır durumda olup olmadığın kontrol eder.
- Orjinal dosyanın patch edilmemiş bir yedeğini alır.

** buraya kadar patch ile aynı

- Dosyanın boyun öğrenir, hafızada bu dosyayı yüklecek kadar yer olup olmadını kontrol eder.
Burada istisnayi bir durum var. Program hafızaya yüklenemeyecek kadar büyükse parça parça
kontrol yapılır. Ancak korumalı modun verdiği güzel avantajlardan biriside 4GB kadar adresleme
vermesi ve fiziksel hafızanın bittiği yerde sanal hafızanın (disk) devreye girmesidir.Yani
bilgisayarın hafızasının çok küçük olması gerekirki böyle bir durum oluşsun.

- Dosyayı hafızaya yükler ve ilk iki byte' nın 'MZ' 4d5a olup olmadığını kontrol eder. Eğer değilse
bu dosya çalıştırılabilir bir dosya değildir. Ancak yine burada istisnayi bir durum sözkonusu,
koruma başka bir dosyanın kullanılması ile sağlanırsa ve burada bazı kod dizilimleri kullanılıyorsa
bu seçeneğin gözardı edilmemesi gerekir. Bunun reverse eden kişinin programında yer vermesi ve dikkat
etmesi gerekir.

- Eğer dosya bir EXE ise o zaman bunun doğru bir Windows programı olup olmadığını kontrol etmemiz
gerekir:

cmp dword ptr [dosyabaslangıc+100h],'PE'

Programın hafıya yüklediğimiz geçici adres + 100h sonrası 'PE' harflerini içeriyormu? Eğer
doğruysa üzerinde çalıştığımız dosya bir Windows PE dosyası.

Buradan sonra kod dizinini tarama kısmına geliyoruz. Bu işlem ikiye ayrılır:

RAW tarama yöntemi ve Kod tarama yöntemi olarak.

* Raw tarama yöntemi : Bu yöntemde hafızaya yüklenen dosya ilk byte'ten itibaren taranmaya başlanır
Bu yöntem tüm kod dizilimin bulunmasında en etkili yol olurken kod dışında resource yada import
tablosunda bir yeri patchleme ihtimalide en yüksek olan yöntem. bunun için programcı generic olarak
patch yapacağı dosyayı baştan sona inceleyip böyle bir duruma meydan vermemesi gerekir.

* Kod tarama yöntemi : Bu yöntem zaten hafızaya yüklenmiş dosyanın sadece kod kısmını tarama yapmak
için kullanılır. Bunun için section tablosudan RVA adresini alarak programın başlangıç adresine
yönlendirilmesi ile olur.

Her iki tarama yönteminde de 80x86 nın verdiği string arama komutları kullanılabilir.Tarama işlemi
hafızada olacağı için string ne kadar büyük olursa olsun en düşün CPU hızında bile olağanüstü bir
sonuç verir.

Tarama için esi ve edi registerler yardımıyla SCASB(1byte) , SCASW(2 byte) ve SCASD(4byte)
tarama yapılabileceği gibi MMX komut setindeki karşılaştırma komutları ile 8byte (64bit) taramada
yapılabilir. Direction Flag sayesinde (DF) ileriye veya geriye taramada (CLD, STD) yapılabilir.


lea edi, program_baslangic_adresi
srcret:
mov eax,string1
repz
scasd
cmp dword ptr [edi],string2
jnz srcret
mov dword ptr [edi],patch_string


Bunun dışında pek tercih edilmeyen Generic Memory Patch de var. Bu patch program çalışırken
memory patch yaparak kullanıcının girdiği bilgileri doğru göstermeyi dolayısı ile gerekli dosya
yada windows registerı işlemlerini gerçekleştirmeyi sağlar. Bu yöntem genelde Unlock isteyen
programlarda kullanılır. Çünkü modern programlar her çalışmada register sorgularını tekrar yapmakta.
Buna en iyi örnek yerli bir program olan goldsoft ajandanın 4.x versiyonudur.

Patch konusu bu kadar, başka bir konuyla görüşmek üzere,

İyi çalışmalar, mutlu ve güzel günler dileğiyle,

2 yorum: