Reverse Engineering - Patching
-
Merhaba arkadaşlar forumda patching’i merak edenler arkadaşlar vardı.Bu sefer patching hakkında bahsetmek istedim.
Gerekenler
Ollydbg
Winhex
Masm32 9 (Patch programını assemble etmek için gerekli)
Patch programının kaynak kodları+Deneme amaçlı program+Assemble edilmiş patch programı
http://rapidshare.com/files/24015191/patching.rar.html
Patching dosyadaki bazı byteları değiştirerek programı kırmamız oluyor.Örneğin bir program kırdık ve exe dosyası 10 mb düzeyinde.Bunu dağıtması,indirmesi sorun.Fakat kendi yazdığımız program ile(assembly ile yazılmışsa 2-3 kb’a kadar düşüyor) belirli adreslerdeki byteları değiştirerek programı cracklenmiş haline sokuyoruz.Mesela sonuca göre hareket eden bir zıplama noktası var.Atlarsa hata mesajına gidiyor.Devam ederse program register oluyor.Programın packlenmemiş olması şart.Çünkü dosyanın bir kısmı şifreleniyor.Bütün packerlar şifreledikleri verileri memorye decrypt edip açmak zorundalar.Eğer memory’e açılan değerleri şifrelenmiş dosyaya yazarsak programı bozarız.Yada packerın mantığı çözülmeli mesela “a”yı şifreleyip “b” yapıyorsa dosyadaki kayıtlı değer b.Program çalışırken unpack edilme sürecinden sonra ise “a” olarak geçer memoryde.Bizde packer “a”yı nasıl “b” haline sokuyor bilirsek.Yazacağımız veriyide o şekilde şifreleyip dosyaya kaydederiz ve yine başarılı oluruz.Fakat bunlara gerek kalmadan loader olarak isimlendirilen programlarla memoryde geçici değişiklikler yapabiliyoruz.Nasıl olsa packer programı unpack etmek zorunda bu yüzdende belirli adresi sürekli tarayarak istediğimiz değişiklik yapıldımı diye bakarız.O değeri gördüğümz anda programın kırılmasına yol açan veriyi oraya yapıştırırız.Oyunların trainer mantığıda bu şekildedir zaten.Hafızaya yüklenen program üstünde değişiklik yapar.Harddiskteki dosyaya dokunmaz.Patching ise harddiskteki dosyanın orjinalinde değişiklikler yapılmasıdır.Neyse patch olayını anlatmaya devam edelim.
Opcode’u 75 0C olarak gözüküyor.Fakat biz bunu nop(Yani hiçbirşey yapmadan geç) yapmak istiyoruz.Nop’un opcode’u 90 Zıplama noktası 2 byte olduğu için ve nop 1 byte olduğu için 90 90 olarak değişiklik yapıyoruz ve program orayı geçiyor ve register oluyor.
Ollydbg’da nopla değiştirmek istediğimiz zıplama noktasına sağ tıklayarak “Follow in dump->selection” diyoruz.Altta opcod’u göreceksiniz.Sonra o satırı seçerek kopyalıyoruz(Resimde gözüküyor)
Daha sonra winhex programını açıyoruz(Gerçek adresini almak için kolaylık açısından VA ‘yi bulmak için matematiksel işlemler gerekiyor.Olly RVA olarak gösteriyor) Kopyaladığımız değerleri Winhex’de menüdeki “search->find hex values” kısmına yapıştırıyoruz.Hex değerlerinin arasındaki boşlukları silerek aratmayı unutmuyoruz!
Adrese konumlandığımızda offset değerini not alıyoruz ve başka bir yerde daha işimiz varsa işlemleri tekrarlıyoruz.
Ben kolaylık olsun diye assemblyde kısa bir patch programı yazdım ve kodlarınıda sizlerle paylaşmak istedim.Kaynak dosyada iki tane patchlenen yer göreceksiniz.İlki register olayı,ikinciside “abc” olan şifreyi “asd” olarak değiştiriyor.İkincisi gereksiz birşey.Fakat çoklu kullanım açısından size yardımcı olsun diye koymayı uygun gördüm.Ayrıca delphide yazdığım deneme amaçlı programı indirip deneyebilirsiniz.
Şimdi patch programımızın kaynak kodlarında adresi girdikten sonra yazacağımız verileri patchdata olarak tanımladığımız yerede yazacağımız verileri binary olarak koymayı unutmuyoruz.Örneğin nop’un opcode’u 90 ise buraya 90 değil binary karşılığını yazacağız.Gözükmeyen bir karakter.Mesela 90 90 değeriyle değiştirecektir.Winhexte 90 90 hex değerini aratıp sağ taraftan binary değerini kopyalayıp programın kaynak kodundaki patchdata bölümüne kopyalarsak sorunsuzca çevirmeye gerek kalmadan çalışacaktır.Programın kaynak kodunu biraz irdelerseniz anlayacağınızdan eminim.Bende açıklamalar yerleştirdim kaynak koda.Ayrıca hata yapma olasılığına karşı dosyanın yedeğinide alıyor.
Patching hakkında anlatacaklarım bu kadar.Bu yazı,patch programının kaynak kodları,deneme amaçlı yazılan program ve ekstra materyaller tamamen bana aittir.Copy paste yapanlar emeğe saygı duyarsa sevinirim.Saygılarımla..
-anonimleştirildi-
Not:Reverse engineering hakkında yazdığım tüm dökümanlar,materyaller tamamen bana aittir.Başka yerde bulamazsınız.Kaynak göster,nerden kopyaladın gibi yazılar görürsem küfür edilmiş gibi algılarım. -
evet bu konuyla baya uğraştın walla saolasın =) tabe ben bunlara karşı korunmak için ugrasıom bu arada aklıma gelmişken compü hocamı goren oldumu???:S
-
ben diyom bu kafayı bozmus a.q sıyırmısın sen olum yeter beynin patlıcak =)
hoja sagols -
firex acaip kafa ziktin sen buna (:
çok sıkı paylaşım . tahri dokümentasiooon a ver bunları millet oraya baksın heç olmassa
-
Binary dosyayı patchlemek için bu kadar ASM kasacağına gel open source ile tanış. Kodu indir, istediğin gibi düzenle, derle, kullan. Hatta patchlediğin kodu geliştiricisine gönder senin de adın geçsin, katkıda bulunmuş olun :P Tabi bu benim şahsi düşüncemdir, katılırsınız katılmazsınız o ayrı :)
-
Open-source konusuna pek sıcak bakmıyorum :) Fakat böyle küçük başkaları açısındanda eğitim amacıyla yararlı olacak programlarımın kaynak kodlarını dağıtıyorum.Assembly biraz uğraştırıyor.Fakat sonucu görünce programcının aldığı keyif apayrı.Patch programı sadece 2,5 kb yer kaplıyor,ayrıca çokta hızlı.Delphide,Visual C++'da yazsam kat kat üstünde yer kaplayacağından eminim.Fakat Assembly biraz fantezi işi kaçıyor tabi :P
-
abi bide şu şey war hex editorle değitşirme muhabbeti ama hexte sadece mesela şöle bi dosyawar hexle türkçeleştirme giib bişi yapılıyo bizim client deidğimiz bir oyunun örnek olarak şöle diyim:
Account Yazıyo
Password yazıyo
Bunları sadece bu kaç karakter ise o kadar olması gerekio bunuda aşmanın bir yolu varmıdır hex'ten başka eğer fazla yada eksik kaçarsak kendisi bişiler eklio sorun çıkarıyo :S
-
Onu aşmanın yolu var tabiki.Mesela 40343 adresinden itibaren account yazıyor diyelim.Fakat orda hiç boşluk yok.Daha az şey yazabilirsin.Fakat daha çok şey yazarsan diğer şeylerinde üstüne yazacağın için dosyaya zarar verebilirsin.Bunu aşmak için exe'nin içinde data ekleyebileceğimiz boşluklar aramak ve oraya istediğimiz uzunlukta ifadeyi yazmak "kullanıcı hesabı" mesela.Onu boş alana yazdıktan sonra artık nereye yazdıysan 74545 mesela diyelim onun adreside not alıyorsun.Stringin çağrıldığı yerde 40343 olarak yazacak onu 74545 olarak değiştirirsen artık ordan datayı okur ve sıkıntı ortadan kalkar.
-
hoca son zamanlarda hayvan gibi güzel dökümanlar yazıyosun güzel olmuşda asm koduna baktım yazılcak ilk veriye nie ascii şeklinde yazdın hoca (0x99)(0x99) şeklinde giriliodu o şekil yapsaymışın daha güzel olurmuş neyse tekrardan eline sağlık
daha bekliyoruz hoca dökümanlarını
-
Yarına döküman yapiim bunu...
-
ir2 bunu yazdı:
-----------------------------hoca son zamanlarda hayvan gibi güzel dökümanlar yazıyosun güzel olmuşda asm koduna baktım yazılcak ilk veriye nie ascii şeklinde yazdın hoca (0x99)(0x99) şeklinde giriliodu o şekil yapsaymışın daha güzel olurmuş neyse tekrardan eline sağlık
daha bekliyoruz hoca dökümanlarını
-----------------------------
Hoca orda byte patch yaptığımız için yani dosya binary halde.90'ın binary karşılığını kopyaladım.
