久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞?lì)^條 >> 《逆向分析實(shí)戰(zhàn)》數(shù)據(jù)的存儲(chǔ)及表示形式
新聞資訊
NEWS INFORMATION

《逆向分析實(shí)戰(zhàn)》數(shù)據(jù)的存儲(chǔ)及表示形式

發(fā)布時(shí)間:2019-05-22

學(xué)習(xí)過計(jì)算機(jī)的讀者都知道,計(jì)算機(jī)中的各種數(shù)據(jù)都是以二進(jìn)制形式進(jìn)行存儲(chǔ)的,無論是文本文件、圖片文件,還是音頻文件、視頻文件、可執(zhí)行文件等,統(tǒng)統(tǒng)都是由二進(jìn)制文件存儲(chǔ)的。學(xué)習(xí)過計(jì)算機(jī)的讀者在學(xué)習(xí)計(jì)算機(jī)基礎(chǔ)的時(shí)候一定學(xué)習(xí)過進(jìn)制轉(zhuǎn)換,也一定學(xué)習(xí)過數(shù)據(jù)的表示方式等,大部分人在學(xué)習(xí)這部分知識(shí)時(shí)會(huì)覺得枯燥、無用,但是對(duì)于學(xué)習(xí)逆向知識(shí)和使用逆向工具,數(shù)據(jù)的存儲(chǔ)及表示形式是必須要掌握的。

本文借助OllyDbg這款調(diào)試工具來一起討論數(shù)據(jù)的存儲(chǔ)及表示形式,讓讀者對(duì)于學(xué)習(xí)計(jì)算機(jī)的數(shù)據(jù)存儲(chǔ)及表示可以更加的感性,從而脫離純粹理論性的學(xué)習(xí)。

本文內(nèi)容較為枯燥,但是著實(shí)是學(xué)習(xí)逆向的基礎(chǔ)知識(shí),對(duì)于從來沒有接觸過逆向或者是剛開始接觸逆向的讀者,本文內(nèi)容還是有一定幫助的。

本文關(guān)鍵字:進(jìn)制 數(shù)據(jù)表示 數(shù)據(jù)轉(zhuǎn)換 數(shù)據(jù)存儲(chǔ)

1.1 進(jìn)制及進(jìn)制的轉(zhuǎn)換

了解進(jìn)制的概念及進(jìn)制的轉(zhuǎn)換是學(xué)習(xí)逆向的基礎(chǔ),因?yàn)橛?jì)算機(jī)使用的進(jìn)制是二進(jìn)制,它又不同于我們現(xiàn)實(shí)生活中使用的十進(jìn)制,因此我們必須學(xué)習(xí)不同的進(jìn)制及進(jìn)制之間的轉(zhuǎn)換。

1.1.1 現(xiàn)實(shí)生活中的進(jìn)制與計(jì)算機(jī)的二進(jìn)制

我們?cè)诂F(xiàn)實(shí)生活中會(huì)接觸到多種多樣的進(jìn)制,通常見到的有十進(jìn)制、十二進(jìn)制和二十四進(jìn)制等。下面分別對(duì)這幾種進(jìn)制進(jìn)行舉例說明。

十進(jìn)制是每個(gè)人從上學(xué)就開始接觸和學(xué)習(xí)的進(jìn)制表示方法。所謂的十進(jìn)制,就是逢十進(jìn)一,最簡(jiǎn)單的例子就是9+1=10。這個(gè)無需過多解釋。

十二進(jìn)制也是我們?nèi)粘I钪谐R姷谋硎痉椒āK^的十二進(jìn)制,就是逢十二進(jìn)一,例如12個(gè)月為1年,13個(gè)月就是1年1個(gè)月。

二十四進(jìn)制也是我們?nèi)粘I钪谐R姷谋硎痉椒āK^的二十四進(jìn)制,就是逢二十四進(jìn)一,例如24小時(shí)為1天,25小時(shí)就是1天1小時(shí)。

介紹了以上現(xiàn)實(shí)生活中的例子后,我們?cè)賮碚f說計(jì)算機(jī)中的二進(jìn)制。根據(jù)前面各種進(jìn)制的解釋,我們可以想到,二進(jìn)制就是逢二進(jìn)一。這里舉個(gè)不太恰當(dāng)?shù)睦樱?斤就是1公斤。

在計(jì)算機(jī)中為什么使用二進(jìn)制呢?簡(jiǎn)單說就是計(jì)算機(jī)用高電平和低電平來表示1和0最為方便和穩(wěn)定,高電平被認(rèn)為是1,低電平被認(rèn)為是0,這就是所謂的二進(jìn)制的來源。

由于二進(jìn)制在閱讀上不方便,計(jì)算機(jī)又引入了十六進(jìn)制來直觀地表示二進(jìn)制。所謂的十六進(jìn)制,就是逢十六進(jìn)一。

因此在計(jì)算機(jī)中,我們常見的數(shù)據(jù)表示方法有二進(jìn)制、十進(jìn)制和十六進(jìn)制。

1.1.2 進(jìn)制的定義

在學(xué)習(xí)小學(xué)數(shù)學(xué)的時(shí)候我們就學(xué)習(xí)了十進(jìn)制,十進(jìn)制一共有十個(gè)數(shù)字,從0一直到9,9再往后數(shù)一個(gè)的時(shí)候要產(chǎn)生進(jìn)位,也就是逢十進(jìn)一。總結(jié)十進(jìn)制的定義則是,由0到9十個(gè)數(shù)字組成,并且逢十進(jìn)一。

舉一反一地來說,二進(jìn)制的定義是,由0到1兩個(gè)數(shù)字組成,逢二進(jìn)一。十六進(jìn)制的定義是由0到9十個(gè)數(shù)字和A到F六個(gè)字母組成,逢十六進(jìn)一。

由此,我們衍生出N進(jìn)制的定義是,由N個(gè)符號(hào)組成,逢N進(jìn)一。

表1-1所列為這三種進(jìn)制的數(shù)字表。

表1-1  二進(jìn)制、十進(jìn)制和十六進(jìn)制數(shù)字表

數(shù)  制             基  數(shù)                 數(shù)  字

二進(jìn)制                   2                               0 1

 

