2. This Tutorial About
SDÜ-CYBERLAB Assembly
Workshop Amacı:
Amacımız windows işletim sistemi üzerinde tersine mühendislik yapmak isteyen
arkadaşlara kod analiz edilirken işlemlerin sırası, api yapısı ve kullanımı, shellcode
yazımı konusunda giriş seviyesinde bir eğitim verektir.
Kullanılan Toollar:
• WinDBG
• HexWorkshop
• Immunity Debugger
• GVIM
• Notepad++
Kullanılan İşletim Sistemi
• Windows XP 32 bit sp3
3. Digits System
SDÜ-CYBERLAB Assembly
Binary Sayı Sistemi
• Bilgisayar sistemleri binary sayi sistemi üzerine kurulmuştur.
• 0 -> Voltaj 0 Volt, 1 -> Voltaj 5 Volt.
• Binary sayi sistemini iyi anlamak, bu eğitimde öğreneceğimiz assembly dili için çok önemli !
• Sayinin binary formatta olduğunu belirtmek için <0b> tagını sayinin başına ekleriz.
• 23’ten büyük 2’nin katı olan en yakın sayı seçilir. Bu örnekte
25
𝑠𝑒ç𝑖𝑦𝑜𝑟𝑢𝑧. 𝑌𝑎𝑛𝑖 𝑏𝑖𝑛𝑎𝑟𝑦 𝑠𝑎𝑦𝚤𝑚𝚤𝑧𝑑𝑎 [][][][][] slotumuz olur.
• [ ] [ ] [ ] [ ] [ ]
• 24
23
22
21
20
• 23 sayısının binary karsılığı hesaplarken 23’e en yakın 2 nin katı secilir ve sayi 1 yada 0 olana dek aynı
işlem tekrarlanır.
• Çıkartılan 2’nin katlarını boş slotlarımızda 1 degerini veririz.
• 24
= 16, 23
= 8, 22
= 4, 21
= 2, 20
= 1
• 1. Adim : 23 – 16[24
] = 7
• 7 – 4[22
] = 3
• 3 – 2[21
] = 1[20
]
• 0b[1][0][1][1][1] = 23.
4. Digits System
SDÜ-CYBERLAB Assembly
Hexedecimal Sayı Sistemi
• Hexedecimal sayi sistemi bellek adreslerini ifade ederken kullanırız.
• 0x00406010 şeklinde bellekte adresleri görürüz.
• Hexedecimal sayi sistemini iyi anlamak, bu eğitimde öğreneceğimiz assembly dili için çok önemli !
• Hexedecimal sayi sistemindeki sayilar: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A[10], B[11], C[12], D[13], E[14], F[15]
• Sayinin hexedecimal olduğunu belirtmek için sayinin başına <0x> tagını ekleriz.
• 0x10111 sayisinin hexedecimal karşığını hesaplarken binary sayinin sağından başlayarak 4’erli gruplar
halinde ayırırız.
• 0b0001 ve 0b0111 olur.
• 0b0001 = 1 ve 0b0111 = 7 olur.
• 23 sayısının Hexedecimal karşılığı: 0x17 olur.
11. x86 Memory Segments
• Stack : Bellek üzerinde bir veriyi tekrar tekrar kullanmak istediğimizde veya
bir fonksiyona girdiğimizde fonksiyonların argumanlarını tutmak amacıyla
sakladığımız hafıza alanıdır. Register’lardan sonra belleğin en hızlı alanıdır.
Stack LIFO(Last In First Out) mantığıyla çalışır. Yani stack’e attığımız son
eleman stack’ten ilk alınmaktadır.
SDÜ-CYBERLAB Assembly
Hafızadaki hangi alan ne için kullanılır ?
12. x86 Memory Segments
SDÜ-CYBERLAB Assembly
• İnitialized ???
• Örnek üzerinden anlatmak gerekirse:
#include <stdio.h>
int main(){
int a; uninitialized
int b=5; initialized
}
• Heap : Dinamik bellek alanımızdır. Malloc(), alloc(), free() gibi fonksiyonlar
ile bu alandan yer isteyip kullanabilir ve alınan alanı geri verebiliriz.
Stack’ten farklı olarak bu alanımız FIFO(First In First Out) mantığıyla calisir.
• .Text : Assembly kodlarımızı yazdığımız, programcının kodlarının
çalıştırıldıgı alandır.
• .bss : data segmentimizdeki uninitialized data’ların tutulduğu hafıza
alanıdır.
• .data : data segmentimizdeki initialized data’ların tutulduğu hafıza alanıdır.
13. Binary Add and Sub Operations
SDÜ-CYBERLAB Assembly
22 – 7 = 15 Bu işlemi bilgisayarlarımız nasıl yapıyor ?
22 = 0b10110
7 = 0b00111
• 0b00111 sayisinin her bir bitini NOT işlemine tabi tutuyoruz. 0b11000
• Ardından en değersiz bit’ine 1 ekliyoruz. 0b11001
• Şimdi 22 sayisiyla birlikte topluyoruz.
10110
11001
+ --------
1[01111] En baştaki bir değerimiz sayımızın negatif olduğunu belirtir.
0b1111 sayisinin decimal karşığı : 15
14. Signed Numbers Operations
SDÜ-CYBERLAB Assembly
• Bellekte negatif sayilari ifade ederken binary sayının ilk biti ‘1’ ile başlamaktadır.
8 bitlik alanda inceleyelim.
Örneğin: 79 sayisi
79: 0100 1111
Her bir biti NOT işlemine sokarız.
1011 0000 + 20
= 1011 0001 -79 olur.
15. Registers
SDÜ-CYBERLAB Assembly
• EAX : Acumulator Register.
• EBX : Base Register.
• ECX : Counter Register
• EDX : Data Register
• ESI : String işlemlerinde string’in indexlerine ulaşmakta kullanılır.
• EDI : String işlemlerinde string’in kopyalanmak istenilen adresin indexleri tutar.
• ESP : Stack Pointer. Stack’in en üstündeki verinin adresini işaret eder.
• EBP : Base Pointer. Fonksiyon arguman ve local degiskenlere ulaşmada kullanılır.
• EIP : Instructor Pointer. Bir sonraki calistirilacak komutun adresini işaret eder.
EAX,EBX,ECX,EDX temelde birbirlerinden hiç bir farkı yoktur.
18. Flag Registers
SDÜ-CYBERLAB Assembly
16 bitlik özel register’lardır.
• CF(Carry Flag) Toplama,çıkarma gibi işlemlerde taşan bit bu flage set edilir.
• PF(Parity Flag) Binary sayının bitlerindeki 1 sayılarının toplamı çift ise set edilir.
• ZF(Zero Flag) İşlemin sonucu 0 ise bu flag set edilir.Şartlı dallanmalarda kullanılır.
• SF(Sign Flag) İşlemin sonucu negatif ise bu flag set edilir.
• TF(Trap Flag) Flag set edilirse program durdurulur.
• OF(Overflow Flag) İşaretli sayılar üzerindeki taşma olursa bu flag set edilir.
• IF(Interrupt Flag) CPU’nun çeşitli aygıtlardan kesme isteklerini dikkate almak
istenildiğinde bu flag set edilir.
• DF(Direction Flag) Bu flag dizgi işlemleri üzerindeki işlemin yönün belirlemek için kullanılır.
Bazı assembly instruction’ları flagleri set veya reset eder.
Örneğin:
xor eax, eax eax = 0
xor ebx, ebx ebx = 0
cmp eax, ebx işlemi sonucu ZF=0 olarak set edilir.
19. Segment Registers
SDÜ-CYBERLAB Assembly
• Segment register’ları programımızın bilgisayarın belleğe yüklendiği zaman bellek içerisinde
oluşturulan bölümlerin başlangıç adreslerini tutar.
• CS(Code Segment) : Programımızın çalıştırılabilir bellek bölgesinin başlangıç adresini tutar
• DS(Data Segment) : Programımız içerisindeki değişkenlerin saklandığı bölümdür.
• SS(Stack Segment) : Programımız için ayrılan stack bölümünün başlangıç adresini tutar.
• ES(Extra Segment) : Dizgi işlemlerinde kullanılır.
20. Some Assembly Commands
• MOV : 2 parametre alır. 2.ci parametredeki degeri 1. parametreye kopyalar.
Örn: mov eax, 5 ;5 değerini eax registerina kopyaladik
• ADD : 2 parametre alır. 2.nci parametre ile 1.nci parametreyi toplar ve 1.nci parametreye
yazar.
Örn: mov eax, 5
add eax, 3 ;işlem sonucu eax = 8 olur.
• SUB : 2 parametre alır. 2.nci parametre’den 1.nci parametreyi çıkartır ve sonucu 1.nci
parametrede tutar.
Örn: mov eax, 8
sub eax, 5 ;işlem sonucu eax = 3 olur.
• INC : 1 parametre alır. Aldığı parametredeki değeri 1 artırır.
• DEC : 1 parametre alır. Aldığı parametredeki değeri 1 eksiltir.
Örn: xor eax, eax
inc eax ; işlem sonucu eax = 1 olur.
dec eax ; işlem sonucu eax = 0 olur.
• CMP : 2 parametre alır. İki argumanı karşılaştırır ve sonuca göre flagler set edilir.
21. Some Assembly Commands
• MUL: 1 parametre alır. Diğer instructionlardaki gibi basit değil biraz kafa karıştırıcıdır.
Çarpma işlemine sokulan değer kaç bitlik ise(örn:32 bit) işlem sonucu 64 bitlik bir
alana yazilir.
Örnek üzerinden anlamaya çalışalım.
Örn: mov eax, 0x00000044
mov ecx, 0x00000002
mov edx, 0x41424344
mul ecx ; burada işlemciye ecx registeri
ile eax registerini kısmını çarp. Sonucu edx ve eax
registerlarında tut. İşlem sonucu:
eax = 0x00000088
ecx = 0x00000002
edx = 0x00000000
• mul si : işlem sonucu dx:ax registerlarında tutulur. İşlemin low kısmı ax, high
kısmı dx registerinda tutulur.
22. Some Assembly Commands
• DIV(Unsigned Division) : 1 arguman alır. Bölme işlemleri için kullanılır.
Genelde bellekte görmeyiz.
• Arguman 8 bitlik ise:
Örn: al ax / arg
ah ax % arg
• Arguman 32 bitlik ise:
Örn: eax edx:eax / arg Bölümün sonucu
edx edx:eax % arg Bölümden kalan
• Örn:
mov eax, 0x00000044
mov edx, 0x00000000
mov ebx, 0x00000002
div ebx ; eax registeri ile ebx registeri bölme işlemi
gerçekleştirilir. İşlem sonucu eax = 0x00000021,
edx = 0x00000000 olur.
23. Some Assembly Commands
SDÜ-CYBERLAB Assembly
• STOS(Store String):
STOSB(Byte):
[edi] al
edi’nin ilk byte’ina al’deki degeri atıyoruz.
STOSW(Word):
[edi] ax
edi’nin ilk 2 byte’ina ax’deki degeri atıyoruz.
STOSD(Dword):
[edi] eax
edi’nin ilk 4 byte’ina eax’deki degeri atıyoruz.
Bu komut DF(Direction Flag)’e göre EDI registerinin üzerinde gezer. Eger DF reset edilmişse
Soldan sağa, set edilmişse sağdan sola doğru hareket eder.
CLD(Clear Direction Flag)
STD(Set Direction Flag)
24. Some Assembly Commands
Şartlı Dallanmalar
• Dallanmalar arguman olarak adres alır !
• JMP(Jump) : Belirtilen adrese koşulsuz dallanma gerçekleşir.
• JE(Jump if equals) : ZF=1 set edilmişse dallanma gerçekleşir.
• JZ(Jump if zero) : ZF=1 set edilmişse dallanma gerçekleşir.
• JNE(Jump if not equals) : ZF=0 set edilmişse(reset) dallanma gerçekleşir.
• JNZ(Jump if not zero) : ZF=0 set edilmişse dallanma gerçekleşir.
• JB(Jump if below)/JC(Jump if carry)/JNAE(Jump if not above or equals)
CF=1 set edilmişse dallanma gerçekleşir.
• JBE(Jump if blow or equals)/JNA(jump if not above) : CF=0 ise dallanma
gerçekleşir.
• Ve çok daha fazlası ...
25. Introduction The Fasm
SDÜ-CYBERLAB Assembly
Neden FASM(Flat Assembler) ?
• Assembly ile proje geliştirme için elverişli.
• FASM’ı seviyoruz.
• Herhangi bir syntax hatası yapıldığında hatalı satır hata ayıklayıcısı tarafından
programcıya gösteriliyor.
• Daha çok FASM FASM FASM
• FASM ile çalışırken bilmemiz gerekenler
• .bss, .text, .data gibi segmentlerin tanımlanma şekli
• .idata nedir ? Ne işe yarar ? Yeniliyor mu ?
• include bulunamadı diyor mu ?
• FASM.exe’yi yola(PATH) eklemek nasıl oluyor ?
28. Introduction The Fasm
SDÜ-CYBERLAB Assembly
FASM Yola Ekleme
• ;C:Documents and SettingsreverseDesktopFASM
• FASM’ı yola eklememizin sebebi FASM.exe’yi komut satırında hangi
dizinde olursak olalım çağırabilmek için.
31. Introduction The FASM
SDÜ-CYBERLAB Assembly
.idata segment tanımlaması:
section ‘.idata’ import data readable
library kernel32,’kernel32.dll’,
msvcrt,’msvcrt.dll’
import kernel32,
ExitProcess,’ExitProcess’,
WriteFile,’WriteFile’
Sonra cart cart cart
32. Welcome To ExitWorld !
SDÜ-CYBERLAB Assembly
Assembly ile ilk basit programımız:
format PE console
entry start
include ‘win32a.inc’
section ‘.text’ code readable executable
start:
push 0
call [Exit]
section ‘.idata’ import data readable
library kernel32,’kernel32.dll’
import kernel32,
Exit,’ExitProcess’
• exit.asm şeklinde kaydedip console üzerinden « fasm exit.asm » şeklinde
derleyebilirsiniz.
33. Lets Talk About Conditional Branching
SDÜ-CYBERLAB Assembly
Assembly kodumuz:
format PE console
entry start
include ‘win32a.inc’
section ‘.text’ code readable executable
start:
mov eax, 5
my_loop:
dec eax
jnz my_loop
push 0
call [Exit]
section ‘.idata’ import data readable
library kernel32,’kernel32.dll’
import kernel32,
Exit,’ExitProcess’
34. Lets Play With Strings
SDÜ-CYBERLAB Assembly
mov eax, 1fh
cld
stosd
stosd
mov ax, 2255h
stosw
stosw
35. Lets Play With Strings
SDÜ-CYBERLAB Assembly
String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.
Challange1(Stosb):
format PE console
entry start
include 'win32a.inc'
MAX_ARRAY_LENGTH = 20h
section '.data' data readable writeable
my_str db 'SDUCYBERLABWIN32ASM!',0
bas db 'String uzunlugu: %d',10,0
section '.bss' readable writeable
target_str db MAX_ARRAY_LENGTH dup(?)
section '.text' code readable executable
import kernel32,
Exit,'ExitProcess'
import msvcrt,
printf,'printf'
36. Lets Play With Strings
SDÜ-CYBERLAB Assembly
start:
mov esi, my_str ;esi’de stringmiz tutuluyor
mov edi, target_str ;edi’de stringimizi kopyalayacagımız destination adresimiz
xor bl, bl ;stringin sonu kontrol registeri
xor edx, edx ;sayac
my_loop:
mov al, byte[esi + edx] ;stringmizin o andaki indexindeki
karakteri al registerina atıyoruz
inc edx ;sayacı artır
stosb ;al registerindaki degeri edi registerina kopyala
cmp bl, al ;string sonundamıyız ?
jnz my_loop ;sonundaysak devam et degilsek my_loop geri don.
push edx ;format string'izin isaret ettigi sayi
push bas ;.bss segmentimizdeki bas stringmiz
call [printf]; Do it
add esp, 8 ;Islem sonrasi stack'e attigimiz verileri temizliyoruz.
37. Lets Play With Strings
SDÜ-CYBERLAB Assembly
here_exit:
push 0
call [Exit]
section '.idata' import data readable
library kernel32,'kernel32.dll',
msvcrt,'msvcrt.dll'
import kernel32,
Exit,'ExitProcess'
import msvcrt,
printf,'printf'
38. Introduction The FASM
SDÜ-CYBERLAB Assembly
String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.
Challange2(lodsb):
format PE console
entry start
include 'win32a.inc'
section '.data' data readable writeable
my_str db 'SDUCYBERLABWIN32ASM!',0
bas db 'String uzunlugu: %d',10,0
39. Introduction The FASM
SDÜ-CYBERLAB Assembly
section '.text' code readable executable
start:
mov esi, my_str ;stringimizi esi registerina atiyoruz.
xor bl, bl ;stringimizin sonuna gelinip gelinmedigini sorgulamak icin ebx registerinin
8 byte'lik low kismini kullaniyoruz. bl=0
xor edx, edx ;edx registeri ile stringmizin uzunlugunu olcuyoruz.
my_loop:
inc edx ;sayaci artir
lodsb ;esi'de bulunan stringin indexindeki karakteri al registerina atadik.
cmp bl, al ;0 mi kontrol ettik
jnz my_loop ;Eger sifir degilse yaniyani string'in sonuna gelmemissek
my_loop'a don geldiysek yola devam
;Ekrana_bas
push edx ;format string'izin isaret ettigi sayi
push bas ;.bss segmentimizdeki bas stringmiz
call [printf] ; Do it
add esp, 8 ;Islem sonrasi stack'e attigimiz verileri temizliyoruz.
;Cikis
here_exit:
push 0
call [Exit]
40. Introduction The FASM
SDÜ-CYBERLAB Assembly
section '.idata' import data readable
library kernel32,'kernel32.dll',
msvcrt,'msvcrt.dll'
import kernel32,
Exit,'ExitProcess'
import msvcrt,
printf,'printf'
41. Introduction The FASM
SDÜ-CYBERLAB Assembly
String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.
Challange3(movsb):
format PE console
entry start
include 'win32a.inc'
MAX_ARRAY_LENGTH = 20h
section '.data' data readable writeable
my_str db 'SDUCYBERLABWIN32ASM!',0
bas db 'String uzunlugu: %d',10,0
section '.bss' readable writeable
target_str db MAX_ARRAY_LENGTH dup(?)
section '.text' code readable executable
42. Introduction The FASM
SDÜ-CYBERLAB Assembly
start:
mov esi, my_str
mov edi, target_str
xor al, al
xor ecx, ecx
my_loop:
inc ecx
cmp al, byte [esi]
movsb
jnz my_loop
push ecx ;format string'izin isaret ettigi sayi
push bas ;.bss segmentimizdeki bas stringmiz
call [printf] ; Do it
add esp, 8 ;Islem sonrasi stack'e attigimiz verileri temizliyoruz.
;Cikis
here_exit:
push 0
call [Exit]
43. Introduction The FASM
SDÜ-CYBERLAB Assembly
section '.idata' import data readable
library kernel32,'kernel32.dll',
msvcrt,'msvcrt.dll'
import kernel32,
Exit,'ExitProcess'
import msvcrt,
printf,'printf'
44. Introduction The FASM
SDÜ-CYBERLAB Assembly
String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.
Challange4(repz):
format PE console
entry start
include 'win32a.inc'
section '.data' data readable writeable
my_str db 'SDUCYBERLABWIN32ASM!',0
yaz db 'String uzunlugu: %d',10,0
section '.text' code readable executable
45. Introduction The FASM
SDÜ-CYBERLAB Assembly
start:
mov edi, my_str ;Destionation index'e datamızı koyuyoruz.
mov ebx, edi ;String uzunlugunu net olarak almak icin edi'nin ilk adresini ebx
registerina atıyoruz.
xor al, al ;eax'in 8 byte'lık low kısmını sıfırlıyoruz. stringimizin sonuna geldik
gelmedik mi karşılaştırmasını "al" ile yapıyoruz.
repnz scasb ;repnz[repeat as long as not zero] scasb[scan string byte] :
yaniyani stringin sonuna gelene kadar tekrar et.
;scasb komutu edi registerinin degerini her seferinde 1 artırır.String
dizisinin bir sonraki karakterini al registeri ile karsılastır.
mov eax, edi ;yukarıdaki işlem tamamlandıgında edi registerinin son degeri
string'in son indexini gösteriyor olur.
sub eax, ebx ;burada edi'de bulunan string'in ilk byte'indan son byte'ini
cıkarıyoruz. and we got it our string length.
46. Introduction The FASM
SDÜ-CYBERLAB Assembly
push eax ;format stringimize karsilik gelen deger yaniyani strigimizin uzunlugu !
push yaz ; .data sectiondaki "String uzu....."
call [printf] ;ekrana bastır
add esp,4*2 ; işlem sonucunda fonksiyondan cikildiginda fonksiyona vermek
icin stack'e attıgımız degerler oldugu gibi yerinde durdugu icin onları temizliyoruz.
push 0 ; exit cikis kodu
call [ExitProcess] ; do it
47. Introduction The FASM
SDÜ-CYBERLAB Assembly
String işlemlerini daha iyi anlayabilmek için aynı işlevi yapan farklı farklı kodlar yazıcaz.
Challange4(repz):
format PE console
entry start
include 'win32a.inc'
section '.data' data readable writeable
my_str db 'SDUCYBERLABWIN32ASM!',0
yaz db 'String uzunlugu: %d',10,0
section '.text' code readable executable
48. Introduction The FASM
SDÜ-CYBERLAB Assembly
start:
mov edi, my_str ;Destionation index'e datamızı koyuyoruz.
mov ebx, edi ;String uzunlugunu net olarak almak icin edi'nin ilk adresini ebx
registerina atıyoruz.
xor al, al ;eax'in 8 byte'lık low kısmını sıfırlıyoruz. stringimizin sonuna geldik
gelmedik mi karşılaştırmasını "al" ile yapıyoruz.
repnz scasb ;repnz[repeat as long as not zero] scasb[scan string byte] :
yaniyani stringin sonuna gelene kadar tekrar et.
;scasb komutu edi registerinin degerini her seferinde 1 artırır.String
dizisinin bir sonraki karakterini al registeri ile karsılastır.
mov eax, edi ;yukarıdaki işlem tamamlandıgında edi registerinin son degeri
string'in son indexini gösteriyor olur.
sub eax, ebx ;burada edi'de bulunan string'in ilk byte'indan son byte'ini
cıkarıyoruz. and we got it our string length.
49. Introduction The FASM
SDÜ-CYBERLAB Assembly
push eax ;format stringimize karsilik gelen deger yaniyani strigimizin uzunlugu !
push yaz ; .data sectiondaki "String uzu....."
call [printf] ;ekrana bastır
add esp,4*2 ; işlem sonucunda fonksiyondan cikildiginda fonksiyona vermek
icin stack'e attıgımız degerler oldugu gibi yerinde durdugu icin onları temizliyoruz.
push 0 ; exit cikis kodu
call [ExitProcess] ; do it
50. Introduction The FASM
SDÜ-CYBERLAB Assembly
section '.idata' import data readable
library kernel32,'kernel32.dll',
msvcrt,'msvcrt.dll'
import kernel32,
ExitProcess,'ExitProcess'
import msvcrt,
printf,'printf'
51. Lets Talk About Sub Routine
SDÜ-CYBERLAB Assembly
Sub Routine nedir ?
Sub Routine assembly kodumuz herhangi bir fonksiyonun mesela printf gibi herhangi bir fonksiyonun içerisine
dallandığında fonksiyona hangi adreste girdiğini, fonksiyondan çıktıktan sonra nereden devam edeceğini işlemcinin
bilmesi gerekiyor. İşlemcinin bunları yapabilmesi için kendi içerisinde bir kuralı vardır ve bunun adı subroutine olarak
geçer. Daha yakından bakalım.
print_str:
push ebp ;fonksiyona girdikten sonra ebp’yi kaydediyor.
mov esp, ebp ; stack’i fonksiyon için ayarlıyor
sub esp, 4*6 ;local değişkenler için stackten yer ayırıyoruz. Bu durumda pek gerekli olmasada.
push eax ;registerlar bizim için değerli ise esi,edi gibi registerlarda eklenebilir. Yada hepsini kaydetmek için pushad komutu kulllanılabilir.
push ebx
push ecx
push edx
push esi ;string veriliyor.
call [printf] ;ekrana yazdırılıyor.
add esp,4 ;stack’te en son pushlanan esi registerini temizliyoruz.
pop edx ;registarlari eski haline getiriyoruz.
pop ecx
pop ebx
pop eax
add esp, 4*6 ;local degiskenler için ayrılan alan geri veriliyor.
mov ebp, esp ;stack pointer fonksiyona girildiğindeki değerine geri dönderilyor.
pop ebp ;eski ebp fonksiyona girildiğindeki degerine donderiliyor.
ret ;ve fonksiyona girdiği adresten bir sonraki adrese yaniyani eip’nin işaret ettiği adrese donderiliyor.
54. Introduction Immunity Debugger
SDÜ-CYBERLAB Assembly
Bazı kısayollar:
F7: Step in
F8: Step over
F9: Continue
F2: Break Point Soft
CTRL+G:Search
Daha fazlası için ImmLib -> Lib
References
70. Introduction The WinDBG
SDÜ-CYBERLAB Assembly
s(search): Bellekte aradığımız adres içerisinde string,sayi ne istersek 2.arguman olarak
vererek arama yapmamızı sağlar.
71. Windows API Introduction
SDÜ-CYBERLAB Assembly
Yazılan programlar doğrudan işletim sistemine erişemez.
İşletim sistemi geliştiricileri programcıların işletim sistemi üzerinde kod geliştirmesi için
API dediğimiz özel fonksiyonlar geliştirmişlerdir.
API(Application Programming Interface)
Windows API’ler windows işletim sistemi üzerinde ‘.dll’(Dynamic Linked Library) dosyalarda
tutulur.
72. Dynamic Linked Library
SDÜ-CYBERLAB Assembly
DLL’ler çalıştırabilir bir dosyadır. Entry Point dediğimiz programımızın işletim sistemi
tarafından çalıştırılmaya başladığı başlangıç adresi dll dosyalarında bulunmamaktadır.
Herhangi bir çalıştırılabilir dosya dll dosyalarını kullanabilir.
DLL’ler fiziksel hafızaya sadece 1 kere yüklenirler ve birçok program tarafından defalarca
kullanılabilirler.
Her DLL işletim sistemine ait olmayabilir. Kendi dll dosyamızı istersek yazabiliriz.
73. Some DLL’s
SDÜ-CYBERLAB Assembly
Kernel32.dll
Dosya Sistemi, Hafıza Yönetimi, Processler, Threadler, Error Handler
User32.dll
Windows GUI
Gdi32.dll
Grafik: Monitor çıktısı, yazıcılar vs vs
Msvcrt.dll
String işlemleri ve daha bir çoğu.
Bir çok dll mevcut daha fazlası için msdn.com
74. API Samples
SDÜ-CYBERLAB Assembly
format PE console
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
push 0 ;Exit cikis kodu
call [Exit] ;Exit fonksiyonunu cagiriyoruz.
section '.idata' import data readable
library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.
import kernel32,
Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess
fonksiyonunu
;"Exit" programa import ediyoruz.
75. API Samples
SDÜ-CYBERLAB Assembly
format PE console
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
push 0 ;Exit cikis kodu
call [Exit] ;Exit fonksiyonunu cagiriyoruz.
section '.idata' import data readable
library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.
import kernel32,
Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess
fonksiyonunu
;"Exit" programa import ediyoruz.
76. API Samples
SDÜ-CYBERLAB Assembly
format PE console
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
push 0 ;Exit cikis kodu
call [Exit] ;Exit fonksiyonunu cagiriyoruz.
section '.idata' import data readable
library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.
import kernel32,
Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess
fonksiyonunu
;"Exit" programa import ediyoruz.
77. API Samples
SDÜ-CYBERLAB Assembly
format PE console
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
push 0 ;Exit cikis kodu
call [Exit] ;Exit fonksiyonunu cagiriyoruz.
section '.idata' import data readable
library kernel32,'kernel32.dll' ;kernel32.dll dll'ini kernel32 adiyla tanimliyoruz.
import kernel32,
Exit,'ExitProcess' ;kernel32.dll dosyasindan ExitProcess fonksiyonunu
;"Exit" programa import ediyoruz.
81. API Samples
SDÜ-CYBERLAB Assembly
; Complex macro example
include 'win32ax.inc' ; complex macro include file is here
.code
start:
invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example
program!",invoke GetCommandLine,MB_OK
invoke ExitProcess,0
.end start