1.前言

作为一个Android 程序猿,如果没有反编译过别人的apk,那有可能你是个假的程序猿~我们反编译别人apk可能是想看看别人优美的界面是怎么写的,或者是去获取别人的资源文件,又或者是看看某个功能是怎么实现的。记得在大学里,参加一个软件创新大赛,当时缺少图片素材,只好无奈去反编译apk获取。

2.反编译工具

3.准备工作

我们准备一个反编译所需要的apk文件,这里我自己写了一个

xlua 反编译 反编译入门_xlua 反编译


登录功能一般是应用的入口,如果我们没有用户名和密码就进不去。

看到这里,大家可能想笔者肯定是想通过反编译来实现绕过登录功能。

错了,笔者今天重点要介绍的是如何通过反编译在这个登录页面添加一个View并实现相应的功能。附带内容:

  • 反编译实现更换应用图标
  • 反编译实现添加资源文件
  • 反编译实现添加View并实现点击事件
  • 反编译实现修改功能
  • 用ApkTool工具重新打包应用

一.反编译实现替换应用图标

1.通过apkTool工具将apk反编译生成一个文件夹。

进入cmd下切换到apktool目录下,输入apktool.bat d D:\apkTool\test.apk,会在apktool目录下生成一个test文件夹,如下是test文件夹的内容:(res:资源文件、smali:跟汇编类似的机器代码,如果需要添加四大组件,则需在AndroidManifest.xml下添加声明)

xlua 反编译 反编译入门_smali_02

2.在生成的这个目录里找到res文件夹,进去后你会发现跟我们eclipse或as工程下的res文件夹结构一样,然后在对应目录下将应用图标换掉即可。(注意:图片格式一定要和原图片格式一样,不然会有莫名的错误)

二.反编译实现添加资源文件

比如我们想在strings.xml下添加一个字符串并在代码中引用,大家可能就说这个简单呐,在strings.xml里加上一个字符串声明,然后在smali文件中引用就好了,然后编译成smali文件时候,啪,报错了,打包成apk不成功,那么正确的做法是什么呢?

1.在res/values/strings.xml里添加一个字符串,如下:(笔者添加了一个注册)

xlua 反编译 反编译入门_反编译_03

2.在res/values目录下找到一个public.xml文件打开,找到最后一个String类型的一条,如下图一所示,它的id为0x7f060024,这些id是系统自动生成的,那么我们添加一个字符串就需要在这里手动生成一个id并且这个要唯一,默认在最后一个string的id加1就行,如下图二所示:(注意:name要和strings.xml声明的name一致)

图一:

xlua 反编译 反编译入门_smali_04

图二:

xlua 反编译 反编译入门_smali_05

3.在smali文件夹下根据包名去找到R文件,如下图一,其中R$string.smali的美元符号 表示内部类的意思。在string.smali文件里添加一条,如图二。

图一:

xlua 反编译 反编译入门_smali_06

图二:

xlua 反编译 反编译入门_反编译_07

三.反编译实现添加View并实现点击事件

如我们想在登录界面添加一个注册按钮,那该怎么添加呢?

1.在res/layout/activity_main.xml里添加一个按钮,如下:

xlua 反编译 反编译入门_android_08

2.在res/values/ids.xml里添加声明,如下:

xlua 反编译 反编译入门_android_09

3.在res/values/public.xml里找到最后一条id的条目,添加一条记录,并且id要唯一,如下:

xlua 反编译 反编译入门_android_10

4.在smali文件夹里根据包名找到R文件,在R的id.smali文件下添加声明,如下图,到此所有的准备都做完了,下面就是修改smali文件添加这个注册按钮的点击事件。

xlua 反编译 反编译入门_xlua 反编译_11

5.在smali文件夹里根据包名找到MainActivity.smali文件,打开它,然后搜索onCreate,如下图一,我们可以看到findViewById这个字眼,我们可以跟着写,对新加的按钮设置文字,如下图二,在这里,一定要注意寄存器的使用,一不小心就出错了,如果不懂smali语法的,可以回头看一下smali语法整理

图一:

xlua 反编译 反编译入门_反编译工具_12

图二:

xlua 反编译 反编译入门_smali_13

设置完文字后,接着就可以开始设置注册按钮的功能了,如下图,这里点击事件是直接跳转另外一个页面,MainActivity$1是一个内部类,onclicklistener的实现类。

xlua 反编译 反编译入门_反编译_14

4.反编译实现修改功能

如果我们想绕过登录直接进入应用,那么此时我们肯定想到去改登录逻辑,打开MainActivity.smali文件,搜索setOnclickListener,可以看到就是登录按钮设置的点击事件,但是登录的逻辑呢?在MainActivity$1.smali文件中,找到onClick方法中关键部分,笔者加上了注释,如下图:

xlua 反编译 反编译入门_反编译_15

那么我只要把跳转的逻辑搬到cond_0那里不就ok了嘛,我们试试:

xlua 反编译 反编译入门_反编译工具_16

5.用ApkTool工具重新打包应用

上面都是在修改资源文件,修改smali文件,我们改完怎么看效果呢?这个时候,就需要用强大的ApkTool工具重新打包应用了,在cmd下进入ApkTool目录,输入:apktool.bat b -f D:\apkTool\test(D:\apkTool\test这个目录是之前反编译生成的目录),如果我们修改没问题的话,就会在test目录下生成一个文件夹dist,在该文件夹里就是反编译后生成的apk文件。

xlua 反编译 反编译入门_xlua 反编译_17

此时,你肯定长叹一口气,我滴神呐!终于反编译完成了!

老铁,且慢,这时生成的apk还是不能用的,因为这是裸包,还没签名,系统是不会让你装的。

那么我们开始签名吧,怎么签名呢?同样还是用ApkTool工具,在cmd下进入ApkTool目录,输入:jarsigner -verbose -keystore 签名文件路径 -signedjar 签名后apk的路径 未签名apk的路径 签名别名,如下图:

xlua 反编译 反编译入门_smali_18

xlua 反编译 反编译入门_反编译工具_19

签名完成后,我们安装已签名的apk,看看运行结果,是不是达到了自己想要的效果。

xlua 反编译 反编译入门_反编译工具_20

到此,smali反编译方法就讲完了,相信大家会有一点点的收获