十進(jìn)制                    10                            0 1 2 3 4 5 6 7 8 9

 

 

十六進(jìn)制                    16                             0 1 2 3 4 5 6 7 8 9 A B C D E F

 

 

1.1.3 進(jìn)制的轉(zhuǎn)換

在逆向當(dāng)中,我們直接面對(duì)的通常是十六進(jìn)制,而由于很多原因,我們需要將其當(dāng)作十進(jìn)制或二進(jìn)制來查看,當(dāng)然也有可能需要根據(jù)二進(jìn)制轉(zhuǎn)換成十六進(jìn)制或十進(jìn)制。所以,我們就需要掌握進(jìn)制之間的轉(zhuǎn)換。

1.二進(jìn)制轉(zhuǎn)十進(jìn)制

二進(jìn)制整數(shù)的每個(gè)位都是2的冪次方,最低位是2的0次方,最高為是2的(N-1)次方,我們通過一個(gè)例子進(jìn)行說明。我們把二進(jìn)制數(shù)10010011轉(zhuǎn)換成十進(jìn)制數(shù),計(jì)算方式如下:

10010011 = 1 × 27+ 0 × 26+ 0 × 25+ 1 × 24+ 0 × 23+ 0 × 22+ 1 × 21+ 1 × 20 = 128 + 0 + 0 +16 + 0 + 0 + 2 + 1 = 147

我們得出的結(jié)果是,把二進(jìn)制10010011轉(zhuǎn)換成十進(jìn)制后是147。我們用計(jì)算機(jī)進(jìn)行驗(yàn)算,如圖1-1和圖1-2所示。

從圖1-1和圖1-2中可以看出,我們的計(jì)算結(jié)果是正確的,由此讀者在計(jì)算二進(jìn)制時(shí)按照上面轉(zhuǎn)換的例子進(jìn)行轉(zhuǎn)換即可。

圖1-1 驗(yàn)算二進(jìn)制(一)

圖1-2 驗(yàn)算二進(jìn)制(二)

2.十六進(jìn)制與二進(jìn)制的轉(zhuǎn)換

由于一個(gè)簡(jiǎn)單的數(shù)值用二進(jìn)制表示需要很長(zhǎng)的位數(shù),這樣對(duì)于閱讀很不方便,因此匯編和調(diào)試器常用十六進(jìn)制表示二進(jìn)制。十六進(jìn)制的每個(gè)位可以代表4個(gè)二進(jìn)制位,因?yàn)?的4次方剛好是16。這樣,在二進(jìn)制與十六進(jìn)制之間就產(chǎn)生了一個(gè)很好的對(duì)應(yīng)關(guān)系,如表1-2所列。

表1-2  二進(jìn)制對(duì)應(yīng)的十六進(jìn)制與十進(jìn)制數(shù)(節(jié)選)

根據(jù)此表,我們可以很快地把二進(jìn)制和十六進(jìn)制進(jìn)行轉(zhuǎn)換,把上例的二進(jìn)制10010011轉(zhuǎn)換成十六進(jìn)制,轉(zhuǎn)換過程如下:

第一步,把10010011從最低開始按每四位分為一組,不足四位前面補(bǔ)0,劃分結(jié)果為1001 0011;

第二步,把劃分好的組進(jìn)行查表,1001對(duì)應(yīng)十六進(jìn)制是9,0011對(duì)應(yīng)的十六進(jìn)制是3。

那么,二進(jìn)制10010011轉(zhuǎn)換成十六進(jìn)制后的值是93。讀者可以通過計(jì)算器自行進(jìn)行驗(yàn)算。

在逆向中常用的就是二進(jìn)制與十進(jìn)制的轉(zhuǎn)換,或者是二進(jìn)制與十六進(jìn)制的轉(zhuǎn)換,其他的轉(zhuǎn)換方式讀者可以自行查找資料進(jìn)行學(xué)習(xí)。關(guān)于十六進(jìn)制和二進(jìn)制需要記住的重要一點(diǎn)就是,一位十六進(jìn)制數(shù)可以表示四位二進(jìn)制數(shù)。

1.2 數(shù)據(jù)寬度、字節(jié)序和ASCII碼

前面介紹了計(jì)算機(jī)中常用的進(jìn)制表示方法和轉(zhuǎn)換,現(xiàn)在讀者知道了計(jì)算機(jī)存儲(chǔ)的都是二進(jìn)制的數(shù)據(jù),那么接下來要討論的是在計(jì)算機(jī)中數(shù)據(jù)存儲(chǔ)的單位以及數(shù)據(jù)是如何存儲(chǔ)在存儲(chǔ)空間的。

1.2.1 數(shù)據(jù)的寬度

數(shù)據(jù)的寬度是指數(shù)據(jù)在存儲(chǔ)器中存儲(chǔ)的尺寸。在計(jì)算機(jī)中,所有數(shù)據(jù)的基本存儲(chǔ)單位都是字節(jié)(byte),每個(gè)字節(jié)占8個(gè)位(位是計(jì)算機(jī)存儲(chǔ)的最小單位,而不是基本單位,因?yàn)樵诖鎯?chǔ)數(shù)據(jù)時(shí)幾乎沒有按位進(jìn)行存儲(chǔ)的)。其他的存儲(chǔ)單位還有字(word)、雙字(dword)和八字節(jié)(qword)。

 

圖1-3 給出各個(gè)存儲(chǔ)單位所包含的位數(shù)。

在計(jì)算機(jī)編程中,常用的幾個(gè)重要數(shù)據(jù)存儲(chǔ)單位分別就是byte、word和dword,這幾個(gè)存儲(chǔ)單位稍后我們會(huì)使用到。

1.2.2 數(shù)值的表示范圍

在計(jì)算機(jī)中存儲(chǔ)數(shù)值時(shí),也是要依據(jù)前面介紹過的數(shù)據(jù)寬度進(jìn)行存儲(chǔ)的,那么在存儲(chǔ)數(shù)據(jù)時(shí)由于存儲(chǔ)數(shù)據(jù)的寬度限制,數(shù)值的表示也是有范圍限制的。那么byte、word和dword能存儲(chǔ)多少數(shù)據(jù)呢?我們先來計(jì)算一下,如果按位存儲(chǔ)的話,能存儲(chǔ)多少個(gè)數(shù)據(jù),再分別來計(jì)算以上三種單位能夠存儲(chǔ)的數(shù)值的范圍。

