001--初識(shí)匯編

我們?cè)趯W(xué)習(xí)逆向開發(fā)之前,我們要了解一個(gè)基本的逆向原理.首先我們是逆向iOS系統(tǒng)上面的APP.那么我們知道,一個(gè)APP安裝在手機(jī)上面的可執(zhí)行文件本質(zhì)上是二進(jìn)制文件.因?yàn)閕Phone手機(jī)本質(zhì)上執(zhí)行的指令是二進(jìn)制.是由手機(jī)上的CPU執(zhí)行的.所以逆向開發(fā)是建立在分析二進(jìn)制上面.所以今天我們接下來的課程從非称杏保基礎(chǔ)的東西開始講解.

匯編語言的發(fā)展

機(jī)器語言

由0和1組成的機(jī)器指令.

加:0100 0000

減:0100 1000

乘:1111 0111 1110 0000?

除:1111 0111 1111 0000?

匯編語言(assembly language)

使用助記符代替機(jī)器語言

如:

加:INC EAX 通過編譯器 0100 0000

減:DEC EAX 通過編譯器 0100 1000

乘:MUL EAX 通過編譯器 1111 0111 1110 0000

除:DIV EAX 通過編譯器 1111 0111 1111 0000

高級(jí)語言(High-level programming language)

C\C++\Java\OC\Swift,更加接近人類的自然語言

比如C語言:

加:A+B 通過編譯器 0100 0000

減:A-B 通過編譯器 0100 1000

乘:A*B 通過編譯器 1111 0111 1110 0000

除:A/B 通過編譯器 1111 0111 1111 0000

我們的代碼在終端設(shè)備上是這樣的過程:

匯編語言機(jī)器語言一一對(duì)應(yīng),每一條機(jī)器指令都有與之對(duì)應(yīng)的匯編指令

匯編語言可以通過編譯得到機(jī)器語言为障,機(jī)器語言可以通過反匯編得到匯編語言

高級(jí)語言可以通過編譯得到匯編語言?\?機(jī)器語言晦闰,但匯編語言\機(jī)器語言幾乎不可能還原成高級(jí)語言

匯編語言的特點(diǎn)

可以直接訪問放祟、控制各種硬件設(shè)備,比如存儲(chǔ)器呻右、CPU等跪妥,能最大限度地發(fā)揮硬件的功能

能夠不受編譯器的限制,對(duì)生成的二進(jìn)制代碼進(jìn)行完全的控制

目標(biāo)代碼簡(jiǎn)短声滥,占用內(nèi)存少眉撵,執(zhí)行速度快

匯編指令是機(jī)器指令的助記符,同機(jī)器指令一一對(duì)應(yīng)。每一種CPU都有自己的機(jī)器指令集\匯編指令集落塑,所以匯編語言不具備可移植性

知識(shí)點(diǎn)過多纽疟,開發(fā)者需要對(duì)CPU等硬件結(jié)構(gòu)有所了解,不易于編寫憾赁、調(diào)試污朽、維護(hù)

不區(qū)分大小寫,比如mov和MOV是一樣的

匯編的用途(哥么我學(xué)了能干啥?)

編寫驅(qū)動(dòng)程序龙考、操作系統(tǒng)(比如Linux內(nèi)核的某些關(guān)鍵部分)

對(duì)性能要求極高的程序或者代碼片段蟆肆,可與高級(jí)語言混合使用(內(nèi)聯(lián)匯編)

軟件安全

病毒分析與防治

逆向\加殼\脫殼\破解\外掛\免殺\加密解密\漏洞\黑客

理解整個(gè)計(jì)算機(jī)系統(tǒng)的最佳起點(diǎn)和最有效途徑

為編寫高效代碼打下基礎(chǔ)

弄清代碼的本質(zhì)

函數(shù)的本質(zhì)究竟是什么?

++a + ++a + ++a 底層如何執(zhí)行的?

編譯器到底幫我們干了什么?

DEBUG模式和RELEASE模式有什么關(guān)鍵的地方被我們忽略

......

最后來句裝13的話

越底層越單純!真正的程序員都需要了解的一門非常重要的語言,匯編!

匯編語言的種類

