<div align =center>Android逆向工程 实践篇 二</div>
今天做了一个小实验. 随便下载了一个apk.替换首页的图片, 原来的apk是静态的图片. 我要给它换成网络动态加载的图片.
六步骤:
1: 用ApkIDE把apk反编译.
2: 找到启动的Activity.
3: 修改资源.
4: 写图片加载的代码.
5: 测试.
6: 打包,收工.
一: 解包###
把下载好的apk使用工具解包.

二: 找到启动的页面###
首先,大家应该看AndroidManifest.xml确定第一个界面是哪个Activity.

图片中圈出来的地方是标志为启动app的时候第一个启动的页面, 既然我们是要修改启动的图片,那么肯定是重这里入手. 这个Activity名字叫: loginActivity, 我们打开这个看看.
三: 改资源###
在看Activity之前我们应该先去它的xml布局里面看看有什么东西.



运气还不错. 一下子就找到了启动的时候加载的图片了. 我圈出来的地方就是加载在首页的图片. 我们想改掉这个图片. 那么就需要在启动的时候用代码从网络上面下载图片加载到这个控件上. 那么...懵逼了..得去看看LoginActivity的smali了.我门先定位初始化控件的地方.一起来看代码把...
为了可以在首页上加一个图片显示, 我需要在xml里面有一个图片显示的控件,大家注意到了有一个ImageView控件, 这个控件正好加载我们的网络图片.而我看了LoginActivity的代码后, 实际上这个控件是没有被使用的.着正和我意..

得到了控件的id, 我们就来一个搜索大法.

得到id的十六进制值后我们再搜索一次.

工具用得真爽...

这里是初始化控件的地方.
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句话
第一句:控件的十六进制id值.赋值给v0.
第二句:通过id去找到控件.p0是上下文.
第三句:把找到的结果返回到v0上.
第四句:将v0寄存器中的对象引用转换成指定的类型. 就是图片控件了.
第五句:R就是我们的imageView控件了.这个时候我们已经找到了我们需要显示图片的控件. 下一步就是把网络上的图片显示到控件上.因此我开发了一个imageLoad类来实现这个功能.
四: 写代码###

截图上面的3个类实际上是一个imageLoad.java被编译后生成的imageLoad$1$1/imageLoad$1 这2个是内部类.
我们这样使用.

直接把方法写成静态的,方便调用. 图中圈出来的就是加载图片的方法. 参数1: 上下文. 参数2: 图片对象.
把控件传进去,下载好图片后直接显示在控件上就完成了我们的事情了...
五: 运行测试###
我这里的网络令我抓狂...所以随便测试一下.(图片是gif不知道能不能播放.)

六: 打包###
打包直接使用ide打包. 打包后会生成一个apk.

原来的样子###

现在的样子###

到这里为止,这个apk已经搞定了. loadImage具体实现就不说了.很简单..就是下载一个图片加载到控件上面.
网友评论