計(jì)算機(jī)使用二進(jìn)制進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),一位二進(jìn)制最多能表示幾個(gè)數(shù)呢?因?yàn)槭嵌M(jìn)制數(shù),只存在0和1兩個(gè)數(shù),所以一位二進(jìn)制數(shù)最多能表示兩個(gè)數(shù),分別是0和1。那么,兩位二進(jìn)制最多能表示幾個(gè)數(shù)呢?因?yàn)橐晃欢M(jìn)制數(shù)能表示兩個(gè)數(shù),所以兩位二進(jìn)制數(shù)則能表示2的2次方個(gè)數(shù),即4個(gè)數(shù),分別是0、1、10、11。進(jìn)一步地,三位二進(jìn)制數(shù)能表示的就是2的3次方個(gè)數(shù),即8個(gè)數(shù),分別是0、1、10、11、100、101、110、111。

上面的過程可以整理成表1-3。

表1-3  N位二進(jìn)制位能夠表示的數(shù)

二進(jìn)制位數(shù)     表示數(shù)的個(gè)數(shù)   表示的數(shù)                                  2的N次方

1                          2                    0、1                                     2的1次方

2                          4                  0、1、10、11                          2的2次方

3                           8             0、1、10、11、100、101、110、111  2的3次方

根據(jù)表1-3計(jì)算的byte、word和dword三種數(shù)據(jù)存儲(chǔ)寬度能表示的數(shù)據(jù)的范圍如表1-4所列。

表1-4  無符號(hào)整數(shù)的表示范圍

存儲(chǔ)單位     十進(jìn)制范圍       十六進(jìn)制范圍            2的N次方

byte                0~255              0~FF                     2的8次方

word               0~65535         0~FFFF                2的16次方

dword           0~FFFFFFFF                                    2的32次方

 

2的8次方是256,為什么數(shù)值只有0~255個(gè)呢?因?yàn)橛?jì)算機(jī)計(jì)數(shù)是從0開始,從0到255同樣是256個(gè)數(shù),這里的2的8次方表示能夠表示數(shù)值的個(gè)數(shù),而不是能夠表示數(shù)值的最大的數(shù)。

所以

0001    是2的零次方,為1

0010    是二的1次方 ,為2(2^1)

0100    是二的平方(2次方),為4(2^2)

1000     是二的立方(3次方),為8(2^3)

即8 4 2 1 計(jì)算就很方便了  1111H即8+4+2+1為15,對(duì)應(yīng)16進(jìn)制為F

1.2.3 字節(jié)序

字節(jié)序也稱為字節(jié)順序,在計(jì)算機(jī)中對(duì)數(shù)值的存儲(chǔ)有一定的標(biāo)準(zhǔn),而該標(biāo)準(zhǔn)隨著系統(tǒng)架構(gòu)的不同而不同。了解字節(jié)存儲(chǔ)順序?qū)τ谀嫦蚬こ淌且豁?xiàng)基礎(chǔ)知識(shí),在動(dòng)態(tài)分析程序的時(shí)候,往往需要觀察內(nèi)存數(shù)據(jù)的變化情況,這就需要我們?cè)谡莆諗?shù)據(jù)的存儲(chǔ)寬度、范圍之后,進(jìn)一步了解字節(jié)順序。

通常情況下,數(shù)值在內(nèi)存中存儲(chǔ)的方式有兩種,一種是大尾方式,另一種是小尾方式。關(guān)于字節(jié)序的知識(shí),通過一個(gè)簡(jiǎn)單的例子就可以掌握。

比如有0x01020304(C語言中對(duì)十六進(jìn)制數(shù)的表示方式)這樣一個(gè)數(shù)值,如果用大尾方式存儲(chǔ),其存儲(chǔ)方式為01 02 03 04,而用小尾方式進(jìn)行存儲(chǔ)則是04 03 02 01,用更直觀的方式展示其區(qū)別,如表1-5所列。

表1-5  字節(jié)順序?qū)Ρ缺?/p>

 

從兩個(gè)地址列可以看出,地址的值都是一定的,沒有變化,而數(shù)據(jù)的存儲(chǔ)順序卻是不相同的。從表中可以得到如下結(jié)論。

大尾存儲(chǔ)方式:內(nèi)存高位地址存放數(shù)據(jù)低位字節(jié)數(shù)據(jù),內(nèi)存低位地址存放數(shù)據(jù)高位字節(jié)數(shù)據(jù);

小尾存儲(chǔ)方式:內(nèi)存高位地址存放數(shù)據(jù)高位字節(jié)數(shù)據(jù),內(nèi)存低位地址存放數(shù)據(jù)低位字節(jié)數(shù)據(jù)。

通常情況下,Windows操作系統(tǒng)兼容的CPU為小尾存儲(chǔ)方式,而Unix操作系統(tǒng)兼容的CPU多為大尾存儲(chǔ)方式。在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)的字節(jié)順序使用的是大尾存儲(chǔ)方式。

首先,為什么會(huì)有小端字節(jié)序?

答案是,計(jì)算機(jī)電路先處理低位字節(jié),效率比較高,因?yàn)橛?jì)算都是從低位開始的。所以,計(jì)算機(jī)的內(nèi)部處理都是小端字節(jié)序。

但是,人類還是習(xí)慣讀寫大端字節(jié)序。所以,除了計(jì)算機(jī)的內(nèi)部處理,其他的場(chǎng)合幾乎都是大端字節(jié)序,比如網(wǎng)絡(luò)傳輸和文件儲(chǔ)存。

計(jì)算機(jī)處理字節(jié)序的時(shí)候,不知道什么是高位字節(jié),什么是低位字節(jié)。它只知道按順序讀取字節(jié),先讀第一個(gè)字節(jié),再讀第二個(gè)字節(jié)。

如果是大端字節(jié)序,先讀到的就是高位字節(jié),后讀到的就是低位字節(jié)。小端字節(jié)序正好相反。

理解這一點(diǎn),才能理解計(jì)算機(jī)如何處理字節(jié)序。

