好久沒有更新博客了。一直在想要更新點什么樣子的干貨稠曼。
最近看了一點有關(guān)于逆向的文章,感覺還不錯客年。
對于“安卓開發(fā)沒人要了”這種話霞幅,我也很無奈,最近的RN量瓜,包括kotlin的出現(xiàn)司恳,還有Flutter框架的出現(xiàn)。 這些東西的出現(xiàn)感覺都像是意味著绍傲,往后的移動端開發(fā)不需要雙倍的人員了扔傅。
最近突然對逆向萌生了一點點興趣,關(guān)于逆向的東西依舊有很多烫饼,很多apk對進(jìn)行加固猎塞,加殼等等,這里的入門僅僅是對于沒有加密等操作的apk進(jìn)行逆向杠纵,對初學(xué)者可以更快的知道流程荠耽,更快的入門。
第一步:準(zhǔn)備工具
1比藻、下載android開發(fā)工具 android studio铝量,百度即可。 建議去中文網(wǎng)或者官網(wǎng)下載
2银亲、dex2jar: 把dex文件轉(zhuǎn)成jar文件 下載地址:https://sourceforge.net/projects/dex2jar/files/
3慢叨、JD-GUI: 這個工具用于將jar文件轉(zhuǎn)換成java代碼 下載地址:http://jd.benow.ca/
4、APKTool: 本文重要工具务蝠,APK逆向工具拍谐,用于修改apk中的源代碼 下載地址: http://ibotpeaches.github.io/Apktool/install/
第二步:準(zhǔn)備apk
1、這里我們自己寫一個測試的app,用于驗證我們是否能看到其原來的代碼轩拨。
上一下最簡單的代碼吧
然后是java代碼
public class MainActivity extends AppCompatActivity {
TextView textView;
Button button;
int var0 = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.main_tv);
button = findViewById(R.id.main_btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (var0 == 1) {
textView.setText("我是被修改過的文字");
} else {
textView.setText("這個時候var0不等于1");
}
}
});
}
}
看一下效果
點擊前:
點擊后:
然后力穗,我們假設(shè),這個app已經(jīng)打包成了apk气嫁。(接下來当窗,我們打包成apk)
第三步:反編譯apk
我們知道,其實說白了,一個apk就是一個壓縮包,只是他將很多東西進(jìn)行了加密绘雁,轉(zhuǎn)成了另一種格式鬼贱。dex文件,交給底層去識別。
我們這一部分的工作就是要解密,然后要看到代碼邏輯。
1简识、首先,我們將打包好的.apk文件改成.zip
2感猛、然后進(jìn)行解壓
3七扰、將我們解壓后的文件里的 classes.dex文件放到 dex2jar中
4、然后執(zhí)行命令
sh d2j-dex2jar.sh classes.dex
(這里有可能會出現(xiàn)權(quán)限問題)
d2j-dex2jar.sh: line 36: ./d2j_invoke.sh: Permission denied
解決方案如下:
sudo chmod +x d2j_invoke.sh
密碼要求是開機(jī)密碼即可(mac)
5陪白、在同一個目錄下生成了一個jar文件
然后用JD-GUI將它打開颈走。
6、查看源代碼咱士,了解邏輯
我們看到立由,源代碼幾乎是一絲不掛的展現(xiàn)到了我們眼前。
第四步:用apktoos修改源代碼
1序厉、我們將apk放到下載好的apktool的文件目錄中锐膜,如圖
我們下載好之后會有兩個文件,apktool.sh 和 apktool.jar弛房,然后加上我們的apk現(xiàn)在一共有三個
2道盏、執(zhí)行命令
sh apktool.sh apktool d APK名字.apk
3、然后我們發(fā)現(xiàn)多了一個文件夾:
我們點進(jìn)去庭再,找到smali目錄
4捞奕、然后根據(jù)應(yīng)用的包名找到相關(guān)目錄
5牺堰、找到相關(guān)的Activity的java文件拄轻,我們的app只有一個頁面,我們知道是MainActivity伟葫,所以我們要打開 MainActivity$1.smali
6恨搓、并且根據(jù)我們的if判斷語句全局搜索
我們找到了這一行
這里稍微普及一下有關(guān)samli的語句:
條件關(guān)鍵字 意思
if-eq 如果等于
if-ne 如果不等于
if-lt 如果小于
if-le 如果小于等于
if-gt 如果大于
if-ge 如果大于等于
if-eqz 如果等于零
if-nez 如果不等于0
if-ltz 如果小于零
if-lez 如果小于等于零
if-gtz 如果大于零
if-gez 如果大于等于零
這里原本是ne,我修改成了eq。這句話的大概意思就是 如果這個變量不等于我的變量p1斧抱,就返回一個東西常拓。
我們根據(jù)java語句的字面意思,將其修改為等于辉浦。
7弄抬、修改完成后記得要保存哦
8、重新打包宪郊,命令:
sh apktool.sh b 剛才生成文件夾的名字 -o 新的apk的名字.apk
我們生成如下:
9掂恕、我們有了新的apk,但是去安裝發(fā)現(xiàn)會出錯弛槐。原因是我們需要重新簽名懊亡。
對于簽名文件,我們用AS生成一個即可乎串。然后放到同一目錄店枣,執(zhí)行以下命令:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名文件名 -storepass 簽名密碼 待簽名的APK文件名 簽名的別名
10、最后得到apk叹誉,然后我們?nèi)ミ\行
第五步:運行盜版apk
我們換用一個模擬器鸯两,來對比其前后的執(zhí)行流程。
點擊前:
點擊后:
那么基本上就大功告成了长豁。這個過程還是很繁瑣的甩卓。
注:
1、這個僅僅是一個入門的簡單教程蕉斜,可能百度上已經(jīng)爛大街了逾柿,但是入門確實很好。
2宅此、很多市面上的apk都會進(jìn)行加固|加殼机错。這一部分水很深,需要很多實戰(zhàn)經(jīng)驗才能得出父腕,這里我也在學(xué)習(xí)弱匪。
3、切勿用于非法用途璧亮。