目前討論比較多的匯編語言有

8086匯編(8086處理器是16bit的CPU)

Win32匯編

Win64匯編

ARM匯編(嵌入式、Mac晦款、iOS)

......

我們iPhone里面用到的是ARM匯編,但是不同的設(shè)備也有差異.因CPU的架構(gòu)不同.

架構(gòu)設(shè)備

armv6iPhone, iPhone2, iPhone3G, 第一代颓芭、第二代 iPod Touch

armv7iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4

armv7siPhone5, iPhone5C, iPad4(iPad with Retina Display)

arm64iPhone5S 以后 iPhoneX , iPad Air, iPad mini2以后

幾個(gè)必要的常識(shí)

要想學(xué)好匯編,首先需要了解CPU等硬件結(jié)構(gòu)

APP/程序的執(zhí)行過程

硬件相關(guān)最為重要是CPU/內(nèi)存

在匯編中,大部分指令都是和CPU與內(nèi)存相關(guān)的

總線

每一個(gè)CPU芯片都有許多管腳,這些管腳和總線相連柬赐,CPU通過總線跟外部器件進(jìn)行交互

總線:一根根導(dǎo)線的集合

總線的分類

地址總線

數(shù)據(jù)總線

控制總線

舉個(gè)例子

地址總線

它的寬度決定了CPU的尋址能力

8086的地址總線寬度是20亡问,所以尋址能力是1M( 220?)

數(shù)據(jù)總線

它的寬度決定了CPU的單次數(shù)據(jù)傳送量,也就是數(shù)據(jù)傳送速度

8086的數(shù)據(jù)總線寬度是16肛宋,所以單次最大傳遞2個(gè)字節(jié)的數(shù)據(jù)

控制總線

它的寬度決定了CPU對(duì)其他器件的控制能力州藕、能有多少種控制

做個(gè)小練習(xí)

* 一個(gè)CPU 的尋址能力為8KB,那么它的地址總線的寬度為____

* 8080,8088,80286,80386 的地址總線寬度分別為16根,20根,24根,32根.那么他們的尋址能力分別為多少____KB, ____MB,____MB,____GB?

* 8080,8088,8086,80286,80386 的數(shù)據(jù)總線寬度分別為8根,8根,16根,16根,32根.那么它們一次可以傳輸?shù)臄?shù)據(jù)為:____B,____B,____B,____B,____B,

* 從內(nèi)存中讀取1024字節(jié)的數(shù)據(jù),8086至少要讀____次,80386至少要讀取____次.

答案

內(nèi)存

內(nèi)存地址空間的大小受CPU地址總線寬度的限制。8086的地址總線寬度為20酝陈,可以定位220個(gè)不同的內(nèi)存單元(內(nèi)存地址范圍0x00000~0xFFFFF)床玻,所以8086的內(nèi)存空間大小為1MB

0x00000~0x9FFFF:主存儲(chǔ)器〕涟铮可讀可寫

0xA0000~0xBFFFF:向顯存中寫入數(shù)據(jù)锈死,這些數(shù)據(jù)會(huì)被顯卡輸出到顯示器∧潞荆可讀可寫

0xC0000~0xFFFFF:存儲(chǔ)各種硬件\系統(tǒng)信息待牵。只讀

進(jìn)制

學(xué)習(xí)進(jìn)制的障礙

很多人學(xué)不好進(jìn)制,原因是總以十進(jìn)制為依托去考慮其他進(jìn)制喇勋,需要運(yùn)算的時(shí)候也總是先轉(zhuǎn)換成十進(jìn)制缨该,這種學(xué)習(xí)方法是錯(cuò)誤的.

我們?yōu)槭裁匆欢ㄒD(zhuǎn)換十進(jìn)制呢??jī)H僅是因?yàn)槲覀儗?duì)十進(jìn)制最熟悉川背,所以才轉(zhuǎn)換.

每一種進(jìn)制都是完美的,想學(xué)好進(jìn)制首先要忘掉十進(jìn)制贰拿,也要忘掉進(jìn)制間的轉(zhuǎn)換蛤袒!

進(jìn)制的定義

