1. 程式人生 > >pe逆向入門筆記一彙編指令學習及crackme初體驗

pe逆向入門筆記一彙編指令學習及crackme初體驗

pe逆向入門筆記一
彙編指令學習及crackme初體驗
push略
pop指令
如 執行  pop eax
則棧頂的數會傳給 eax這個暫存器
具體說明:
原來esp 地址為0019ff84,值773E62C4
eax為 00000000
執行 pop eax後(f7)
esp 地址為0019ff88,值00293000
eax為773E62C4


pushad將所有的暫存器的值都push到記憶體中去


popad將所有的堆疊的值都pop回暫存器中


move略


LEA取地址指令
類似於MOV指令, 但是第一個運算元是一個通用暫存器,並且第二個運算元是一個記憶體單元。當計算的時候要依賴於之前的結果的話,那麼這個指令就非常有用。


XCHG EAX,ECX
交換兩個運算元


INC和DEC  一個是使暫存器或記憶體值加一,另一個減一


add 和 sub 略
MUL(無符號數的乘法)
有兩種乘法,第一個種是MUL,這種是無符號數乘法,只有一個運算元,另一個運算元是EAX,結果存放到EDX:EAX中
IMUL(有符號數的乘法)


邏輯指令


and 只有兩個二進位制位都為1的時候結果才為1,其他情況,結果都為0。
or 該指令AND的不同之處在於,兩位中只要有一位為1,結果就取1。
xor該指令時異或運算,當兩位不同時取1,相同時取0。
NOT 按位取反


比較跳轉
我們知道,某些指令的指令會影響到標誌位,最常見的就是零標誌位Z。
cmp
該指令是比較兩個運算元,實際上,它相當於SUB指令,但是相減的結構並不儲存到第一個運算元中。只是根據相減的結果來改變零標誌位的,當兩個運算元相等的時候,零標誌位置1。
如果運算元1大於等於運算元2,標誌位s會被置0,如果運算元1小於運算元2,標誌位s會被置1
test(邏輯比較)將兩個數值進行與操作


跳轉指令jmp
jz是當z為0時跳轉
jnz是當z不為0的時候跳轉


call指令和ret指令
設定下一條執行的指令,右鍵設定為新的eip,eip值會改變。
如果不想跟進這個函式,則用follow這個按鈕就可以檢視函式而不跟進
出現的ret指令就是子程式的結束
為了讓子程式執行完ret指令後,知道要返回到哪裡,返回地址將要存到堆疊當中
執行完call指令後,call指令的下一條指令地址會被存放到堆疊的棧頂中
f2進行下斷點
返回地址在ret中存放


迴圈指令
loop 地址


逆向入門小例子

小例子地址:http://download.csdn.net/detail/zsd747289639/9859942

因為太簡單,所以就不細細寫,以下是步驟提示

1、搜尋呼叫的api名稱
找到api呼叫的地方,在那個函式的首部設定斷點。
在進行下一步的分析
注意函式的返回地址,根據返回地址來尋找使用者名稱校驗函式(會對使用者名稱進行是否數字等校驗)
判斷是否為數字,只要把c標誌位置零,即可繞過,但要根本解決辦法的話需要對其呼叫處進行nop操作。
最後函式需要無條件執行呼叫成功的資訊,總不能改z標誌位吧,所以這裡我們要修改跳轉指令,把je改為jmp無條件條狀。(je是判斷z是否為1,如果是1則跳轉)
2、將修改後的檔案儲存到可執行檔案,全選,彈出另一個視窗,然後儲存