逆向技術分析基礎
原文地址:http://hi.baidu.com/wordsonwing/ ... 4d4488a977a4b3.html
逆向分析,是安全界永恆不變的主題, 就算未來世界是開源的. 也還是離不開逆向技術.
不管你是分析病毒,搞漏洞研究等等方面都離不開這. 逆向技術和腳本分析不一樣. 腳本分析是開源方面的, 至少你學一門腳本語言就可以馬上上手進行腳本漏洞發掘. 逆向技術需要的知識很廣,想要從那一片片二進制數據中找從脆弱的地方, 確實需要很大的努力. 至少你要對PE文件格式有所瞭解. 熟悉PE對你以後脫未知殼是很有幫助的.
我不建議一開始就學彙編. 彙編對大多數人來說確實是個很頭痛的東西. 裏面的至少太抽象了,對於初學者是很難理解的, 會使你喪失繼續學下去的興趣. 所以彙編這個東西等到以後進入這個門到後再系統的學習.
還有就是各種常用的API函數, 不說每個都要記到,至少你看到這個API函數名字會一下就瞭解到這個函數的作用. 瞭解一下數據結構也是很有必要的.
有人經常問我逆向分析和編程需要對數學很瞭解嗎~? 這個很不好回答. 畢竟現在和以前不一樣, 原來編程都是些數學家乾的事, 現在不一樣了. 但是最好對一些基本的東西要了解下. 不敢相信連數學都不會的人寫出來的程序是什麼樣子的, 尤其是算法. 還有些其他的東西,這裏不列舉了...
....... 看完上面,如果你下定決心了,繼續看下去吧...
剛開始學程序分析,沒必要一開始就搞複雜的,這容易把人的興趣給驅散掉....所以我用C++寫了個很簡單的程序來分析. 如果還是看不懂也沒事, 代碼的旁邊都有註釋的...
對照源代碼分析是很容易理解程序的流程的,,,,
代碼如下:
#include<iostream>
#include<windows.h>
#include<winsock.h> //包含的頭文件信息
#include<stdio.h>
#pragma comment(lib,"Ws2_32")
using namespace std; //標準名稱空間.
int main() //main是程序的主函數
{
int put=520; //定義變量,並且初始化爲520
printf("%d/n",put); //printf是C語言裏面的打印函數,這裏是把剛纔定義的put打印出來
return 0; //return是返回值,這裏返回0;
}
VC++6.0下把上面的代碼編譯. 程序的功能是把520打印出來
....生成的是debug版本, 便與調試... 用OD打開程序, OD停在入口處...
00408340 >/$ 55 push ebp
00408341 |. 8BEC mov ebp, esp
00408343 |. 6A FF push -1
00408345 |. 68 C0134300 push 004313C0
0040834A |. 68 60F44000 push _except_handler3 ; SE 處理程序安裝
0040834F |. 64:A1 0000000>mov eax, dword ptr fs:[0]
00408355 |. 50 push eax
00408356 |. 64:8925 00000>mov dword ptr fs:[0], esp //下面還有好多代碼省略...
...................
開始是裝載器加載些PE文件之類的信息,想了解系統底層的可以往下看,這裏就不分析了.
還是繼續我們的主題...
在離開始不遠處發現如下:
004083D4 |> /C745 FC 00000>mov dword ptr [ebp-4], 0
004083DB |. E8 00690000 call _ioinit
004083E0 |. FF15 60B14300 call dword ptr [<&KERNEL32.GetCommand>; [GetCommandLineA
....接着下面幾個連續的push. 可以推斷出mian函數離這不遠,果然在下面發現了:
00408416 |. 52 push edx
00408417 |. A1 40894300 mov eax, dword ptr [__argv]
0040841C |. 50 push eax
0040841D |. 8B0D 3C894300 mov ecx, dword ptr [__argc]
00408423 |. 51 push ecx
00408424 |. E8 E68BFFFF call 0040100F ;這裏就是main函數, F7進去
來到下面代碼:
00401030 >/> /55 push ebp ;保存EBP
00401031 |. 8BEC mov ebp, esp ;設置程序的基址寄存器
00401033 |. 83EC 44 sub esp, 44 ;開闢棧的空間
00401036 |. 53 push ebx ;壓棧保存
00401037 |. 56 push esi
00401038 |. 57 push edi
00401039 |. 8D7D BC lea edi, dword ptr [ebp-44]
0040103C |. B9 11000000 mov ecx, 11 ;設置ECX的值
00401041 |. B8 CCCCCCCC mov eax, CCCCCCCC
00401046 |. F3:AB rep stos dword ptr es:[edi] ;進行目標串的拷貝, 重複11次
00401048 |. C745 FC 08020>mov dword ptr [ebp-4], 208 ; 把16進制208壓入棧裏, 208就
;是10進制的520,就是我們剛纔處始化int變量的值
0040104F |. 8B45 FC mov eax, dword ptr [ebp-4]
00401052 |. 50 push eax ; /<%d> ;這裏push printf函數需要的參數
00401053 |. 68 1C104300 push 0043101C ; |format = "%d",LF,""
00401058 |. E8 03710000 call printf ; /printf ;調用printf函數;
在printf那個CALL上F8後,可以看到程序打印出來520 , 如圖:
[img]http://hiphotos.baidu.com/wordsonwing/pic/item/b32f76ef1e7c9c24adafd56f.jpg[img]