八進(jìn)制由8個(gè)符號(hào)組成:0 1 2 3 4 5 6 7 逢八進(jìn)一

十進(jìn)制由10個(gè)符號(hào)組成:0 1 2 3 4 5 6 7 8 9逢十進(jìn)一

N進(jìn)制就是由N個(gè)符號(hào)組成:逢N進(jìn)一

做個(gè)練習(xí)

1 + 1 在____情況下等于 3 ?

十進(jìn)制由10個(gè)符號(hào)組成: 0 1 3 2 8 A B E S 7 逢十進(jìn)一

如果這樣定義十進(jìn)制: 1 + 1 = 3!就對(duì)了!

這樣的目的何在?

傳統(tǒng)我們定義的十進(jìn)制和自定義的十進(jìn)制不一樣.那么這10個(gè)符號(hào)如果我們不告訴別人這個(gè)符號(hào)表,別人是沒辦法拿到我們的具體數(shù)據(jù)的!用于加密!

十進(jìn)制由十個(gè)符號(hào)組成,逢十進(jìn)一,符號(hào)是可以自定義的!!

進(jìn)制的運(yùn)算

做個(gè)練習(xí)

八進(jìn)制運(yùn)算

2 + 3 = __ , 2 * 3 = __ ,4 + 5 = __ ,4 * 5 = __.

277 + 333 = __ , 276 * 54 = __ , 237 - 54 = __ , 234 / 4 = __ .

八進(jìn)制加法表

八進(jìn)制乘法表

實(shí)戰(zhàn)四則運(yùn)算

二進(jìn)制的簡(jiǎn)寫形式

二進(jìn)制:從0 寫到 1111

0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111?

這種二進(jìn)制使用起來太麻煩,改成更簡(jiǎn)單一點(diǎn)的符號(hào):

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

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

數(shù)學(xué)上的數(shù)字膨更,是沒有大小限制的妙真,可以無限的大。但在計(jì)算機(jī)中荚守,由于受硬件的制約隐孽,數(shù)據(jù)都是有長(zhǎng)度限制的(我們稱為數(shù)據(jù)寬度),超過最多寬度的數(shù)據(jù)會(huì)被丟棄健蕊。

計(jì)算機(jī)中常見的數(shù)據(jù)寬度

位(Bit): 1個(gè)位就是1個(gè)二進(jìn)制位.0或者1

字節(jié)(Byte): 1個(gè)字節(jié)由8個(gè)Bit組成(8位).內(nèi)存中的最小單元Byte.

字(Word): 1個(gè)字由2個(gè)字節(jié)組成(16位),這2個(gè)字節(jié)分別稱為高字節(jié)和低字節(jié).

雙字(Doubleword): 1個(gè)雙字由兩個(gè)字組成(32位)

那么計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)它會(huì)分為有符號(hào)數(shù)和無符號(hào)數(shù).那么關(guān)于這個(gè)看圖就理解了!

自定義進(jìn)制符號(hào)

練習(xí)

現(xiàn)在有10進(jìn)制數(shù) 10個(gè)符號(hào)分別是:2,9踢俄,1缩功,7,6都办,5嫡锌,4, 8琳钉,3 , A 逢10進(jìn)1 那么: 123 + 234 = ____

那么剛才通過10進(jìn)制運(yùn)算可以轉(zhuǎn)化10進(jìn)制然后查表!但是如果是其他進(jìn)制.我們就不能轉(zhuǎn)換,要直接學(xué)會(huì)查表

現(xiàn)在有9進(jìn)制數(shù) 9個(gè)符號(hào)分別是:2势木,9,1歌懒,7啦桌,6,5及皂,4甫男, 8,3 逢9進(jìn)1 那么: 123 + 234 = ____

寄存器

內(nèi)部部件之間由總線連接

對(duì)程序員來說验烧,CPU中最主要部件是寄存器板驳,可以通過改變寄存器的內(nèi)容來實(shí)現(xiàn)對(duì)CPU的控制

不同的CPU,寄存器的個(gè)數(shù)碍拆、結(jié)構(gòu)是不相同的

通用寄存器

ARM64擁有有31個(gè)64位的通用寄存器 x0 到 x30,這些寄存器通常用來存放一般性的數(shù)據(jù)若治,稱為通用寄存器(有時(shí)也有特定用途)