字節(jié)序的處理,就是一句話:

"只有讀取的時(shí)候,才必須區(qū)分字節(jié)序,其他情況都不用考慮。"

處理器讀取外部數(shù)據(jù)的時(shí)候,必須知道數(shù)據(jù)的字節(jié)序,將其轉(zhuǎn)成正確的值。然后,就正常使用這個(gè)值,完全不用再考慮字節(jié)序。

即使是向外部設(shè)備寫入數(shù)據(jù),也不用考慮字節(jié)序,正常寫入一個(gè)值即可。外部設(shè)備會(huì)自己處理字節(jié)序的問題。

6.

舉例來說,處理器讀入一個(gè)16位整數(shù)。如果是大端字節(jié)序,就按下面的方式轉(zhuǎn)成值。


x = buf[offset] * 256 + buf[offset+1];

上面代碼中,buf是整個(gè)數(shù)據(jù)塊在內(nèi)存中的起始地址,offset是當(dāng)前正在讀取的位置。第一個(gè)字節(jié)乘以256,再加上第二個(gè)字節(jié),就是大端字節(jié)序的值,這個(gè)式子可以用邏輯運(yùn)算符改寫。


x = buf[offset]<<8 | buf[offset+1];

上面代碼中,第一個(gè)字節(jié)左移8位(即后面添8個(gè)0),然后再與第二個(gè)字節(jié)進(jìn)行或運(yùn)算。

如果是小端字節(jié)序,用下面的公式轉(zhuǎn)成值。


x = buf[offset+1] * 256 + buf[offset];

32位整數(shù)的求值公式也是一樣的。


/* 大端字節(jié)序 */
i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

/* 小端字節(jié)序 */
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

1.2.4 ASCII碼

計(jì)算機(jī)智能存儲(chǔ)二進(jìn)制數(shù)據(jù),那么計(jì)算機(jī)是如何存儲(chǔ)字符的呢?為了存儲(chǔ)字符,計(jì)算機(jī)必須支持特定的字符集,字符集的作用是將字符映射為整數(shù)。早期字符集僅僅使用8個(gè)二進(jìn)制數(shù)據(jù)位進(jìn)行存儲(chǔ),即ASCII碼。后來,由于全世界語言的種類繁多,又產(chǎn)生了新的字符集Unicode字符編碼。

ASCII碼是美國標(biāo)準(zhǔn)信息交換碼的字母縮寫,在ASCII字符集中,每個(gè)字符由唯一的7位整數(shù)表示。ASCII碼僅使用了每個(gè)字節(jié)的低7位,最高位被不同計(jì)算機(jī)用來創(chuàng)建私有字符集。由于標(biāo)準(zhǔn)ASCII碼僅使用7位,因此十進(jìn)制表示范圍是0~127共128個(gè)字符。

在編程與逆向中都會(huì)用到ASCII碼,因此有必要記住常用的ASCII字符對(duì)應(yīng)的十六進(jìn)制和十進(jìn)制數(shù)。常用的ASCII字符如表1-6所列。

表1-6  常用ASCII碼表

字  符       十進(jìn)制      十六進(jìn)制         說  明

LF                   10            0AH                  換行

CR                 13               0DH                回車

SP                 32                 20H                空格

0~9           48~57        30H~39H          數(shù)字

A~Z            65~90          41H~5AH           大寫字母

a~z             97~122         61H~7AH         小寫字母

表1-6是經(jīng)常使用到的ASCII字符,這些字符是經(jīng)常會(huì)見到和用到的,希望讀者能將其保存,以便使用之時(shí)可以快速查閱。

Unicode編碼是為了使字符編碼更進(jìn)一步符合國際化而進(jìn)行的擴(kuò)展,Unicode使用一個(gè)字(也就是兩個(gè)字節(jié),即16位)來表示一個(gè)字符。這里不做過多的介紹。

1.3 在OD中查看數(shù)據(jù)

在逆向分析中,調(diào)試工具可以說是非常重要的。調(diào)試器能夠跟蹤一個(gè)進(jìn)程的運(yùn)行時(shí)狀態(tài),在逆向分析中稱為動(dòng)態(tài)分析工具。動(dòng)態(tài)調(diào)試會(huì)用在很多方面,比如漏洞的挖掘、游戲外掛的分析、軟件加密解密等方面。本節(jié)介紹應(yīng)用層下最流行的調(diào)試工具OllyDbg。

OllyDbg簡(jiǎn)稱OD,是一款具有可視化界面的運(yùn)行在應(yīng)用層的32位的反匯編逆向調(diào)試分析工具。OD是所有進(jìn)行逆向分析人員都離不開的工具。它的流行,主要原因是操作簡(jiǎn)單、參考文檔豐富、支持插件功能等。

熟悉OD

OD的操作非常簡(jiǎn)單,但是由于逆向是一門實(shí)戰(zhàn)性和綜合性非常強(qiáng)的技術(shù),因此要真正熟練掌握OD的使用卻并不是容易的事,單憑操作而言看似沒有太多的技術(shù)含量,但是其真正的精髓在于配合逆向的思路來達(dá)到逆向者的目的。

1.OD的選型

為什么先介紹OD的選型,而不直接開始介紹OD的使用呢?OD的主流版本是1.10和待崛起的2.0。雖然它的主流版本是1.10,但是它仍然存在很多修改版。所謂修改版,就是由用戶自己對(duì)OD進(jìn)行修改而產(chǎn)生的,類似于病毒的免殺。OD雖然是動(dòng)態(tài)調(diào)試工具,但是由于其強(qiáng)大的功能經(jīng)常被很多人用在軟件破解等方面,導(dǎo)致很多作者的心血付諸東流。軟件的作者為了防止軟件被OD調(diào)試,加入了很多專門針對(duì)OD進(jìn)行調(diào)試的反調(diào)試功能來保護(hù)自

己的軟件不被調(diào)試,從而不被破解;而破解者為了能夠繼續(xù)使用OD來破解軟件,則不得不對(duì)OD進(jìn)行修改,從而達(dá)到反反調(diào)試的效果。

