逆向開發(fā)是建立在分析二進(jìn)制指令上面砍艾,二進(jìn)制指令與匯編語言一一對(duì)應(yīng)茧泪。通過分析app二進(jìn)制反匯編的匯編語言來推測邏輯清笨,最后達(dá)到高級(jí)代碼還原业稼。
匯編語言的發(fā)展
機(jī)器語言
由0和1組成的機(jī)器指令.
匯編語言(assembly language)
使用助記符代替機(jī)器語言
如: mov x0,#0xa0
匯編編譯器器將匯編語言轉(zhuǎn)換為機(jī)器碼
高級(jí)語言(High-level programming language)
C\C++\Java\OC\Swift,更加接近人類的自然語言
比如C語言: int a = b;
高級(jí)語言的編譯器將高級(jí)語言轉(zhuǎn)換為匯編語言
我們的代碼在終端設(shè)備上是這樣的過程:
- 匯編語言與機(jī)器語言一一對(duì)應(yīng)伏钠,每一條機(jī)器指令都有與之對(duì)應(yīng)的匯編指令
- 匯編語言可以通過編譯得到機(jī)器語言横漏,機(jī)器語言可以通過反匯編得到匯編語言
- 高級(jí)語言可以通過編譯得到匯編語言 \ 機(jī)器語言,但匯編語言\機(jī)器語言幾乎不可能還原成高級(jí)語言
匯編語言的種類
-
目前討論比較多的匯編語言有
- 8086匯編(8086處理器是16bit的CPU)
- ARM匯編(嵌入式熟掂、Mac缎浇、iOS)
- X86 匯編 (Mac)
- ......
我們iPhone里面用到的是ARM匯編,但是不同的設(shè)備也有差異.因CPU的架構(gòu)不同.
-
我們在打包App的時(shí)候,app支持的架構(gòu)指令集是多種的赴肚,一般我們會(huì)選擇armv7, armv7s素跺,arm64三種架構(gòu)通用,將三個(gè)可執(zhí)行文件包成一個(gè)包誉券。QQMusice支持arm7和arm64
架構(gòu) | 設(shè)備 |
---|---|
armv6 | iPhone, iPhone2, iPhone3G, 第一代指厌、第二代 iPod Touch |
armv7 | iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4 |
armv7s | iPhone5, iPhone5C, iPad4(iPad with Retina Display) |
arm64 | iPhone5S 以后 iPhoneX , iPad Air, iPad mini2以后 |
- iphone 5C是最后一個(gè)arm32位版本, 5C之后都是arm64位版本
- arm32和arm64位指令集會(huì)有些不一樣
幾個(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ù)總線、地址總線商玫、控制總線
- 數(shù)據(jù)總線寬度決定了CPU的單次數(shù)據(jù)傳送量箕憾,也就是數(shù)據(jù)傳送速度。如 8086的數(shù)據(jù)總線寬度是16拳昌,所以單次最大傳遞2個(gè)字節(jié)的數(shù)據(jù)
- 地址總線寬度決定尋址能力袭异,尋址能力直接影響能夠使用多大的內(nèi)存條。如8086的地址總線寬度是20地回,所以尋址能力是1M( 220 )
- 控制總線的寬度決定了CPU對(duì)其他器件的控制能力扁远、能有多少種控制
內(nèi)存
內(nèi)存地址空間的大小受CPU地址總線寬度的限制俊鱼。8086的地址總線寬度為20,可以定位2^20個(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)信息湃缎。只讀
數(shù)據(jù)的寬度
數(shù)學(xué)上的數(shù)字犀填,是沒有大小限制的,可以無限的大嗓违。但在計(jì)算機(jī)中九巡,由于受硬件的制約,數(shù)據(jù)都是有長度限制的(我們稱為數(shù)據(jù)寬度)蹂季,超過最多寬度的數(shù)據(jù)會(huì)被丟棄冕广。
int a = 0X1ffffffff;