那么w0 到 w28 這些是32位的. 因?yàn)?4位CPU可以兼容32位.所以可以只使用64位寄存器的低32位.

比如 w0 就是 x0的低32位!

通常,CPU會(huì)先將內(nèi)存中的數(shù)據(jù)存儲(chǔ)到通用寄存器中感混,然后再對(duì)通用寄存器中的數(shù)據(jù)進(jìn)行運(yùn)算

假設(shè)內(nèi)存中有塊紅色內(nèi)存空間的值是3端幼,現(xiàn)在想把它的值加1,并將結(jié)果存儲(chǔ)到藍(lán)色內(nèi)存空間

CPU首先會(huì)將紅色內(nèi)存空間的值放到X0寄存器中:mov X0,紅色內(nèi)存空間

然后讓X0寄存器與1相加:add X0,1

最后將值賦值給內(nèi)存空間:mov 藍(lán)色內(nèi)存空間,X0

pc寄存器(program counter)

為指令指針寄存器弧满,它指示了CPU當(dāng)前要讀取指令的地址

在內(nèi)存或者磁盤上静暂,指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息

CPU在工作的時(shí)候把有的信息看做指令谱秽,有的信息看做數(shù)據(jù)洽蛀,為同樣的信息賦予了不同的意義

比如 1110 0000 0000 0011 0000 1000 1010 1010?

可以當(dāng)做數(shù)據(jù) 0xE003008AA?

也可以當(dāng)做指令 mov x0, x8

CPU根據(jù)什么將內(nèi)存中的信息看做指令摹迷?

CPU將pc指向的內(nèi)存單元的內(nèi)容看做指令

如果內(nèi)存中的某段內(nèi)容曾被CPU執(zhí)行過,那么它所在的內(nèi)存單元必然被pc指向過

bl指令

CPU從何處執(zhí)行指令是由pc中的內(nèi)容決定的郊供,我們可以通過改變pc的內(nèi)容來控制CPU執(zhí)行目標(biāo)指令

ARM64提供了一個(gè)mov指令(傳送指令)峡碉,可以用來修改大部分寄存器的值,比如

mov x0,#10驮审、mov x1,#20

但是鲫寄,mov指令不能用于設(shè)置pc的值,ARM64沒有提供這樣的功能

ARM64提供了另外的指令來修改PC的值疯淫,這些指令統(tǒng)稱為轉(zhuǎn)移指令地来,最簡(jiǎn)單的是bl指令

bl指令 -- 練習(xí)

現(xiàn)在有兩段代碼!假設(shè)程序先執(zhí)行A,請(qǐng)寫出指令執(zhí)行順序.最終寄存器x0的值是多少?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市熙掺,隨后出現(xiàn)的幾起案子未斑,更是在濱河造成了極大的恐慌,老刑警劉巖币绩,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜡秽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缆镣,警方通過查閱死者的電腦和手機(jī)芽突,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來董瞻,“玉大人寞蚌,你說我怎么就攤上這事∧坪” “怎么了睬澡?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)眠蚂。 經(jīng)常有香客問我煞聪,道長(zhǎng),這世上最難降的妖魔是什么逝慧? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任昔脯,我火速辦了婚禮,結(jié)果婚禮上笛臣,老公的妹妹穿的比我還像新娘云稚。我一直安慰自己,他們只是感情好沈堡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布静陈。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲸拥。 梳的紋絲不亂的頭發(fā)上拐格,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音刑赶,去河邊找鬼捏浊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撞叨,可吹牛的內(nèi)容都是我干的金踪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牵敷,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胡岔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枷餐,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤靶瘸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尖淘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡著觉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年村生,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饼丘。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趁桃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肄鸽,到底是詐尸還是另有隱情卫病,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布典徘,位于F島的核電站蟀苛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逮诲。R本人自食惡果不足惜帜平,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梅鹦。 院中可真熱鬧裆甩,春花似錦、人聲如沸齐唆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箍邮。三九已至茉帅,卻和暖如春叨叙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背担敌。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工摔敛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人全封。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓马昙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刹悴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子行楞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容