最近研究了下反编译smali代码注入 实现自己的功能
简单的注入Toast log代码 比较简单 网上都是 但是没有找到加入第三方广告sdk的例子 下面就以hao123广告注入说下自己的经验 其实规律很简单
hao123广告 需要的代码 (此处只是为了知道哪些地方改变了)
1.AndroidManifest.xml 权限 以及活动 服务 广播
2.res-drawable-xhdpi 新加一张图片
3.res-layout 新加两个布局文件
4.res 目录下 新加个raw文件 里面包含hao123cid.ini文件
5.MainActivity追加 HaoAgent.getInstance(this).init();初始化调用代码
准备工作 新建个最简单的hello_world工程 反编译 同时 hello_world工程加入hao123广告代码 反编译 对比不同
应用市场下载个apk文件(没有混淆) 用apktool反编译
1 首先这里的清单文件追加需要的代码 <original文件夹中的清单文件无需理会>
2 original --- META-INF文件夹中通常有
CERT.RSA CERT.SF MANIFEST.MF三个文件
前面两个文件是安卓项目签名文件 最后那个自行百度 我就不多说了
这三个文件可以全部删除
3.根目录 res文件夹
这里对应的文件夹追加对应的资源文件 直接拷贝即可 <如果没raw文件夹 整个文件夹拷贝即可>
重点来了 打开values文件
在ids.xml文件中追加改变的代码
<item type="id" name="fapk_bimg_bg_background">false</item>
<item type="id" name="fapk_img_bg_background">false</item>
在public.xml文件下追加需要的代码
此处要重点注意
如:
<public type="layout" name="activity_main" id="0x7f030000" />
<public type="layout" name="hao123_notification_fapk_bimg_bg" id="0x7f030001" />
<public type="layout" name="hao123_notification_fapk_img_bg" id="0x7f030002" />
代码 activity_main是都有的 下面的两个layout是需要新加的 看出变化了没 对 简单的id自增即可
如果没有的文件 比如我反编译的apk这里没有raw 但是我们又需要新追加raw 那这个id怎么办呢
简单 你可以自己新加个Id 比如layout全是 0x7f03开头 那么0x7f04即可
这里的id很重要 必须唯一 可以理解为安卓工程中的r文件
4.返回根目录 下面需要修改smali里面的代码了
在com里面把baidu文件夹全部拷贝过来 baidu文件夹既是hao123广告里面的jar包
5 在smali中 搜索R$layout.smali文件 即可找到项目的资源文件 一般项目的资源文件都在一起 这里需要注意根据目录区分是库文件的资源文件 还是项目本身的资源文件
找到这个资源文件
打开追加自己的代码 比如hao123多了两个布局文件 那么我们在R$layout.smali里面
追加这两个布局文件 注意 此处的id即为上面public.xml里面我们写入的id id一定要一致!
依次完成其他代码的追加 比如 R$drawable.smali R$id.smali等
同时这里需要注意一点 R.smali和R$raw.smali文件
没有R$raw.smali文件 那么直接拷贝 但是需要注意更改项目路径 同时 R.smali 追加raw引用代码
5.到这里 那么就差最后一步了 没错 即是MainActivity中的代码!
根据清单文件 查看项目启动活动 的路径 可以直接找到这个活动文件 (此处看你想把代码加在那个地方了)
找到onCreate方法 这里你可能会头大吧 看不懂这个代码啊 没关系 只要了解基础语法就行了
.line 16
invoke-static {p0}, Lcom/baidu/hao123/union/HaoAgent;->getInstance(Landroid/content/Context;)Lcom/baidu/hao123/union/HaoAgent;
move-result-object v1
invoke-virtual {v1}, Lcom/baidu/hao123/union/HaoAgent;->init()V
.line 18
const-string v1, "Hao123\u8054\u76df\u670d\u52a1\u542f\u52a8\uff01"
const/4 v2, 0x1
invoke-static {p0, v1, v2}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
我要追加的代码就是上面的了 <对比找出> 直接丢进oncreate中 同时记得 oncreate方法的第一句.locals 3 即是这个方法声明3个内存空间 p0 v0 v1 自行百度smali的基本语法
OK!成了 重新用apktool打包 APKSign重新签名 那么就可以运行了
反编译的代码怎么整 什么规律 以后有时间研究下
当然请尊重别人的果实 以上代码只是个人兴趣 随意而为