<div align =center>Android逆向工程 實(shí)踐篇 二</div>
今天做了一個(gè)小實(shí)驗(yàn). 隨便下載了一個(gè)apk.替換首頁的圖片, 原來的apk是靜態(tài)的圖片. 我要給它換成網(wǎng)絡(luò)動(dòng)態(tài)加載的圖片.
六步驟:
1: 用ApkIDE把a(bǔ)pk反編譯.
2: 找到啟動(dòng)的Activity.
3: 修改資源.
4: 寫圖片加載的代碼.
5: 測試.
6: 打包,收工.
一: 解包###
把下載好的apk使用工具解包.
二: 找到啟動(dòng)的頁面###
首先,大家應(yīng)該看AndroidManifest.xml確定第一個(gè)界面是哪個(gè)Activity.
圖片中圈出來的地方是標(biāo)志為啟動(dòng)app的時(shí)候第一個(gè)啟動(dòng)的頁面, 既然我們是要修改啟動(dòng)的圖片,那么肯定是重這里入手. 這個(gè)Activity名字叫: loginActivity, 我們打開這個(gè)看看.
三: 改資源###
在看Activity之前我們應(yīng)該先去它的xml布局里面看看有什么東西.
運(yùn)氣還不錯(cuò). 一下子就找到了啟動(dòng)的時(shí)候加載的圖片了. 我圈出來的地方就是加載在首頁的圖片. 我們想改掉這個(gè)圖片. 那么就需要在啟動(dòng)的時(shí)候用代碼從網(wǎng)絡(luò)上面下載圖片加載到這個(gè)控件上. 那么...懵逼了..得去看看LoginActivity的smali了.我門先定位初始化控件的地方.一起來看代碼把...
為了可以在首頁上加一個(gè)圖片顯示, 我需要在xml里面有一個(gè)圖片顯示的控件,大家注意到了有一個(gè)ImageView控件, 這個(gè)控件正好加載我們的網(wǎng)絡(luò)圖片.而我看了LoginActivity的代碼后, 實(shí)際上這個(gè)控件是沒有被使用的.著正和我意..
得到了控件的id, 我們就來一個(gè)搜索大法.
得到id的十六進(jìn)制值后我們再搜索一次.
工具用得真爽...
這里是初始化控件的地方.
const v0, 0x7f0c0085
invoke-virtual {p0, v0}, Lcom/iptv/romance/LoginActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/ImageView;
iput-object v0, p0, Lcom/iptv/romance/LoginActivity;->R:Landroid/widget/ImageView;
很簡單, 只有5句話
第一句:控件的十六進(jìn)制id值.賦值給v0.
第二句:通過id去找到控件.p0是上下文.
第三句:把找到的結(jié)果返回到v0上.
第四句:將v0寄存器中的對象引用轉(zhuǎn)換成指定的類型. 就是圖片控件了.
第五句:R就是我們的imageView控件了.這個(gè)時(shí)候我們已經(jīng)找到了我們需要顯示圖片的控件. 下一步就是把網(wǎng)絡(luò)上的圖片顯示到控件上.因此我開發(fā)了一個(gè)imageLoad類來實(shí)現(xiàn)這個(gè)功能.
四: 寫代碼###
截圖上面的3個(gè)類實(shí)際上是一個(gè)imageLoad.java被編譯后生成的imageLoad$1$1/imageLoad$1 這2個(gè)是內(nèi)部類.
我們這樣使用.
直接把方法寫成靜態(tài)的,方便調(diào)用. 圖中圈出來的就是加載圖片的方法. 參數(shù)1: 上下文. 參數(shù)2: 圖片對象.
把控件傳進(jìn)去,下載好圖片后直接顯示在控件上就完成了我們的事情了...
五: 運(yùn)行測試###
我這里的網(wǎng)絡(luò)令我抓狂...所以隨便測試一下.(圖片是gif不知道能不能播放.)
六: 打包###
打包直接使用ide打包. 打包后會(huì)生成一個(gè)apk.
原來的樣子###
現(xiàn)在的樣子###
到這里為止,這個(gè)apk已經(jīng)搞定了. loadImage具體實(shí)現(xiàn)就不說了.很簡單..就是下載一個(gè)圖片加載到控件上面.