標籤:現在 一次迴圈 lods 來源 概念 傳輸 緩衝 cpu 記憶體資料
1.OD介面的熟悉
左上為反組譯碼視窗,用於顯示 反組譯碼代碼,調試剖析器主要在這個視窗中進行。
左中為資訊提示視窗,用於顯示與反組譯碼視窗中上下文環境相關的記憶體,寄存器或者跳轉來源,調用來源等資訊。
左下為資料視窗,用於以多種格式顯示記憶體中的內容,可使用的格式有hex,文本,短型,長型,浮點,地址和反組譯碼等。
右上為寄存器視窗,用於顯示各個寄存器的內容,包括通用寄存器,段寄存器,標誌寄存器,浮點寄存器,右鍵可選擇MMX寄存器,3DNow!寄存器和調試寄存器
右下為棧視窗,用於顯示棧內容,棧幀,即ESP或EBP寄存器指向的地址部分。
最下為命令視窗,用於輸入命令以簡化調試分析。
2.對資料的理解
最基本的是一個位元組佔8位,一個字佔16位。hex資料不是按最基本的情況顯示,一個位元組佔兩列。db表示位元組類型,dw表示字類型,dd表示雙字類型,表示數值的時候,h結尾的表示16進位,b結尾的表示二進位,無修飾的表示十進位。
定義w1=5566h,w2=7788h,但是在記憶體中會顯示為6655與8877.主機採用的是小尾方式儲存資料,資料的低位存放在記憶體的低地址中,資料高位存放在記憶體高地址中,因此低位存放66,高位存放55,在記憶體看時是相反的。當在資料視窗中選擇資料時,右鍵的菜單提供編輯,賦值,尋找,斷點等功能。
命令視窗輸出db/dw/dd+address,可改變資料視窗的顯示方式。(按位元組或者字或者雙字)。
3.x86組合語言介紹
逆向入門的目標,掌握80x86的常用指令,寄存器的用法,堆棧的概念和資料在記憶體中的儲存。
寄存器用來存放程式運行中的各種資訊,包括運算元地址,運算元,運算的中間結果。
CPU的工作模式分為實模式與保護模式,前者較早期,可以直接存取硬體,現在的CPU仍然支援實模式,為了相容以及X86的架構處理器都是從實模式引導過來的。
寄存器register是CPU內部用於高速儲存資料的小型儲存單元,訪問速度比記憶體快很多,但兩者都是用來儲存資料的。(價格 寄存器>記憶體>硬碟)CPU訪問記憶體中的資料是時會有一個定址的過程,因此訪問記憶體時間更長。而寄存器時整合在CPU內部的,數量少而且具有獨立的名字,因此訪問速度非常快。
X86寄存器中,逆向相關的有基本寄存器,調試寄存器與控制寄存器。基本寄存器分為8個通用寄存器,6個段寄存器,1個指令指標寄存器和1個標誌寄存器。
通用寄存器用於資料的傳輸與各種運算。32位通用寄存器包括4個資料寄存器,EAX,EBX,ECX,EDX(每個寄存器都可以當作一個32位,16位AX或8位AH對應高八位與AL對應低八位的儲存單元來用)。32位標誌寄存器EFLAGS,32位指令指標寄存器EIP(可按照32位與16位進行使用,低16位表示為SI來儲存16位的指標),16位段寄存器CS,SS,DS,ES,FS,GS。
關於8個通用寄存器的解釋:
EAX為累加器,在乘法與除法指令中被自動使用。EBX為基底位址暫存器,DS段中的資料指標。ECX為計數器,在字串和迴圈操作中常用,在迴圈指令和串操作時,ECX用來迴圈計數。每執行一次迴圈,ECX被CPU自動減一。EDX為資料寄存器。這四個寄存器主要用在算術運算與邏輯運算指令中,用來儲存各種需要計算的值。
EBP為擴充基址指標寄存器,SS段中堆棧內資料指標。EBP由進階語言用來 引用參數與局部變數,亦稱為堆棧基址指標寄存器。ESP為堆棧指標寄存器,SS中堆棧指標。ESP用來 定址堆棧上的資料,一般不參與運算。ESI為源變址寄存器,字串操作源指標。EDI為目的變址寄存器,字串操作目標指標。後兩者常用於記憶體資料的傳遞。ESI與EDI與特定的指令LODS,STOS,REP,MOVS一起使用,主要用於記憶體中資料的複製。ESP指示堆棧地區的棧頂地址,PUSH,POH,CALL,RET直接操作該指標。EBP表示堆棧地區的基地址。
EIP寄存器儲存著下一條要執行的指令的地址,程式運行時,CPU會讀取EIP中的一條指令的地址,傳送指令到指令緩衝區後,EIP寄存器的值自動加上讀取指令的位元組大小。即下一條指令的地址是當前指令地址加上當前指令長度。CPU每運行完一條指令,就會通過EIP寄存器讀取下一條指令給CPU。轉移指令 會改變EIP的值,使CPU跳躍性執行,從而構成分支與迴圈的程式結構。EIP寄存器的值在程式中無法直接修改,只能通過影響EIP的指令或者中斷,異常來影響。EIP中的值始終引導CPU的執行。
段寄存器用於存放段的基地址,段是一塊預分配的記憶體地區。CS程式碼片段,DS資料區段,SS堆棧段,ES(FS和GS)附加資料區段。在逆向中常用到FS寄存器,用於儲存SEH,TEB,PEB等重要的作業系統資料結構。
標誌寄存器FLAGS,15~0
條件標誌寄存器:
- OF,11,OverFlow Flag。溢出標誌位,反映有符號數加減法運算所得結果是否溢出。超過當前運算位元表達範圍稱為溢出,標誌位被置1,否則為0。
- SF,7,Sign Flag,符號標誌位,反映運算結果的符號位。運算結果為負時為1,為正時為0.
- ZF,6,0標誌位,運算結果為0該位置為1,否則為0.
- AF,4,Auxiliary carry flag,輔助進位標誌位,在字操作時,發生低位元組向高位元組進位或借位時該位置為1,否則為0.位元組操作要求低4位向高4位。
- PF,2,Parity Flag,奇偶標誌位,反映結果中1個數的奇偶性。偶數置1
- CF,0,Carry Flag,進位標誌位,運算結果最高位產生了一個進位或者借位,該位置1。
控制標誌寄存器:
- DF,10,Direction Flag,
- IF,9,Interrupt Flag,
- TF,8,Trap flag,
以上都是常用的標誌位,要掌握標誌位每一位的作用和標誌位在第幾位。
OD中認識寄存器
在調試的過程中,寄存器的值在發生改變時會變為紅色,未發生改變時為黑色。雙擊,右鍵顯示菜單可修改,複製寄存器的值。
《逆向分析實戰》1.1