調(diào)試、反調(diào)試、反反調(diào)試,對(duì)于新接觸調(diào)試的愛好者來說容易混淆。簡(jiǎn)單來說,反調(diào)試是阻止使用OD進(jìn)行調(diào)試,而反反調(diào)試是突破反調(diào)試?yán)^續(xù)進(jìn)行調(diào)試。OD的修改版本之所以很多,目的就是為了能夠更好地突破軟件的反調(diào)試功能。

因此,如果從學(xué)習(xí)的角度來講,建議選擇原版的OD進(jìn)行使用。在使用的過程中,除了會(huì)掌握很多調(diào)試技巧外,還會(huì)學(xué)到很多反調(diào)試的技巧,從而掌握反反調(diào)試的技巧。如果在實(shí)際的應(yīng)用中,則可以直接使用修改版的OD,避免OD被軟件反調(diào)試,從而提高逆向調(diào)試分析的速度。

2.熟悉OD主界面

OD的發(fā)行是一個(gè)壓縮包,解壓即可運(yùn)行使用,運(yùn)行OD解壓目錄總的ollydbg.exe程序,就會(huì)出現(xiàn)一個(gè)分布恰當(dāng)、有菜單有面板和能輸入命令的看著很強(qiáng)大的軟件窗口,如圖1-4所示。

在圖1-4的OD調(diào)試主窗口中的工作區(qū)大致可以分為6個(gè)部分,按照從左往右、從上往下,這6部分分別是反匯編窗口、信息提示窗口、數(shù)據(jù)窗口、寄存器窗口、棧窗口和命令窗口。下面分別介紹各個(gè)窗口的用法。

反匯編窗口:該窗口用于顯示反匯編代碼,調(diào)試分析程序主要在這個(gè)窗口中進(jìn)行,這也是進(jìn)行調(diào)試分析的主要工作窗口。

信息提示窗口:該窗口用于顯示與反匯編窗口中上下文環(huán)境相關(guān)的內(nèi)存、寄存器或跳轉(zhuǎn)來源、調(diào)用來源等信息。

數(shù)據(jù)窗口:該窗口用于以多種格式顯示內(nèi)存中的內(nèi)容,可使用的格式有Hex、文本、短型、長(zhǎng)型、浮點(diǎn)、地址和反匯編等。

寄存器窗口:該窗口用于顯示各個(gè)寄存器的內(nèi)容,包括前面介紹的通用寄存器、段寄存器、標(biāo)志寄存器、浮點(diǎn)寄存器。另外,還可以在寄存器窗口中的右鍵菜單選擇顯示MMX寄存器、3DNow!寄存器和調(diào)試寄存器等。

棧窗口:該窗口用于顯示棧內(nèi)容、棧幀,即ESP或EBP寄存器指向的地址部分。

命令窗口:該窗口用于輸入命令來簡(jiǎn)化調(diào)試分析的工作,該窗口并非基本窗口,而是由OD的插件提供的功能,由于幾乎所有的OD使用者都會(huì)使用該插件,因此有必要把它也列入主窗口中。

 

 

圖1-4 OD調(diào)試主窗口

3.在數(shù)據(jù)窗口中查看數(shù)據(jù)

前面已經(jīng)介紹,OD是一款應(yīng)用層下的調(diào)試工具,它除了可以進(jìn)行軟件的調(diào)試以外,還可以幫助我們學(xué)習(xí)前面介紹的數(shù)據(jù)寬度、進(jìn)制轉(zhuǎn)換等知識(shí),而且能夠幫助我們學(xué)習(xí)匯編語言。本節(jié)主要介紹通過OD的數(shù)據(jù)窗口來觀察數(shù)據(jù)寬度。

為了能夠直觀地觀察內(nèi)存中的數(shù)據(jù),我們通過RadAsm創(chuàng)建一個(gè)沒有資源的匯編工程,然后編寫一段自己的匯編代碼,代碼如下:

.386

.modelflat,stdcall

optioncasemap:none

includewindows.inc

includekernel32.inc

includelibkernel32.lib

.data

var1dd00000012h;16進(jìn)制

var2dd12;10進(jìn)制

var3dd11b;2進(jìn)制

;字節(jié)

b1db11h;16進(jìn)制

b2db22h

b3db33h

b4db44h

;字

w1dw5566h;16進(jìn)制

w2dw7788h

;雙字

ddd12345678h;16進(jìn)制

.code

start:

invokeExitProcess,0

endstart

在上面的代碼中,定義了10個(gè)全局變量。首先,var1、var2和var3分別定義了dword類型的3個(gè)變量,其中var1的值是十六進(jìn)制的12h,var2的值是十進(jìn)制的12,var3的值是2進(jìn)制的11b。b1到b4四個(gè)變量是字節(jié)類型的,w1和w2兩個(gè)變量是字類型的,d變量是dword類型的。

這10個(gè)全局變量就是我們要考察的關(guān)鍵。在RadAsm中進(jìn)行編譯連接后,直接按下Ctrl + D這個(gè)快捷鍵,即可在RadAsm安裝時(shí)自帶的OD中打開。在OD調(diào)試器中打開該程序后,觀察它的數(shù)據(jù)窗口(如圖1-5所示)。

 

 

圖1-5 數(shù)據(jù)窗口中查看變量

在圖1-5中,數(shù)據(jù)窗口一共有3列,分別是地址列、HEX數(shù)據(jù)列和ASCII列。這3個(gè)列,可以通過單擊鼠標(biāo)右鍵來改變現(xiàn)實(shí)方式和顯示的列數(shù)。在地址00403000處開始的4個(gè)字節(jié)12 00 00 00是十六進(jìn)制的12,也就是在匯編代碼中定義的var1;在地址00403004處的4個(gè)字節(jié)0C 00 00 00是十六進(jìn)制0C,也就是在匯編代碼中定義的var2,var2變量定義的值是十進(jìn)制的12,也就是十六進(jìn)制的0C;在地址00403008處的4個(gè)字節(jié)03 00 00 00是十六進(jìn)制的03,也就是在匯編代碼中定義的var3,var3變量定義的值是2進(jìn)制的11,也就是十六進(jìn)制的03。

這3個(gè)變量在我們定義的時(shí)候都是以dd進(jìn)行的,都是dword類型的變量,分別各占用4字節(jié),因此在內(nèi)存中,前3個(gè)變量分別是12 00 00 00、0C 00 00 00和03 00 00 00。

