逆向技術分析基礎

逆向技術分析基礎

作者:Shminow
原文地址: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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章