1. 程式人生 > >《逆向分析實戰》1.1

《逆向分析實戰》1.1

浮點 重要 保存 字符串操作 減法 存儲 dir 符號位 修飾

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

條件標誌寄存器:

  1. OF,11,OverFlow Flag。溢出標誌位,反映有符號數加減法運算所得結果是否溢出。超過當前運算位數表達範圍稱為溢出,標誌位被置1,否則為0。
  2. SF,7,Sign Flag,符號標誌位,反映運算結果的符號位。運算結果為負時為1,為正時為0.
  3. ZF,6,0標誌位,運算結果為0該位置為1,否則為0.
  4. AF,4,Auxiliary carry flag,輔助進位標誌位,在字操作時,發生低字節向高字節進位或借位時該位置為1,否則為0.字節操作要求低4位向高4位。
  5. PF,2,Parity Flag,奇偶標誌位,反映結果中1個數的奇偶性。偶數置1
  6. CF,0,Carry Flag,進位標誌位,運算結果最高位產生了一個進位或者借位,該位置1。

控制標誌寄存器:

  1. DF,10,Direction Flag,
  2. IF,9,Interrupt Flag,
  3. TF,8,Trap flag,

以上都是常用的標誌位,要掌握標誌位每一位的作用和標誌位在第幾位。

OD中認識寄存器

在調試的過程中,寄存器的值在發生改變時會變為紅色,未發生改變時為黑色。雙擊,右鍵顯示菜單可修改,復制寄存器的值。

《逆向分析實戰》1.1