在地址0040300C處的值是11 22 33 44,這4個(gè)值分別是我們定義b1、b2、b3和b4 4個(gè)字節(jié)型的變量,這4變量按照內(nèi)存由低到高的順序顯示分別是11、22、33、44。

在地址00403010處顯示的值是66 55 88 77,這4個(gè)值分別對(duì)應(yīng)我們定義的w1和w2兩個(gè)字型變量,但是我們定義的變量w1的值是5566h,w2的值是7788h,在內(nèi)存中為何顯示的是6655和8877呢?這就是我們提到過的字節(jié)順序的問題。我們的主機(jī)采用的是小尾方式存儲(chǔ)的數(shù)據(jù),也就是數(shù)據(jù)的低位存放在內(nèi)存的低地址中,數(shù)據(jù)的高位存放在內(nèi)存的高地址中,因此在地址00403020中存放的是5566H的低位數(shù)據(jù)66,在地址00403021中存放的是5566H的高位數(shù)據(jù)55,在內(nèi)存看時(shí),順序是相反的。

在地址00403014處存放的是78 56 34 12,這是我們定義的最后一個(gè)變量d,它也是按照小尾方式存儲(chǔ)在內(nèi)存中的。因此,在查看內(nèi)存時(shí)順序也是反的。

OD提供了多種查看內(nèi)存數(shù)據(jù)的方式,通過在數(shù)據(jù)窗口中單擊鼠標(biāo)右鍵,會(huì)彈出如圖1-6所示菜單。

當(dāng)在數(shù)據(jù)窗口中選擇數(shù)據(jù)時(shí),右鍵的菜單提供編輯、賦值、查找、斷點(diǎn)功能,如圖1-7所示。

 

 

圖1-6 查看數(shù)據(jù)方式的菜單選項(xiàng)

 

 

圖1-7 OD中對(duì)數(shù)據(jù)操作的菜單

4.通過命令窗口改變數(shù)據(jù)窗口顯示方式

在圖1-4中的最下方可以看到有一個(gè)輸入命令的編輯框,在此處可以輸入OD的相關(guān)命令以提高調(diào)試的速度。本小節(jié)就介紹如果通過命令窗口來改變數(shù)據(jù)窗口的顯示方式。

在上面代碼中定義變量時(shí),使用了db、dw和dd三種類型,在OD的命令窗口中也同樣可以使用者3個(gè)命令,其格式分別如表1-7所列。

表1-7  命令窗口改變數(shù)據(jù)顯示命令格式

命  令            格  式          說  明                          舉  例

db                     db address       按字節(jié)的方式查看           db 403000

dw                    dw address        按字的方式查看              dw 403000

dd                     dd address       按雙字的方式查看              dd 403000

將表1-7中的命令在命令窗口中進(jìn)行輸入,數(shù)據(jù)窗口的變化和數(shù)值顯示的變化分別如圖1-8、圖1-9和圖1-10所示。

 

 

圖1-8 dd命令顯示的數(shù)據(jù)窗口

 

 

圖1-9 dw命令顯示的數(shù)據(jù)窗口

 

 

圖1-10 db命令顯示的數(shù)據(jù)窗口

從圖中可以看出不同方式下數(shù)據(jù)窗口顯示的樣式,但是無論使用哪種方式顯示數(shù)據(jù),地址列總是會(huì)顯示在最前面的,只要我們知道數(shù)據(jù)的地址,就可以直接在命令窗口中輸入顯示數(shù)據(jù)的格式來查看指定內(nèi)存中的數(shù)據(jù)。

1.4 編程判斷主機(jī)字符序

編程判斷主機(jī)字節(jié)序是更進(jìn)一步掌握字節(jié)序的方式,本小節(jié)給出兩種對(duì)主機(jī)的字節(jié)序進(jìn)行判斷的方式。

1.4.1 字節(jié)序相關(guān)函數(shù)

在TCP/IP網(wǎng)絡(luò)編程中會(huì)涉及關(guān)于字節(jié)序的函數(shù),TCP/IP協(xié)議中傳遞數(shù)據(jù)是以網(wǎng)絡(luò)字節(jié)序進(jìn)行傳輸?shù)模W(wǎng)絡(luò)字節(jié)序是指網(wǎng)絡(luò)傳輸相關(guān)協(xié)議所規(guī)定的字節(jié)傳輸?shù)捻樞颍琓CP/IP協(xié)議所使用的網(wǎng)絡(luò)字節(jié)序與大尾方式相同。而主機(jī)字節(jié)序包含大尾方式與小尾方式,因此在進(jìn)行網(wǎng)絡(luò)傳輸時(shí)會(huì)進(jìn)行相應(yīng)的判斷,如果主機(jī)字節(jié)序是大尾方式則無需進(jìn)行轉(zhuǎn)換即可傳輸,如果主機(jī)字節(jié)序是小尾方式則需要轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序(也就是轉(zhuǎn)換成大尾方式)然后進(jìn)行傳輸。

常用的字節(jié)序涉及的函數(shù)有如下幾個(gè):

u_short?htons(u_short?hostshort);

u_long?htonl(u_long?hostlong);

u_short?ntohs(u_short?netshort);

u_long?ntohl(u_long?netlong);

在這4個(gè)函數(shù)中,前兩個(gè)是將主機(jī)字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序,后兩個(gè)是將網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機(jī)字節(jié)序。關(guān)于更多的字節(jié)序的函數(shù)可參考MSDN。

1.4.2 編程判斷主機(jī)字節(jié)序

“編程判斷主機(jī)字節(jié)序”是很多殺毒軟件公司或者安全開發(fā)職位的一道面試題,因?yàn)檫@個(gè)題目比較基礎(chǔ)。通過前面的知識(shí),相信讀者能夠很容易地實(shí)現(xiàn)該程序。這里給出筆者自己對(duì)于該題目的實(shí)現(xiàn)方法。筆者認(rèn)為,完成該題目有兩種方法,第一種方法是“取值比較法”,第二種方法是“直接轉(zhuǎn)換比較法”。

1.取值比較法

