1. 程式人生 > >IDA Pro 程式碼破解揭祕 (一) 逆向工程基礎

IDA Pro 程式碼破解揭祕 (一) 逆向工程基礎

一,組合語言

彙編是與計算機交換的一種有趣的方法。就其本身來說,彙編是指與處理器指令集一一對應指令助記符的使用

二,暫存器

預分配的,物理上存在於處理器中的變數。可以用來儲存整數,偏移量,立即數,指標等。

簡單的介紹幾個32位通用暫存器:

EAX, EBX, ECX, EDX,ESI, EDI, EBP, ESP, EIP。

他們都可以用來儲存使用者資料,但有些有著自己專門的用途。

ECX: 用作計數器

EXI:  用作源指標

EDI: 用作目的指標

EIP: 指向處理器將要執行的下一條指令。

詳細資訊可以參見組合語言相關書籍。

三,作業系統模式和記憶體使用

在IA-32中,有3種作業系統模式(保護模式,實地址模式,系統管理模式)和一種偽操作模式(虛擬8086模式)。其中保護模式是關注的重點。

-        實地址模式:老的DOS系統支援這種模式,在重啟或冷啟動IA-32系統時系統處於這種模式。

-        系統管理模式:出現在80386的Inter架構裡,用於電源管理,系統控制等地方。它基本阻塞系統其它的操作,並切換到新的地址空間。

-        保護模式:在80286中引入,在80386中得到完善。之前老的處理器只支援一種模式,不能在硬體上強制保護指令和記憶體。 在保護模式裡有四個環的特權級,從而限制了程式對系統資料的訪問。

保護模式中記憶體的使用

在保護模式中,有三種不同的記憶體模型:平坦,分段,實地址。

-        實地址    :長用於啟動時保持向後相容。

-        平坦地址:作業系統記憶體看起來像一片連續的地址空間,這裡的地址空間被稱為線性空間,任何單獨的地址都會被認為是線性的地址。在這種記憶體模型中,所有的段--程式碼,棧,資料段等,都屬於同一個地址空間。先在作業系統都使用這種模型。保護模式中,對平坦模型的段設定了限制。

-        分段地址:用於較早的作業系統,但現在有復甦的跡象。在某些地方它意味著速度和安全性的增加。在分段記憶體模型中,系統記憶體被分成成為段的小塊。段之間相互獨立。

現代作業系統定址方式

現代作業系統能使用的地址空間往往比實體記憶體更大一些,而定址的資料並不一定儲存在實體記憶體裡。主要是通過分頁和虛擬記憶體實現的。

分頁利用了這樣的事實,在作業系統中,只有當前必須的資料才儲存在實體記憶體中,暫時不用的資料則儲存在硬碟上,把資料從磁碟讀入記憶體或從記憶體寫入磁碟的過程稱為資料交換,Windows 系統中有交換檔案,Linux系統中有交換分割槽。當不啟用分頁時線性地址和實體地址一一對應,地址空間之間沒有轉換。當啟用分頁後虛擬地址和實體地址不存在了一一對應的關係。這也就是為什麼保護模式裡,平坦記憶體模型中,兩個應用程式使用分頁訪問完全一樣的地址,卻不會彼此破壞。

使用分頁技術時,處理器把實體地址分為 4KB, 2MB, 4MB大小的頁。線性地址可以轉換為頁地址,如果當前線性地址的頁不在實體記憶體中,則丟擲page-fault異常,系統捕獲異常後會把目標頁載入記憶體,然後繼續執行剛才導致異常的指令。

虛擬地址轉換為實體地址依賴於頁面的大小,下圖展現了一個4K頁面的地址轉換過程:

1) 通過頁面基地址暫存器(Page Directory Base Register) 或 CR3查詢頁面目錄並定位頁表入口

2) 通過頁面表查詢並定位頁面

3) 在頁面中通過偏移量定位實體地址

v2p_pic