x86 / x64 Assembly Memory Detect Protect

King Slayer

Where we are
Yönetici
Kurucu
Katılım
12 Haz 2020
Mesajlar
40
Beğeni puanı
20
Puanları
8
Assembly mimarisinde mnemonic yani işlemcinin belirli görevleri assembly diline convertleyip talimatlar vererek makine kodunu ((0-1)) değiştirerek istediğiniz herşeyi yapmanızı sağlıyan assembly kodlarıdır.

Peki bu mimarinin en büyük baş belası nedir ? Windows işletim sisteminin bazı "memory segment " yani hafıza bölümlerine erişimi engellemesi veya o bölümün hiç olmaması sonucunda eğer sizin yazdığınız kodlama bu erişimi olmuyan bölümlere erişirse cevap (( CRASH )) uygulamanın çökmesi olacaktır.

Windows işletim sisteminde bazı oyunların aniden crash atması veya kullandığınız uygulamanın aniden çökmesinin en büyük sebebi erişimi olmuyan bi bölüme erişmesinden kaynaklanıyor.

Assembly mimarisinde kesin olan bişey vardır, Yazma izni olmuyan bi bölüme yazamaz, Okuma izni olmuyan bölümü okuyamaz , Yanlış anlamayın adress leri değil , adressleri her türlü okur ama bu adressin verdiği değeri okuyamaz, Bunun için windows işletim sisteminin o bölüme erişim iznini vermesi gerekiyor veya erişmeye çalıştığınız memory bölümünün var olması gerekiyor.

Peki ben şimdi size ne gösterecem ? Bu memory protectleri okumanı sağlıyan tamamen Assembly kodlaması atacam bu benim gibi bu mimariyle uğrasanlar için altın değerinde bi kodlamadır.


Bunu nasıl yapacaz ? Çok güzel soru demi şimdi erişimi olmuyan bi yere erişmeden o yerin erişimi olup olmadığını kontrol etmek imkansızdır, eee peki erişmeden nasıl alacaz cevabı ?

Windows işletim sisteminin apisini kullanarak ( "NtQueryVirtualMemory" )


Kod:
fk:
push eax // Bu registeri kaydetmek için
push ebx // Bu registeri kaydetmek için
push ecx // Bu registeri kaydetmek için
push edx // Bu registeri kaydetmek için
push esi // Bu registeri kaydetmek için
push edi // Bu registeri kaydetmek için
push ebp // Bu registeri kaydetmek için
push esp // Bu registeri kaydetmek için
lea eax,[eax-84]  // eax registerindeki adresi control etmek için windows apisine gönderiyorum burası kontrol etmek istediğim adrestir.
call cntr
cmp esi,0 // 0 Değeri böyle memory bile yok demek
je yapma
cmp esi,1 // 1 Değeri böyle memory var ama no acces erişim yok demek
je yapma
pop esp // Bu kaydettiğimiz registeri geri getirmek için
pop ebp // Bu kaydettiğimiz registeri geri getirmek için
pop edi // Bu kaydettiğimiz registeri geri getirmek için
pop esi // Bu kaydettiğimiz registeri geri getirmek için
pop edx // Bu kaydettiğimiz registeri geri getirmek için
pop ecx // Bu kaydettiğimiz registeri geri getirmek için
pop ebx // Bu kaydettiğimiz registeri geri getirmek için
pop eax // Bu kaydettiğimiz registeri geri getirmek için
cmp [eax-84],(int)176293393 // Ben classda  control yapıyorum, buradan bazen erişimi olmuyan bi yere eriştiğim için crash yiyorum bunu engelledim işte
je rcle
jmp hk
yapma:
pop esp // Bu kaydettiğimiz registeri geri getirmek için
pop ebp // Bu kaydettiğimiz registeri geri getirmek için
pop edi // Bu kaydettiğimiz registeri geri getirmek için
pop esi // Bu kaydettiğimiz registeri geri getirmek için
pop edx // Bu kaydettiğimiz registeri geri getirmek için
pop ecx // Bu kaydettiğimiz registeri geri getirmek için
pop ebx // Bu kaydettiğimiz registeri geri getirmek için
pop eax // Bu kaydettiğimiz registeri geri getirmek için
hk:
mov edx,[eax]
mov [ebp-2C],edx
jmp returnhere

pop esp // Bu kaydettiğimiz registeri geri getirmek için
pop ebp // Bu kaydettiğimiz registeri geri getirmek için
pop edi // Bu kaydettiğimiz registeri geri getirmek için
pop esi // Bu kaydettiğimiz registeri geri getirmek için
pop edx // Bu kaydettiğimiz registeri geri getirmek için
pop ecx // Bu kaydettiğimiz registeri geri getirmek için
pop ebx // Bu kaydettiğimiz registeri geri getirmek için
pop eax // Bu kaydettiğimiz registeri geri getirmek için
rcle:
mov [eax],0 // Hile için 0 değerini eax registerindeki adresin değerine yaz.
mov edx,[eax]
mov [ebp-2C],edx
jmp returnhere


cllcode:
push ebp
mov ebp,esp
sub esp,7C
lea eax,[ebp-08]
push eax
push 1C
lea ecx,[ebp-7C]
push ecx
push 00
mov edx,[ebp+08]
push edx
push -01 // Handlesi -01 gösteriyoruz böylece api bizim uygulamamızı tarıyor
call NtQueryVirtualMemory // Windows apisi
mov [ebp-0C],eax
mov eax,[ebp-68]
mov [ebp-04],eax
mov esi,eax// Erişim olup olmadığının değeri
mov esp,ebp
pop ebp
ret

cntr:
push ebp
mov ebp,esp
mov [ebp-04],eax
mov eax,[ebp-04]
push eax
call cllcode
pop eax
pop ebp
ret

mx1:
jmp newmem
returnhere:


Protect olmuyan = hex (00)
No acces olan = hex (01)
Read Only = hex (02)
Read wrıte = hex(04)
wrıte copy = hex (08)
execute = hex (10)
execute_read = hex (20)
execute_readwrıte = hex (40)
execute_writecopy = hex (80)


Dikkat etmeniz gereken benim eklediğim registeri kaydetmek için kullandığım pushlar bunlar olmazsa windows apisi kullandıktan sonra geri bizim fonksiyona döndüğünde registerlerin büyük olasılıkla bozulması bu uygulamanın crash yemesine neden olur.
 
Üst