所謂取值比較法,是首先定義一個(gè)4字節(jié)的十六進(jìn)制數(shù)。因?yàn)槭褂谜{(diào)試器查看內(nèi)存最直觀的就是十六進(jìn)制,所以定義十六進(jìn)制數(shù)是一個(gè)操作起來比較直觀的方法。而后通過指針方式取出這個(gè)十六進(jìn)制數(shù)在“內(nèi)存”中的某一個(gè)字節(jié),最后與實(shí)際數(shù)值中相對(duì)應(yīng)的數(shù)進(jìn)行比較。

由于字節(jié)序的原因,內(nèi)存中的某字節(jié)與實(shí)際數(shù)值中對(duì)應(yīng)的字節(jié)可能不相同,這樣就可以確定字節(jié)序了。

代碼如下:

#include

#include

intmain(intargc,char*argv[])

{

DWORDdwSmallNum=0x01020304;

if(*(BYTE*)&dwSmallNum==0x04)

{

printf("SmallSequence.");

}

else

{

printf("BigSequence.");

}

return0;

}

以上代碼中,定義了0x01020304這個(gè)十六進(jìn)制數(shù),其在小尾方式內(nèi)存中的存儲(chǔ)順序?yàn)?4 03 02 01。取(BYTE)&dwSmallNum內(nèi)存中的低地址位的值,如果是小尾方式的話,那么低地址存儲(chǔ)的值為0x04;如果是大尾方式的話,則低地址存儲(chǔ)的值為0x01。

2.直接轉(zhuǎn)換比較法

所謂直接轉(zhuǎn)換比較法,是利用字節(jié)序轉(zhuǎn)換函數(shù)將所定義的值進(jìn)行轉(zhuǎn)換,然后用轉(zhuǎn)換后的值與原值進(jìn)行比較。如果原值與轉(zhuǎn)換后的值相同,說明是大尾方式,否則為小尾方式。

代碼如下:

#include

#include

#pragmacomment(lib,"ws2_32")

intmain(intargc,char*argv[])

{

DWORDdwSmallNum=0x01020304;

if(dwSmallNum==htonl(dwSmallNum))

{

printf("SmallSequence.");

}

else

{

printf("BigSequence.");

}

return0;

}

這種方式比較直接,其前提是網(wǎng)絡(luò)字節(jié)序是固定的,就是大尾方式。因?yàn)槭潜容^,所以就要有一個(gè)參照物。如果原值轉(zhuǎn)換后的結(jié)果與原值相同,就說明該主機(jī)是大尾方式存儲(chǔ),反之則是小尾方式。

1.5 總結(jié)

本文對(duì)內(nèi)存中存儲(chǔ)基礎(chǔ)數(shù)據(jù)的方式進(jìn)行了闡述,并且在最后部分介紹了如何使用OD調(diào)試器來查看內(nèi)存中的數(shù)據(jù)。在學(xué)習(xí)編程時(shí),都會(huì)從數(shù)據(jù)類型開始介紹,不同的數(shù)據(jù)類型都是以二進(jìn)制的方式存儲(chǔ)在內(nèi)存中的,只是它們存儲(chǔ)的方式不同,或者是存儲(chǔ)的寬度不同。在我們學(xué)習(xí)逆向時(shí),也首先講解了數(shù)據(jù)的基礎(chǔ)及數(shù)據(jù)的存儲(chǔ)方式。

什么是“軟件逆向工程”

術(shù)語“逆向工程”源自硬件領(lǐng)域,在軟件領(lǐng)域目前還沒有明確的定義。就筆者個(gè)人的理解簡(jiǎn)單來說,軟件逆向是通過觀察分析軟件或程序的行為、數(shù)據(jù)和代碼等,來還原其設(shè)計(jì)實(shí)現(xiàn),或者推導(dǎo)出更高抽象層次的表示。

軟件工程與軟件逆向工程的區(qū)別

對(duì)于軟件工程而言,軟件的設(shè)計(jì)講究封裝,將各個(gè)模塊進(jìn)行封裝,將具體的實(shí)現(xiàn)進(jìn)行隱藏,只暴露一個(gè)接口給使用者。對(duì)于模塊的使用者而言,封裝好的模塊相當(dāng)于一個(gè)“黑盒子”,使用者使用“盒子”時(shí),無需關(guān)心“盒子”的內(nèi)部實(shí)現(xiàn),只需要按照模塊預(yù)留的接口進(jìn)行使用即可。

軟件逆向工程對(duì)于軟件工程而言,卻是正好相反的。對(duì)軟件進(jìn)行逆向工程時(shí)要查看軟件的行為,即軟件的輸入與輸出的情況;要查看軟件的文件列表,即軟件使用了哪些動(dòng)態(tài)鏈接庫(哪些動(dòng)態(tài)連接庫是作者編寫的,哪些動(dòng)態(tài)連接庫是系統(tǒng)提供的),有哪些配置文件,甚至還要通過一系列的工具查看軟件的文件結(jié)構(gòu)、反匯編代碼等。

對(duì)比軟件工程與軟件逆向工程可以發(fā)現(xiàn),軟件工程是在封裝、實(shí)現(xiàn)一個(gè)具備某種功能的“黑盒子”,而軟件逆向工程則是在分析“黑盒子”并嘗試還原封裝的實(shí)現(xiàn)與設(shè)計(jì)。后者對(duì)于前者而言是一個(gè)相反的過程,因此稱為“軟件逆向工程”。

學(xué)習(xí)軟件逆向工程與軟件工程的區(qū)別

對(duì)于軟件逆向工程而言,學(xué)習(xí)逆向知識(shí),除了要學(xué)習(xí)逆向知識(shí)本身外,還需要掌握各種不同的逆向工具,或者說逆向知識(shí)中重要的一個(gè)環(huán)節(jié)就是逆向工具的使用。對(duì)于軟件開發(fā)而言,軟件開發(fā)工具在軟件開發(fā)中所占據(jù)的位置遠(yuǎn)遠(yuǎn)達(dá)不到逆向工具在逆向領(lǐng)域中的位置。因此,讀者在學(xué)習(xí)編程時(shí)可能更注重的是編程語言本身而不是工具,但是在學(xué)習(xí)逆向時(shí),逆向知識(shí)是不可能拋開逆向工具而獨(dú)立進(jìn)行學(xué)習(xí)的。

 

 
 
 
 
 
 
 
 

 

