PROGRAMLAMA OllyDBG Kullanımı / Tersine Mühendislik

PROGRAMLAMA OllyDBG Kullanımı / Tersine Mühendislik
4
1K
Forum sitemizde mesaj sayısı kasmak için oto mesaj yanıtlayıcı programlar kullanmak kesinlikle yasaktır.
Lütfen yorum yaparken ( ty,tyty, +++++, up up, asasdasf ) vb. anlamsız ifadeler kullanmayalım. Bu şekilde yorum yapan üyelerin üyelikleri durdurulacaktır.
Spam mesajlar atan kişileri RAPOR butonu ile bize bildiriniz!

Mia

28 Nis 2020
930
187
314

OllyDbg debugger programıdır. Bir programın nasıl çalıştığını, nerede hangi dosyayı kullandığını, oluşturduğunu, sildiğini anlamanıza yardımcı olur. Bir programın keygenini yazmanıza veya bir crack.me'yi çözmenize yardımcı olur.​

Öncelikle OllyDBG'nin komutlarını ve bilgilerini öğrenelim.
JMP - Jump, yani zıplama anlamına gelmektedir. Bir yerden başka bir yere zıplamaya(gitmeye) yarar.
XOR - İki değeri OR işlemine tabi tutar. C ve O bayraklarını temizleyebilir ve Z bayrağını hazırlayabilir. Bir değerin kendisiyle XOR işlemine tabi tutulması o değeri sıfırlar.
TEST - Komut Z bayrağını hazır eder, sonunda değerler kaydedilmez.
AND - İki değeri VE işlemine tabi tutar. C ve O bayraklarını temizler ve Z bayrağını hazırlar.
CALL - Kendinden sonra gelen komudun RVA(Relative Virtual Adress) yığına(stack) yazar ve daha sonra çalıştırılacak prosedürü çağırır.
JE - Jump Equal, yani bir değere eşitse zıplamaya(gitmeye) yarar.
MOV - Move, yani taşı demektir. Bir değeri taşımaya yarar.
JNZ - Koşullu zıplama.
INC - Değeri birer birer attırır.
NOP - Hiç bir şey yapma.
CMP - Compare anlamına gelir. Hedef ile kaynağı karşılaştırarak flagları(bayrakları) değiştirir. (C,Z,O)
PUSH - POP komudunun tersidir. Bu komut bir değeri yığına(stack) depolar ve değerin büyüklüğü kadar yığını(stack) azaltır.
Virtual Adresses(VA) - Windows, programı her başlattığımızda değerleri farklı VA'lara yükler.
Opcodes - Bilgisayarın programın kodlarını okuyum anladığı kodlardır.
Mnemonics - Assembler kodları. OllyDBG Opcodes'ları(opkodları) bizim anlayabileceğimiz dile çevirir.
1 Opkod(opcodes) 1 byte etmektedir.
Dump - 2 basamak 1 byte, 1 byte 8 bit etmektedir. 2 byte 1 word(kelime) etmektedir. 4 byte 1 dword etmektedir. Aynı zamanda 2 kelime(word) de 1 dword etmektedir. Ayrıca burada Opkodları(opcodes) yatay ve dikey olarak görebiliriz.
Registers - Yer tutucular(kaydediciler). Genellikle boyutları 4 byte'tır. 0 ile ffffffff arasındaki verileri tutarlar.
Stack - Yığın anlamına gelir. Veri depolayabilirsiniz. İlk giren veri en son çıkan veridir.
F8(Step Over) - Komudu çalıştırıp sonrakine geçer.
F9(Step in) - Call komudunun çağırdığı prosedüre girebilmemizi sağlar.
Breakpoint - Kırılma noktası.

## Kaydediciler:
EAX: Genişletilmiş Akumulator Kaydedicisi
ECX: Genişletilmiş Sayaç Kaydedicisi
EBX: Genişletilmiş Taban Kaydedicisi
EDX: Genişletilmiş Veri Kaydedicisi
EBP: Genişletilmiş Taban İşaretçisi
ESP: Genişletilmiş Yığın İşaretçisi
EIP: Genişletilmiş Komut İşaretçisi
EDI: Genişletilmiş Hedef İndeksi
ESI: Genişletilmiş Kaynak İndeksi

32 Bit Kaydedici: 16 Bit Kaydedici: 8 Bit Kaydedici:
EAX AX AH/AL
EBX BX BH/BL
ECX CX CH/CL
EDX DX DH/DL
ESI SI *
EDI DI *
EBP BP *
ESP SP *
EIP IP *

# Örnek:
EDX = 02608100
DX = 8100
DH = 81
DL = 00


