《加密與解密》(第三版)【1】基礎知識——小結

這章純基礎知識,四塊內容:文本字符、Windows操作系統、保護模式和PE格式。

文本字符是介紹了下ASCII和Unicode字符集,然後Windows操作系統介紹了下Windows下的一些常用API(後面逆向常會遇到,熟悉參數列表及函數功能)和術語(句柄)及消息機制等。保護模式和PE文件格式做了個粗略的介紹。

一、文本字符

首先,有大小端規則來說明多字節數據的存放順序:

Big-Endian(正序、大端):高位字節存入低地址,地位字節存入高地址,依次排列。

Little-Endian(逆序、小端):地位字節存入低地址,高位字節存入高地址,依次排列。


常見的Intel體系芯片使用的編碼屬於小端規則,某些RISC架構的CPU,如IBM的Power-PC等屬於大端規則。

這本書作者的講解是基於Intelx86上的Windows平臺的,所以都是小端規則。


ASCIIUnicode字符集,這個,繼續維基百科:

ASCII:“ASCII(pronunciation: /ˈæski/ ASS-kee[1],American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統。它主要用於顯示現代英語,而其擴展版本EASCII則可以勉強顯示其他西歐語言。它是現今最通用的單字節編碼系統(但是有被Unicode追上的跡象),並等同於國際標準ISO/IEC 646。” 

Unicode:“Unicode(統一碼、萬國碼、單一碼、標準萬國碼)是計算機科學領域裏的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更爲簡化地方式來呈現和處理文字。”

這樣大概可以區別出來了,一個是主要顯示現代英文,另一個是整合了其它文字系統(國際化必須)。另外,實現方面,一個7位,另一個16位。



二、Windows操作系統

WinAPI方面,介紹歷史:

用於16位版本Windows的API(Windows1.0到Windows3.1)現在稱作Win16。

用於32位版本Windows的API(Windows9x/NT/2000/XP/2003)現在稱作Win32。

所有32位版本的Windows都支持Win16API(和舊應用程序兼容),不過Windows NT/2000/XP和Windows 9x的工作方式不同。

在Windows NT/2000/XP上,Win16函數調用通過一個轉換層被轉化爲Win32函數調用,然後被操作系統處理(實際調用Win32,WOW)。

而在Windows 9x上,是由Win16函數支持的,既是Win32函數實際上是通過調用Win16函數實現的。


早起,Windows的主要部分只需要三個動態鏈接庫實現:Kernel、User和GDI。

Kernel(由16位的KRNEL386.DLL和32位的KERNEL32.DLL實現):操作系統核心功能服務,包括進程和線程控制、內存管理和文件訪問等。

User(由16位的USER.DLL和32位的USER32.DLL實現):負責處理用戶接口,包括鍵盤和鼠標輸入、窗口和菜單管理等。

GDI(由16位的GDI.DLL和32位的GDI32.DLL實現):圖形設備接口、允許程序在屏幕和打印機上顯示文本和圖形。

除上述模塊外,還提供其它功能模塊。

(Windows 9x是一個16位和32位的混合體,因此係統需要加載16位和32位的DLL;而Windows NT/2000/XP是一個純32位系統,並沒有加載16位的DLL,不過還是保留在了SYSTEM32目錄下。現在Win64下還有個SYSWOW64目錄。)


接着,需要知道一些常用WinAPI。

hmemcpy、GetWindowsText……


還有句柄。應用程序中需要向系統申請一些對象,系統就會返回這些對象的句柄,通過這些句柄,進程可以操控對象。(不同進程同一對象句柄可能不同,意思是不能亂共享,需要正確方法。)


Windows 9x幾乎都是使用ANSI字符串來進行所有的內部操作的。而新架構上,從頭到尾都用Unicode進行開發,系統核心是用Unicode函數工作的。而ANSI版本,則需要通過一個轉換層來調用Unicode版本的函數。(會進行些額外的操作,從而佔用更多的內存和CPU資源。)


Windows消息機制,記住Windows是消息驅動型的系統就OK了。Windows系統中有兩種消息隊列:一種是系統消息隊列,另一箇中是應用程序消息隊列。當一個事件發生時,先進系統消息隊列,然後再拷貝到各應用程序消息隊列。


三、保護模式

三種模式:實模式、保護模式、虛擬86模式。實模式是古老的MS-DOS運行的環境,只能利用32位寄存器的前16位,而後16位則白白浪費。而保護模式則可以運行更多的內存。


保護模式下的權限級別,在保護模式下,所有的應用程序都有權限級別(PL),從0到3有4等,其中0最高,3最低。操作系統的核心層是運行在Ring0級的,而Win32子系統(如KERNEL32.DLL、USER32.DLL)是運行在Ring3級的,以提供與應用程序的接口。




四、認識PE格式

Windows的可執行文件(EXE,DLL)是PE(Portable Executable )格式。

PE文件使用的是一個平面地址空間,所有的代碼和數據都被合併在一起,組成一個很大的結構。文件的內容被分割爲不同的區塊(section,區段、節),塊中包含代碼或數據。每個塊都有它自己在內存中的一套屬性(是否包含代碼,是否只讀……)。

每個區塊都有不同的名字,這個名字用來表示區塊的功能。常見的塊的含義:

*.text:是在編譯或彙編結束時產生的一種塊,它的內容全是指令代碼;

*.rdata:是運行期只讀數據;

*.data:是初始化的數據塊;

*.idata:包含其他外來DLL的函數及數據信息,既輸入表;

*.rsrc:包含模塊的全部資源,如圖標、菜單、位圖等。


PE文件非常好的一個地方就是在磁盤上的數據結構與在內存中的結構是一致的。裝載一個可執行文件到內存中主要就是講一個PE文件的某一部分映射到地址空間中。這樣,PE文件的數據結構在磁盤和內存中的是一樣的。



PE相關名詞解釋:

1、入口點(Entry Point):PE文件執行時的入口點,也就是說,程序在執行時的第一行代碼的地址應該就是這個值。

2、文件偏移地址(File Offset):當PE文件儲存在磁盤上時,各數據的地址稱作文件偏移地址。文件偏移地址從PE文件的第一個字節開始計數,起始值爲0。

3、虛擬地址(Virtual Address,VA):由於Windows程序運行在386保護模式下,所以程序訪問存儲器所使用的邏輯地址成爲虛擬地址,又稱爲內存偏移地址。與實地址模式下的分段地址類似。

4、基地址(ImageBase):文件執行時被映射到指定內存中,這個初始地址稱爲基地址(ImageBase)。這個值是由PE文件本省設定的。按照默認設置,用VC建立的EXE文件基地址是0040000h,DLL文件基地址是10000000h。但是,可以在創建應用程序的EXE文件時改變這個地址。

發佈了121 篇原創文章 · 獲贊 9 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章