成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Android逆向從入門到入土(smali修改,so修改)

frank_fun / 1049人閱讀

摘要:閑來無事,學(xué)習(xí)了下安卓的逆向工程,有助于觀摩學(xué)習(xí)他人的優(yōu)秀代碼,查詢了解后發(fā)現(xiàn)大體包括兩部分反編譯,即語法學(xué)習(xí)層,匯編學(xué)習(xí)。不多說,做過安卓開發(fā)都可以改,重點(diǎn)是的閱讀修改。想要深入了解相關(guān)知識(shí),可以百度關(guān)鍵字安卓,安卓,安卓,安卓。

閑來無事,學(xué)習(xí)了下安卓的逆向工程,有助于觀摩學(xué)習(xí)他人的優(yōu)秀代碼,查詢了解后發(fā)現(xiàn)大體包括兩部分:
1.dex反編譯,即smali語法學(xué)習(xí);
2.Native層,arm匯編學(xué)習(xí)。

反編譯dex,Smali語法 工具

java環(huán)境不多說
1.apktool.jar;
2.jd-gui.jar;
3.dex2jar.zip;
這里就不提供了,畢竟自己動(dòng)手,豐衣足食,建議百度下載最新的版本,舊版本可能會(huì)有bug。

查看java源碼

假設(shè)現(xiàn)在有一個(gè)test.apk,如果我們想要查看一個(gè)apk里的java源碼,就可以通過解壓apk文件得到dex文件,然后使用dex2jar.zip工具包中的d2j-dex2jar.bat將dex轉(zhuǎn)為jar文件

classes.dex拖動(dòng)到d2j-dex2jar.bat上,得到classes-dex2jar.jar,使用jd-gui.jar打開就可以查看源碼了:

反編譯

但是jar文件只能輔助我們查看java代碼,無法修改。想要修改的話,還是要反編譯出smali文件,然后對(duì)smali文件進(jìn)行修改操作,使用下邊的命令反編譯apk:

apktool.jar d test.apk

然后會(huì)在當(dāng)前目錄生成test目錄,目錄內(nèi)容大體如下:

assets資源目錄,包含了圖片和字體等資源;
build和dist為重新編譯生成的,新apk在dist目錄;
lib為so文件目錄;
original保存了原簽名和反編譯前的清單文件;
res主要為layout,strings等xml文件;
unknown不用管;
下邊是AndroidManifest.xml,清單文件,已經(jīng)可以打開查看了;
然后最重要的來了smali和smali_classes2,apk中的每個(gè)dex文件會(huì)反編譯出一個(gè)smali文件夾,classes.dex對(duì)應(yīng)smali,classes2.dex對(duì)應(yīng)smali_classes2,以此類推。

修改smali

知道了這些后,就可以查看修改我們想要的內(nèi)容了。AndroidManifest.xml不多說,做過安卓開發(fā)都可以改,重點(diǎn)是smali的閱讀修改。首先打開smali文件夾內(nèi)容如下:

由于現(xiàn)在apk編譯時(shí)普遍會(huì)進(jìn)行混肴,以防他人修改二次發(fā)布,所以目錄結(jié)構(gòu)有些亂,但并無大礙。
隨手打開一個(gè)smali文件(sublime,已安裝smali插件):

嗯,看不懂,沒事現(xiàn)在學(xué)還來得及,你需要了解下smali語法,傳送門:APK反編譯之一:基礎(chǔ)知識(shí)--smali文件閱讀。

smali修改簡(jiǎn)單示例:


上圖為原java代碼,下圖是反編譯出的smali代碼,此方法用來判斷外置儲(chǔ)存是否可讀。
現(xiàn)在無論外置存儲(chǔ)是否可讀,我們都想讓此方法返回true,則可以在smali代碼中的return v1前加上一行const/4 v1, 0x1,如下圖:

是不是非常簡(jiǎn)單?當(dāng)然,這只是最簡(jiǎn)單的修改,一切都建立在深入地學(xué)習(xí)和了解過smali語法的基礎(chǔ)上。

Native層,arm匯編

安卓native層,通俗來說就是對(duì)lib目錄下的so文件學(xué)習(xí)和了解,so文件是Android NDK動(dòng)態(tài)鏈接庫(kù),是二進(jìn)制文件,作用相當(dāng)于windows下的.dll文件。想要深入了解相關(guān)知識(shí),可以百度關(guān)鍵字:‘安卓 native’,‘安卓 JNI’,‘安卓 ELF’,‘安卓 NDK’。

不同的cpu構(gòu)架

so通常是針對(duì)不同的cpu構(gòu)建編譯而成的,如下圖:

arm64-v8a:arm最新的64cpu構(gòu)架,如驍龍810,820,835等都是基于此構(gòu)架的,同時(shí)兼容A32,T32指令集;
armeabi-v7a:32位cpu構(gòu)架,如驍龍800,801等,兼容armv5,armv6;
armeabi:armv5,armv6構(gòu)架,基本已經(jīng)淘汰了;
x86:intel的32位cpu構(gòu)架,即windows平臺(tái)的32位cpu構(gòu)架;
x86_64:其實(shí)是amd出的兼容64位的32位cpu構(gòu)架;
arm構(gòu)架都是向下兼容的,例如如果CPU是armv8,沒有對(duì)應(yīng)arm64-v8a文件夾,則會(huì)執(zhí)行armeabi-v7a中的so文件。
話不多說,開始研究修改so文件吧,首先使用010 editor或ida打開armeabi下的so(elf)文件(這里使用ida),彈出界面直接點(diǎn)擊ok,進(jìn)入如下頁面:

要了解elf文件的詳細(xì)信息可以查看:ARM平臺(tái)下elf文件超詳細(xì)的分析與解讀,elf文件的解析這里不做更多說明。如果你跟我一樣,別的什么也不想看,就想知道怎么修改so,那么下面我們就來看看怎么修改arm匯編的機(jī)器碼,來達(dá)到修改so文件的目的。

修改前的準(zhǔn)備工作

1.了解二進(jìn)制文件的大小端模式,傳送門:詳解大端模式和小端模式;
2.了解寄存器相關(guān)知識(shí),了解arm32位和64位寄存器的區(qū)別,特別是lr,sp,pc等關(guān)鍵寄存器的作用;
3.arm指令集學(xué)習(xí),包括32位指令(A32,T32)和64位指令(A64),這里不上鏈接了,因?yàn)樘嗔?,具體建議百度自查;
4.下載arm官網(wǎng)cpu構(gòu)架手冊(cè),修改時(shí)需要對(duì)應(yīng)查看,鏈接:A-Profile Architecture,我們主要查看a系列的構(gòu)架手冊(cè),主要下載的文件:

Arm? Architecture Reference Manual Armv8, for Armv8-A architecture profile
Arm? Architecture Reference Manual Armv7-A and Armv7-R edition
The A64 instruction set

第一本是關(guān)于A64指令集的手冊(cè),其實(shí)也包含了A32和T32指令集,第二本是armv7構(gòu)架,包含了ARM指令和Thumb指令,第三本介紹了A64指令。
5.熟練進(jìn)行進(jìn)制轉(zhuǎn)換,可以使用win10自帶的計(jì)算器的程序員模式。

修改so文件

- 32位

以下內(nèi)容建立在以上知識(shí)的基礎(chǔ)上,開始修改,接著我們打開的so頁面(armeabi-v7a),滾動(dòng)到匯編代碼區(qū)域,如下圖:

例如想要修改Ox00005EE8處的關(guān)鍵跳轉(zhuǎn)BEQ loc_5EFABNE loc_5EFA,通過匯編代碼知道,此處用R0寄存器中的值和2比較大小,如果R0中的值等于2,跳轉(zhuǎn)到下邊的loc_5EFA處:

雙擊此行,然后點(diǎn)擊Hex View-1標(biāo)簽可以看到對(duì)應(yīng)的機(jī)器碼:

由于elf的存儲(chǔ)模式是小端模式(Little-endian),故實(shí)際的機(jī)器碼是D0 07,轉(zhuǎn)換為二進(jìn)制:?1101 0000 0000 0111?,可以看出是16位的Thumb指令,打開armv7構(gòu)架手冊(cè)(armv8也可以),找到指令集部分:

如上圖,此機(jī)器碼對(duì)應(yīng)紅框中的編碼方式,要修改BEQBNE,則需要修改8-11位的條件位,立即數(shù)保持不變:

上圖可以查出EQ的機(jī)器碼為0000,NE機(jī)器碼則是0001,因此修改后的機(jī)器碼為?1101 0001 0000 0111,再轉(zhuǎn)換回16進(jìn)制為?D1 07?,小端存儲(chǔ)07 D1,按如下步驟,右鍵點(diǎn)擊修改:

修改完后右鍵點(diǎn)擊應(yīng)用修改:

然后返回IDA View-A視圖,可以看到BEQ loc_5EFA已經(jīng)改為了BNE loc_5EFA

- 64位
下邊嘗試下修改64位構(gòu)架下的so文件,64位的so必須用64位的ida打開:

如上圖,我們修改紅框中的代碼,改為:

CMP      W1, #1
B.LT     loc_1B5C

CMP W0, #0的機(jī)器碼為?0111 0001 0000 0000 0000 0000 0001 1111?,查看armv8a手冊(cè):

寄存器w0改成w1,只需將5-9位改為00001。立即數(shù)#0改為#1,需要將10-21位改為00 0000 0000 01,改完后機(jī)器碼變?yōu)?b>?0111 0001 0000 0000 0000 0100 0011 1111?,轉(zhuǎn)換為16進(jìn)制后:?71 00 04 3F,小端模式3F 04 00 71?;

B.GT loc_1B10的機(jī)器碼?0101 0100 1111 1111 1111 1110 0000 1100?,編碼方式如下:


B.GT改為B.LT,即修改0-3位為1011。

原立即數(shù)1111 1111 1111 1110 000補(bǔ)碼轉(zhuǎn)為原碼1001 0000,即-16

偏移量計(jì)算方法為:offset = SignExtend(imm19:"00", 64),也就是19位的立即數(shù)后邊拼接00(左移2位),變?yōu)?b>1111 1111 1111 1110 000 00,然后有符號(hào)擴(kuò)展為64位(對(duì)于負(fù)數(shù),前邊補(bǔ)1,補(bǔ)足64位),變?yōu)?1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1100 0000?,此為補(bǔ)碼,轉(zhuǎn)為原碼1100 0000,即-64。正如紅框中的所述,是立即數(shù)的4倍。

此處要改為loc_1B5C,即偏移量為+12,則立即數(shù)為+12/4 = +3,5-23位的立即數(shù)變?yōu)?b>0000 0000 0000 0000 011。

最終機(jī)器碼為?0101 0100 0000 0000 0000 0000 0110 1011,轉(zhuǎn)換16進(jìn)制?54 00 00 6B?,小端模式6B 00 00 54。

然后,修改應(yīng)用后查看結(jié)果:


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68115.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<