編程語言
1、機器語言声离,電腦CPU可直接解讀芒炼,與運行平臺密切相關,通用性很差术徊,早期計算機利用卡帶記錄01便是如此本刽;
2、匯編語言赠涮,是一種用于可編程器件的低級語言子寓。在不同的設備中,匯編語言對應著不同的機器語言指令集笋除, 運行時按照設備對應的機器碼指令進行轉換斜友,所以可移植性也較差;
3株憾、高級語言蝙寨。
編譯、鏈接和PE文件
編譯是指編譯器將源代碼進行詞法和語法的分析嗤瞎,將高級語言指令轉換為匯編代碼墙歪。
1、預處理贝奇。正式編譯前虹菲,根據已放置在文件中的預處理指令來修改源文件的內容,包含宏定義指令掉瞳,條件編譯指令毕源,頭文件包含指令,特殊符號替換等陕习。
2霎褐、編譯、優(yōu)化该镣。編譯程序通過詞法分析和語法分析冻璃,將其翻譯成等價的中間代碼表示或匯編代碼。
3损合、目標代碼生成省艳。將上面生成的匯編代碼譯成目標機器指令的過程。目標文件中所存放著與源程序等效的目標的機器語言代碼嫁审。
鏈接是指將有關的目標文件彼此相連接生成可加載跋炕、可執(zhí)行的目標文件,其核心工作是符號表解析和重定位律适。鏈接按照工作模式分靜態(tài)和動態(tài)鏈接兩類辐烂。
靜態(tài)鏈接:鏈接器將函數的代碼從其所在地(目標文件或靜態(tài)鏈接庫中)拷貝到最終的可執(zhí)行程序中遏插,整個過程在程序生成時完成。靜態(tài)鏈接庫實際上是一個目標文件的集合棉圈,其中的每個文件含有庫中的一個或者一組相關函數的代碼涩堤,靜態(tài)鏈接則是把相關代碼拷貝到源碼相關位置處參與程序的生成。
動態(tài)鏈接:動態(tài)鏈接庫在編譯鏈接時只提供符號表和其他少量信息用于保證所有符號引用都有定義分瘾,保證編譯順利通過胎围。程序執(zhí)行時,動態(tài)鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間德召,根據可執(zhí)行程序中記錄的信息找到相應的函數地址并調用執(zhí)行
經過編譯鏈接后白魂,程序生成,windows程序以PE文件形式存儲上岗。
PE文件全稱Portable Executable福荸,意為可移植可執(zhí)行文件,常見的EXE肴掷、DLL敬锐、OCX、SYS呆瞻、COM都是PE文件台夺。 PE文件以段的形式存儲代碼和相關資源數據,其中數據段和代碼段是必不可少的兩個段痴脾。
在應用程序中最常出現的段有以下6種:
1颤介、執(zhí)行代碼段,.text命名赞赖;
2滚朵、數據段,.data前域、.rdata 命名辕近;
3、資源段匿垄,.rsrc命名移宅;
4、導出表年堆,.edata命名;
5盏浇、導入表变丧,.idata命名;
6绢掰、調試信息段痒蓬,.debug命名童擎。
系統(tǒng)并非在硬盤上直接運行程序,而是將其裝載進內存里攻晒,包括其中的代碼段顾复、數據段等。
程序運行時鲁捏,由“裝載器”將硬盤上的數據復制到內存芯砸,裝載器根據程序的PE頭中的各種信息,進行堆棧的申請和代碼數據的映射裝載给梅,在完成所有的初始化工作后假丧,程序從入口點地址進入,開始執(zhí)行代碼段的第一條指令动羽。
逆向原理
“逆向”包帚,顧名思義,將編譯鏈接好的程序反過來恢復成“代碼級別”运吓。
C\C++程序在經過編譯鏈接后渴邦,程序為機器碼,直接可供CPU使用拘哨,對于這類程序我們使用IDA谋梭、OD等逆向程序,只能將其恢復成匯編代碼狀態(tài)宅静,然后通過讀匯編代碼來解讀程序的運行過程機制章蚣,當然,一些逆向工具提供的插件可以將一些函數恢復成偽代碼級別姨夹。
至此纤垂,我們把程序恢復成了可讀代碼,依靠閱讀這些代碼來梳理程序運行過程磷账,這叫做“靜態(tài)調試”峭沦。
與此對應的“動態(tài)調試”則是讓程序運行起來,更加直觀的觀察程序的運行過程逃糟。在動態(tài)調試中吼鱼,斷點起著很大的作用,使程序能夠暫停下來以觀察各寄存器狀態(tài)绰咽。
常用工具
靜態(tài)分析工具
(1)IDA Pro(Interactive Disassembler Professional )
IDA Pro是總部位于比利時列日市(Liège)的Hex-Rayd公司的一款產品菇肃。IDA 的主要目標之一,在于呈現盡可能接近源代碼的代碼,而且通過派生的變量和函數名稱來盡其所能地注釋生成的反匯編代碼,適用于三大主流操作 系統(tǒng):Microsoft Windows.Mac OS X 和 Linux。IDA Pro提供了許多強大功能取募,例如函數的交叉引用查看琐谤、函數執(zhí)行流程圖及偽代碼等,并且也有一定的動態(tài)調試功能玩敏。同時斗忌,IDA pro可以在windows质礼、linux、ios下進行二進制程序的動態(tài)調試和動態(tài)附加织阳,支持查看程序運行內存空間眶蕉,設置內存斷點和硬件斷點。
(2)c32asm
c32asm 是款非常好用的反匯編程序唧躲,具有反匯編模式和十六進制編輯模式造挽,能跟蹤exe文件的斷點,也可直接修改軟件內部代碼 惊窖,提供輸入表刽宪、輸出表、參考字符界酒、跳轉圣拄、調用、PE文件分析結果等顯示 毁欣,提供匯編語句逐字節(jié)分析功能庇谆,有助于分析花指令等干擾代碼。
(3)Win32Dasm
Win32dasm可以將應用程序靜態(tài)反編譯為WIN 32匯編代碼凭疮,利用Win32dasm我們可以對程序進行靜態(tài)分析饭耳,幫助快速找到程序的破解突破口。筆者下載的 Win32Dasm還可以附加到正在運行的進程执解,對進程進行動態(tài)調試寞肖,但如果原程序經過了加密變換處理或著是被EXE壓縮工具壓縮過,那么用Win32dasm對程序進行反匯編就沒有任何意義了衰腌。
(4)VB Decompiler pro
VB Decompiler pro是一個用來反編譯VB編寫的程序的工具新蟆。VB Decompiler反編譯成功后,能夠修改VB窗體的屬性右蕊,查看函數過程等 琼稻,VB Decompiler Pro 能反編譯Visual Basic 5.0/6.0的p-code形式的EXE, DLL 或 OCX文件。對native code形式的EXE, DLL或OCX文件饶囚,VB Decompiler Pro 也能給出反編譯線索帕翻。
動態(tài)分析工具
(1)Ollydbg
Ollydbg運行在windows平臺上,是 Ring 3級調試器萝风,可以對程序進行動態(tài)調試和附加調試嘀掸,支持對線程的調試同時還支持插件擴展功能, 它會分析函數過程规惰、循環(huán)語句睬塌、選擇語句、表[tables]、常量衫仑、代碼中的字符串、欺騙性指令堕花、API調用文狱、函數中參數的數目,import表等等 缘挽;支持調試標準動態(tài)鏈接庫(Dlls)瞄崇,目前已知 OllyDbg 可以識別 2300 多個 C 和 Windows API 中的常用函數及其使用的參數,是 Ring3級功能最強大的一款動態(tài)調試工具壕曼。
(2)Windbg
Windbg是Microsoft公司免費調試器調試集合中的GUI的調試器苏研,支持Source和Assembly兩種模式的調試。Windbg不僅可以調試應用程序腮郊,還可以 對內核進行調試摹蘑。結合Microsoft的Symbol Server,可以獲取系統(tǒng)符號文件轧飞,便于應用程序和內核的調試衅鹿。Windbg支持的平臺包括X86、IA64过咬、AMD64大渤。Windbg 安裝空間小,具有圖形操作界面掸绞,但其最強大的地方是有豐富的調試指令泵三。
輔助工具
系統(tǒng)監(jiān)視工具:
Wireshark ?(免費軟件,網絡監(jiān)視和包分析類軟件)
Outpost Firewall (共享軟件衔掸,使用hook技術的Windows防火墻)
ProcExp (免費軟件烫幕,強大的進程分析軟件)
FileMon (免費軟件,強大的文件讀寫監(jiān)視軟件)
RegMon (免費軟件具篇,強大的注冊表讀寫監(jiān)視軟件)
反保護工具:
LordPE (Win32 PE文件修改纬霞,轉存工具)
ImportREC (Win32 PE文件結構修復軟件)
AIl versions ASPack unpacker (免費軟件,ASPack壓縮殼脫殼工具)
UnPECompact(免費軟件驱显,PECompact壓縮殼脫殼工具)
UPX(自由軟件诗芜,UPX壓縮殼加殼和脫殼工具)
其它:
Hedit (共享軟件,16進制編輯器)
PEiD (免費較件埃疫,軟件信息和編寫語言分析工具)
crackme
crackme(通常簡稱CM)是用來測試程序設計人員的逆向工程技能的小程序伏恐。
KeygenMe、ReverseMe栓霜、UnpackMe翠桦,KeygenMe是要求別人做出程序對應的 keygen (序號產生器)。
ReverseMe 要求別人把它的算法做出逆向分析。
UnpackMe 是則是要求別人把它成功脫殼 销凑。
一些匯編知識
CPU大體上可以分為3個部分:
1.算術邏輯部件ALU(arithmetic logic unit)用來進行算術和邏輯運算丛晌。這部分與我們的關系不太大,我們沒必要管它斗幼。
2.控制邏輯澎蛛。同樣與我們的關系不大。
3.工作寄存器蜕窿,它在計算機中起著重要的作用谋逻,每一個寄存器相當于運算器中的一個存儲單元,但它的存取速度遠遠快于存儲器桐经。它用來存放計算過程中所需要的或所得到的各種信息毁兆,包括操作數地址、操作數及運算的中間結果等阴挣。
我們常說的32位气堕,就是說寄存器是32位的。
通用寄存器一共八個畔咧,分別是EAX送巡、EBX、ECX盒卸、EDX骗爆、ESP、EBP蔽介、EDI摘投、ESI。
其中虹蓄,EAX—EDX這四個寄存器又可稱為數據寄存器犀呼,除了直接訪問外,還可分別對其高十六位和低十六位進行訪問薇组。它們的低十六位就是把它們前邊兒的E去掉外臂,即EAX的低十六位就是AX。而且它們的低十六位又可以分別進行八位訪問律胀,也就是說宋光,AX還可以再進行分解,即AX還可分為AH(高八位)AL(低八位)炭菌。
這四個寄存器罪佳,主要就是用來暫時存放計算過程中所用的操作數、結果或其它信息黑低。
而ESP赘艳、EBP、EDI、ESI這四個寄存器的主要用途就是在存儲器尋址時蕾管,提供偏移地址枷踏,可以稱為指針或變址寄存器。
1. 通用寄存器:
AX (單字=16位) = AH + AL -> 其中’+’號并不代表把它們代數相加掰曾。AH和AL寄存器是相互獨立的呕寝,只不過都是AX寄存器的一部分,所以你改變AH或AL (或者都改變) 婴梧,AX寄存器也會被改變。
-> 'accumulator'(累加器): ? ? ? ? ? ? ? ? ? ? 用于進行數學運算
BX -> 'base'(基址寄存器): ? ? ? ? ? ? ? ? ? ? 用來連接棧(之后會說明)
CX -> 'counter'(計數器):
DX -> 'data'(數據寄存器): 大多數情況下用來存放數據
DI -> 'destination index'(目的變址寄存器): 例.? 將一個字符串拷貝到DI
SI -> 'source index'(源變址寄存器): 例.? 將一個字符串從SI拷貝
o2. 索引寄存器(指針寄存器):
BP -> 'base pointer'(基址指針寄存器): 表示棧區(qū)域的基地址
SP -> 'stack pointer'(棧指針寄存器): 表示棧區(qū)域的棧頂地址
o3. 段寄存器:
CS -> 'code segment'(代碼段寄存器): 用于存放應用程序代碼所在段的段基址
DS -> 'data segment'(數據段寄存器): 用于存放數據段的段基址
ES -> 'extra segment'(附加段寄存器): 用于存放程序使用的附加數據段的基地址
SS -> 'stack segment'(棧段寄存器): 用于存放棧段的段基址
o4. 指令指針寄存器:
IP -> 'instruction pointer'(指令指針寄存器): 指向下一個指令
API所用的數據客蹋,均是靠堆棧來傳送的塞蹭,即先將要傳送的數據壓入堆棧,然后CALL至API函數讶坯,API函數會在函數體內用出棧指令將相應的數據出棧番电。然后進行操作。
參考?