Seçkin Üye
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" )
NASM: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.
Şimdilik sadece x86 mimarisi için ekledim ilerliyen zamanlarda bunu 64 bit için olanınıda eklicem , Şimdilik hoşçakalın
Alıntı değildir, İnternette tek başka yerde kaynak yok