學(xué)習(xí)這套教程之前,你需要:
本教程默認(rèn)你已經(jīng)具備基本的C語(yǔ)言語(yǔ)法知識(shí),具備基本的計(jì)算機(jī)理論和常識(shí),比如進(jìn)制、存儲(chǔ)的概念等,又透過(guò)事物看本質(zhì)的好奇心。
以上
這一節(jié)我們將主要學(xué)習(xí)整數(shù)在C語(yǔ)言中的表現(xiàn)形式,這將奠定大家C語(yǔ)言堅(jiān)實(shí)的基礎(chǔ),并且為大家今后從事逆向分析相關(guān)的工作時(shí)提供良好的知識(shí)鋪墊。
C語(yǔ)言中整形按大小可以細(xì)分int、short、long,又可以按符號(hào)分有符號(hào)和無(wú)符號(hào)等,又因C標(biāo)準(zhǔn)并未明確規(guī)定不同數(shù)據(jù)類(lèi)型的標(biāo)準(zhǔn)大小,而交由編譯器規(guī)定。故在不同系統(tǒng)、不同編譯器下大小不同,從存儲(chǔ)來(lái)說(shuō),最大的不同即在于有無(wú)正負(fù)號(hào),為了描述方便,便于理解,我們統(tǒng)一按照最常見(jiàn)的四字節(jié)為例(2字節(jié)和8字節(jié)也通用),按有符號(hào)整數(shù)和無(wú)符號(hào)整數(shù)兩類(lèi)講解。
無(wú)符號(hào)整數(shù)(unsigned int)
此類(lèi)整數(shù)最好理解,存儲(chǔ)時(shí),它們(unsigned int)的全部位數(shù)(比如int四個(gè)字節(jié),將占8*4=32個(gè)bit位)都用來(lái)表示數(shù)據(jù),即00000000 00000000 00000000 00000000 ~ 11111111 11111111 11111111 11111111 之間,而在內(nèi)存中,通常用8個(gè)十六進(jìn)制數(shù)表示,即四個(gè)二進(jìn)制數(shù)一組,十六進(jìn)制表示為0x00000000 ~ 0xFFFFFFFF。最大表示范圍十進(jìn)制為0~4294967295。
下面舉個(gè)例子以加強(qiáng)理解:
譬如十進(jìn)制數(shù)字5,對(duì)應(yīng)二進(jìn)制數(shù)為101,那么對(duì)應(yīng)二進(jìn)制表示為00000000 00000000 00000000 00000101 與我們最習(xí)慣的十進(jìn)制表示一樣,低位再右,向左進(jìn)位。左邊29位全為0。
對(duì)應(yīng)十六進(jìn)制表示則為0x00000005。
再譬如十進(jìn)制數(shù)字12,對(duì)應(yīng)二進(jìn)制數(shù)為1100,那么對(duì)應(yīng)二進(jìn)制表示為00000000 00000000 00000000 00001100 ,對(duì)應(yīng)十六進(jìn)制數(shù)為0x0x0000000C
有符號(hào)整數(shù)(int)
有符號(hào)數(shù)與無(wú)符號(hào)數(shù)的區(qū)別在于,最高一位也就是左邊第一位是用來(lái)表示符號(hào)的,而右邊31位表示數(shù)據(jù)。
左邊第一位用1表示負(fù)數(shù),用0表示正數(shù)
右邊31位數(shù)據(jù)即為0000000 00000000 00000000 00000000 ~ 1111111 11111111 11111111 11111111
對(duì)應(yīng)十六進(jìn)制數(shù)為0x00000000 ~ 0xFFFFFFFF ,其中正數(shù)部分為:0x00000000 ~ 0x7FFFFFFF,負(fù)數(shù)部分為:0x80000000 ~0xFFFFFFFF,其中0x00000000為0,0x80000000為最小負(fù)數(shù)。
對(duì)應(yīng)十進(jìn)制數(shù)則為-2147483648 ~ 2147483647
(到這里,如果您對(duì)數(shù)字的二進(jìn)制存儲(chǔ),包括原碼、補(bǔ)碼等不明白的話可以參考 int類(lèi)型在內(nèi)存中的存儲(chǔ)方式。)
實(shí)際學(xué)習(xí)、逆向分析過(guò)程中,我們?cè)诎l(fā)現(xiàn)有數(shù)據(jù)需要解釋為有符號(hào)整數(shù)時(shí),往往看十六進(jìn)制的最高位,是小于8,還是8及以上,如果8以下則為正數(shù),大于8則為負(fù)數(shù)。需要大家根據(jù)經(jīng)驗(yàn)結(jié)合上下文分析。
另一方面,了解整數(shù)的存儲(chǔ)結(jié)構(gòu),對(duì)于理解整數(shù)算數(shù)運(yùn)算過(guò)程中發(fā)生的進(jìn)位、溢出等問(wèn)題也有很好的幫助。比如程序:
貌似為死循環(huán),但實(shí)際上i由于是有符號(hào)的,所以當(dāng)加到上限也就是0x7FFFFFFF時(shí),進(jìn)位就會(huì)變成0x80000000從而結(jié)束循環(huán)。
為了方便顯示結(jié)果,也可以加大i的值,運(yùn)行如下:
大家可以自行上機(jī)測(cè)試實(shí)驗(yàn),感受整數(shù)的存儲(chǔ)規(guī)律。
以上