codecave "saçma" bir yöntem değil, lütfen cahil cahil konuşma... bir yerden kopyala yapıştır yapacağına biraz öğrenmeye çalışsan yararı yine kendine olacak...
ben tekniği gösteriyorum clientini kendin düzenlersin... dll kullanıyorsan ve kaynak kodu varsa yapman çok daha kolay olur ama olly ile manuel şekilde gösteriyorum...
şimdi "Form Party" e bastığın zaman pencere açıldığında yazacak max. kısmı olly'de burada: 0x0073FACC
6E yani 110, default sro_client'te burası böyle.
cap değiştirmek için yapman gereken burayı editlemek, 6E yi istediğin cap yaparsın olur biter.
Ama burası kodda signed byte olarak yazılmış yani burayı max 127 yapabilirsin. 127'den sonra yazdığın değerler negatife döner. çünkü signed byte -128'ten 127'ye kadar olabilir.
O yüzden codecave yapmamız gerekiyor. Kısaca kodun çalıştırılması buraya geldiğinde başka bir yere zıplayacağız, istediğimiz cap'i integer olarak yazacağız. Tabi bu işlemden sonra kodun çalışma işleyişini bozmamamız için ilk baştaki yere geri dönmemiz lazım. Codecave kısaca buna deniyor.
Bir diğer problem de codecave'i başlatabilmemiz için (başka bir yere zıplayabilmemiz için) en az 5 byte yere ihtiyacımız var, çünkü jmp opcode'u 1 byte (0xE9), yanına yazacağımız adres de 4 byte. O yüzden 5 byte yere ihtiyacımız var.
Bizim codecave yapmak istediğimiz yer ise sadece 2 byte.
PUSH 6E, byte karşılığı 6A 6E.
O sebeple alttaki push komutunu da alacağız ve gittiğimiz yerde yapacağız onu da.
Şimdi sro_clientta boş bir yer bul, oyuna girip attach yaptıktan sonra bulursan daha iyi olur. Boş yerden kastım şu:
ben bu örnekte codecave'imi 0x00D7F260'a yaptım.
Şimdi gittiğin yerde sağ tık, assemble yap, keep size'ı kaldır. Ve öncelikle istediğimiz cap'i yazacağız.
Yani 140 cap diyelim, PUSH 8C. Yazdık, olly bize şöyle bir satır yaptı:
ardından 5 byte zorunluluğu yüzünden yalan ettiğimiz satırı alıp burada yapıyoruz. yani PUSH OFFSET 00E18B1C.
parti max level için yapılması gerekenler tamam, şimdi kodun işleyişine geri dönelim.
codecave'e girmek için PUSH 6E satırını seçmiştik. ve alttakini de almıştık. şimdi ondan sonraki ilk komuta geri dönmemiz gerekiyor, yani bu durumda 0x0073FAD3 adresindeki CALL 00653950.
codecaveimize geri dönüp, bir jmp komutu ekliyoruz buraya geri dönmek için. Yani codecave son olarak böyle gözüküyor:
codecavein içi ve çıkışıyla işimiz bitti. Tek kalan codecave'e girişimiz.
orjinal kodun işlendiği yere gidiyoruz. Codecave'e girmek için 0073FACC'teki PUSH 6E yi seçmiştik. Şimdi buraya bir jmp yapacağız ve codecaveimize yönlendireceğiz.
benim codecave 0x00D7F260'ta başlıyordu, oraya zıplayacağız.
Codecave'e girebilmek için 5byte zorunluluğumuz vardı. Biz bu yüzden push komutunun altındaki push offseti de aldık. PUSH 6E, 2 byte idi, yani bize 3extra byte lazımdı. Ama alttaki komut 5byte idi. Yani 2 fazladan aldık, ama bu durum normal, yani 2 tane NOPumuz olacak. Şimdi codecave e gireceğimiz yerdeki 2 satırı seçiyoruz:
sağ tık > assemble dedikten sonra (keep size işaretli olacak ki işleyişi noplar kendi gelsin, işleyiş bozulmasın) codecaveimiz için jump ekliyoruz: JMP 00D7F260.
sonuç bu oldu:
kodun işleyişi bu noktaya geldiğinde, bizim yazdığımız koda zıplayacak, capi ve diğer offseti yazacak, ve geri dönecek, bu kadar basit.
Sonuç:
tabi bu sadece açtığında yazan değer. eğer manuel değiştirmek istersen elle yine 140 yazamazsın, onun offseti az üstte, 0x0073FAAF.
Party matching için başka offsetler de var hangisi tam neye denk geliyor bilmiyorum, bazıları auto match, bazıları anasayfadaki arama kısmı için vs... hepsi için yapılması gerekiyor tek tek.
Kolay gele...