進(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)換。
現(xiàn)實(shí)生活中的進(jìn)制與計(jì)算機(jī)的二進(jìn)制
我們?cè)诂F(xiàn)實(shí)生活中會(huì)接觸到多種多樣的進(jìn)制,通常見(jiàn)到的有十進(jìn)制、十二進(jìn)制和二十四進(jìn)制等。下面分別對(duì)這幾種進(jìn)制進(jìn)行舉例說(shuō)明。
十進(jìn)制是每個(gè)人從上學(xué)就開(kāi)始接觸和學(xué)習(xí)的進(jìn)制表示方法。所謂的十進(jìn)制,就是逢十進(jìn)一,最簡(jiǎn)單的例子就是9+1=10。這個(gè)無(wú)需過(guò)多解釋。
十二進(jìn)制也是我們?nèi)粘I钪谐R?jiàn)的表示方法。所謂的十二進(jìn)制,就是逢十二進(jìn)一,例如12個(gè)月為1年,13個(gè)月就是1年1個(gè)月。
二十四進(jìn)制也是我們?nèi)粘I钪谐R?jiàn)的表示方法。所謂的二十四進(jìn)制,就是逢二十四進(jìn)一,例如24小時(shí)為1天,25小時(shí)就是1天1小時(shí)。
介紹了以上現(xiàn)實(shí)生活中的例子后,我們?cè)賮?lái)說(shuō)說(shuō)計(jì)算機(jī)中的二進(jìn)制。根據(jù)前面各種進(jìn)制的解釋,我們可以想到,二進(jìn)制就是逢二進(jìn)一。這里舉個(gè)不太恰當(dāng)?shù)睦樱?斤就是1公斤。
在計(jì)算機(jī)中為什么使用二進(jìn)制呢?簡(jiǎn)單說(shuō)就是計(jì)算機(jī)用高電平和低電平來(lái)表示1和0最為方便和穩(wěn)定,高電平被認(rèn)為是l,低電平被認(rèn)為是0,這就是所謂的二進(jìn)制的來(lái)源。由于二進(jìn)制在閱讀上不方便,計(jì)算機(jī)又引入了十六進(jìn)制來(lái)直觀地表示二進(jìn)制。所謂的十六進(jìn)制,就是逢十六進(jìn)一。
因此在計(jì)算機(jī)中,我們常見(jiàn)的數(shù)據(jù)表示方法有二進(jìn)制、十進(jìn)制和十六進(jìn)制。
進(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)一??偨Y(jié)十進(jìn)制的定義則是,由0到9十個(gè)數(shù)字組成,并且逢十進(jìn)一。
舉一反一地來(lái)說(shuō),二進(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)一。
下表所列為這三種進(jìn)制的數(shù)字表。
數(shù)制 | 基數(shù) | 數(shù)字 |
二進(jìn)制 | 2 | 0 1 |
十進(jìn)制 | 10 | 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 |
進(jìn)制的轉(zhuǎn)換
在逆向當(dāng)中,我們直接面對(duì)的通常是十六進(jìn)制,而由于很多原因,我們需要將其當(dāng)作十進(jìn)制或二進(jìn)制來(lái)查看,當(dāng)然也有可能需要根據(jù)二進(jìn)制轉(zhuǎn)換成十六進(jìn)制或十進(jìn)制。所以,我們就需要掌握進(jìn)制之間的轉(zhuǎn)換。
二進(jìn)制轉(zhuǎn)十進(jìn)制
二進(jìn)制整數(shù)的每個(gè)位都是2的冪次方,最低位是2的0次方,最高為是2的(N-1)次方,我們通過(guò)一個(gè)例子進(jìn)行說(shuō)明。我們把二進(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
十六進(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)系,如下表。
二進(jìn)制 | 十進(jìn)制 | 十六進(jìn)制 | 二進(jìn)制 | 十進(jìn)制 | 十六進(jìn)制 |
0000 | 0 | 0 | 1000 | 8 | 8 |
0001 | 1 | 1 | 1001 | 9 | 9 |
0010 | 2 | 2 | 1010 | 10 | A |
0011 | 3 | 3 | 1011 | 11 | B |
0100 | 4 | 4 | 1100 | 12 | C |
0101 | 5 | 5 | 1101 | 13 | D |
0110 | 6 | 6 | 1110 | 14 | E |
0111 | 7 | 7 | 1111 | 15 | F |
根據(jù)此表,我們可以很快地把二進(jìn)制和十六進(jìn)制進(jìn)行轉(zhuǎn)換,把上例的二進(jìn)制10010011轉(zhuǎn)換成十六進(jìn)制,轉(zhuǎn)換過(guò)程如下:
第一步,把10010011從最低開(kāi)始按每四位分為一組,不足四位前面補(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ì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ù)。