#
Bir JMP alınmıyorsa, ne yapabiliriz ?

$$ Flagını değiştirebiliriz. Böylece o JMP'yi aldırabilir, veya aldırmayabiliriz.



# Basit bir ReverseMe'yi patch ile çözmek.



$$ Yazılı anlatım $$
- Programı OllyDBG'de başlatarak F8 ile ilerlemeye başlıyoruz.
- CreateFile kullanılarak programın bulunduğu dizinde "Keyfile.dat" isimli bir dosya oluşturduğunu görüyoruz. Biz de aynı dosyayı oluşturuyoruz.
- F8 ile ilerlemeye devam ediyoruz. İlk hata mesajımızı geçiyoruz oluşturduğumuz dosya sayesinde.
- 004010F7'ye yani bir sonraki hata mesajına giden JMP'lerin flaglarını 0'a çeviriyoruz. F8'e devam.
- Ve sonunda tebrik mesajımıza ulaştık. Bu patchimizi kaydetmek istersek sağ tıklayıp Copy To Executable > All Modifications kullanarak kaydedin

# Basit bir ReverseMe'yi patch olmadan çözmek.
- F8 ile ilerliyoruz ve buraya kadar geliyoruz.



- Dosyanın bulunduğu dizinde "Keyfile.dat" isimli bir dosya oluşturuyoruz.



- Böylece ilk hatamızı geçmiş oluyoruz.



- F8 ile ilerliyoruz ve ReadFile'ye kadar geliyoruz. Burada ReadFile 46h(=70D) verisini okuyacak ve 40211A'daki buffere yerleştirecek. Dosyamız boş olduğu için 0 olarak okunacak.



Okumamız başarılı oldu



- F8 ile ilerliyoruz ve JE'ye kadar geliyoruz. Burada 16D ile 402173 adresindeki dword boyutundaki veri ile karşılaştırılıyor.



- F8 ile devam ediyoruz. Geldiğimiz JL eğer ReadFile'nin okuduğu değer 16D'den küçük ise hata mesajına yolluyor. Yani Readfile Keyfile.dat dosyasında en az 16D(10h) okumalı.



- Sağ taraftan(Registers(Kaydediciler)) sekmesinden S flagını 0 ile değiştiriyoruz. Böylece hata mesajına gönderilmeyeceğiz. F8 ile ilerliyoruz.
- MOV'dan INC EBX'e kadar olan bir döngüye gireceğiz.



- Kısaca, ReadFile'nin okuduğu ilk byte Keyfile.dat dosyasına(AL'ye) atılacak. Daha sonra AL 0 ile karşılaştırılacak, 0 ise zıplayacak. Sonra ESI 8 ile karşılaştırılacak. Eğer ESI 8'den küçük ise hata mesajını görüntüleyecek. Bu döngüye girmek istemediğimizden sağ taraftan Z flagını 0 yapıyoruz.
- Daha sonra ilerliyoruz, CMP'ye geliyoruz. Burada AL ile 47h değeri karşılaştırılacak. 47h değeri ASCII'de "G" karşılığına gelmekte. Buna göre, okunan ilk byte'in "G" olup olmadığı kontrol ediliyor. İlk byte "G" değil ise, INC ESI komutuna zıplıyor.
- Yine geri dönerek sıradaki byte'i doğrulayacak. İlk byte'i "G" yapmalı ve ESI'yi 8'e kadar yükseltmeliyiz. Ayrıca okunan son byte "0" ise ESI'nin en az 8'e eşit olduğunu onaylıyor. Kısaca 8 defa G Harfine bakıyor.
- Buna göre dosyamız, 8 adet "G" harfiyle başlamalı ve 16D'lik byte olmalı. Bu da şöyle bir şey demek oluyor;



- Ve bunu yazıp dosyamızı kaydediyoruz. Daha sonra programı başlatıyoruz ve gördüğünüz gibi;

 
Son düzenleme:

AUJaQQQ

Üye
23 Kas 2020
17
1
13
Altın niteliğinde bir paylaşım ama çoğu kişi bunun ne olduğunu bilmiyor :D
 
  • Like
Tepkiler: Mia
Forum sitemizde mesaj sayısı kasmak için oto mesaj yanıtlayıcı programlar kullanmak kesinlikle yasaktır.
Lütfen yorum yaparken ( ty,tyty, +++++, up up, asasdasf ) vb. anlamsız ifadeler kullanmayalım. Bu şekilde yorum yapan üyelerin üyelikleri durdurulacaktır.
Spam mesajlar atan kişileri RAPOR butonu ile bize bildiriniz!