聯(lián)系方式0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區(qū)桃源街道平山社區(qū)平山一路2號(hào)南山云谷創(chuàng)業(yè)園二期11棟410-411

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
阿v天堂2018| 波多野结衣50连登视频| 国产v亚洲v天堂无码久久久| 黄色三级中文字幕| 九九爱精品视频| 国产极品尤物在线| 日韩欧美一区三区| 大香煮伊手机一区| 中文字幕亚洲乱码| 九一精品久久久| 99久re热视频精品98| 97超碰在线视| 日韩欧美视频网站| 91色国产在线| 91手机视频在线| www.射射射| av丝袜天堂网| 成人在线观看毛片| 91视频 -- 69xx| 亚洲天堂国产视频| 成年人深夜视频| 手机在线看福利| 国产免费色视频| www黄色日本| 日本高清免费观看| 免费看欧美一级片| 波多结衣在线观看| 日本天堂免费a| www.色偷偷.com| 男人的天堂视频在线| 久草资源站在线观看| 91看片破解版| 久久综合九色综合88i| www.日本一区| 春日野结衣av| www.-级毛片线天内射视视| 116极品美女午夜一级| 亚洲理论中文字幕| 国产精品天天av精麻传媒| 青青草影院在线观看| 国产三级日本三级在线播放| 免费看毛片的网址| 国产又爽又黄ai换脸| 久久黄色免费看| 131美女爱做视频| 波多野结衣三级在线| 动漫av免费观看| 久久免费视频3| 久草视频这里只有精品| www.成年人| 手机免费看av网站| 天天爱天天操天天干| 国产二区视频在线播放| 阿v天堂2018| 国产精品久久国产| av一区二区三区免费观看| 99久久99精品| 精品国产乱码久久久久久1区二区| 一本久道综合色婷婷五月| av动漫在线看| 国产精品秘入口18禁麻豆免会员| www.在线观看av| 福利视频一区二区三区四区| 亚洲一区 在线播放| 黄色一级片国产| 国产不卡一区二区视频| 青青青在线观看视频| www.av片| 黄色片久久久久| 欧美三级理论片| 韩国一区二区在线播放| 在线观看视频黄色| 久艹在线免费观看| 免费一级特黄特色毛片久久看| 日韩xxxx视频| 黄色av网址在线播放| 国产成人av影视| 日本超碰在线观看| 男女啪啪的视频| 欧美爱爱视频免费看| 天天碰免费视频| 亚洲综合在线一区二区| www插插插无码免费视频网站| 鲁一鲁一鲁一鲁一色| 一级特黄性色生活片| 99日在线视频| 欧美日韩精品在线一区二区| 久久久精品三级| 男人草女人视频| 免费黄色特级片| 懂色av一区二区三区四区五区| 日韩xxxx视频| 欧美特黄aaa| 欧美变态另类刺激| 青青草原国产免费| 国产精品97在线| 男女h黄动漫啪啪无遮挡软件| 波多野结衣家庭教师在线播放| 免费网站在线观看黄| 亚洲 高清 成人 动漫| 黄色aaaaaa| 激情视频综合网| 2022中文字幕| 激情久久综合网| 男女视频一区二区三区| 亚洲 自拍 另类小说综合图区| www.久久av.com| 欧美极品欧美精品欧美图片| 992tv成人免费观看| 天天视频天天爽| 欧美 日韩 国产一区| 国产欧美精品aaaaaa片| 超碰免费在线公开| 2025韩国理伦片在线观看| 人人妻人人添人人爽欧美一区| 伊人网在线免费| 日韩 欧美 自拍| 久久久国产精华液999999 | 日日夜夜精品视频免费观看| 免费黄色日本网站| 福利视频免费在线观看| 国产美女视频免费| 国产系列第一页| www.51色.com| 日韩精品视频网址| 日韩av影视大全| 色婷婷一区二区三区在线观看| 久久这里只精品| 亚洲一级片网站| 在线视频一二区| 黄色网络在线观看| 久久www视频| 黄页网站大全在线观看| 给我免费播放片在线观看| www.日本在线播放| 欧美激情国产精品日韩| wwwwww.色| 国产精品嫩草影视| 欧美交换配乱吟粗大25p| 超碰人人爱人人| 国产中文字幕免费观看| 国产综合免费视频| 激情五月俺来也| 国产一级片中文字幕| 轻点好疼好大好爽视频| 国产妇女馒头高清泬20p多| 黄色大片在线免费看| 国产精品久久久久9999小说| 亚洲欧洲日本精品| 久久亚洲a v| 成人免费视频久久| 日韩不卡视频一区二区| www国产精品内射老熟女| 亚洲人辣妹窥探嘘嘘| 国产成人免费高清视频| 女人喷潮完整视频| 久久精品久久99| 激情伊人五月天| 中文字幕线观看| av免费观看网| 懂色av一区二区三区四区五区| 妺妺窝人体色777777| www.精品在线| 鲁一鲁一鲁一鲁一澡| 九九九久久久久久久| 337p粉嫩大胆噜噜噜鲁| 日韩精品视频网址| 无遮挡又爽又刺激的视频 | 黄色一级视频片| 日日干日日操日日射| 91免费视频网站在线观看| 色一情一乱一乱一区91| 亚州精品一二三区| 北条麻妃在线视频观看| 福利在线小视频| 亚洲精品视频三区| 国产亚洲天堂网| 国产中文字幕在线免费观看| www国产免费| 爱爱爱视频网站| 999在线观看| 一本岛在线视频| 亚洲国产精品三区| 欧美一级片中文字幕| 日韩免费一级视频| 国产乱子伦精品无码专区| 精品国产一区二区三区在线| 在线看免费毛片| 中文av一区二区三区| www.这里只有精品| 天天干天天干天天干天天干天天干| 免费无码国产v片在线观看| 成年人午夜免费视频| 国产精品专区在线| 国内精品视频一区二区三区| 久久久久久久久久久综合| 亚洲天堂第一区| av网站手机在线观看| 自慰无码一区二区三区| 国产日产欧美视频|