反编译别人app,我们需要用到一些反编译工具,我们这里用到三个工具:apktool.jar,apktool.bat 、jd-gui、dex2jar
工具可以再网上下载或者https://pan.baidu.com/s/1htWNrfA 密码:7t2i 下载
反编译app首先得有目标app,我创建了一个Dome,一个很简单的显示
有了dome,开始反编译
把apk放到和工具一起,免得切换麻烦 ,我这里统一放到d盘下的fby文件夹里面,
dome放在apk文件夹里面,修改apk后缀为zip,然后解压,可以得到apk的资源文件
可以看到里面有一个classes.dex文件,这个文件就是我们需要看apk内部代码的文件了,里面包含了所有的类,其他如res、AndroidManifest等资源文件如果需要可以去查看(如打开AndroidManifest文件乱码或者打不开,没关系,可以利用apktool工具解apk出来的AndroidManifest文件则可以正常浏览)
这里并不能看到java文件,我们需要用到另外一个工具:dex2jar
把classes.dex文件拷贝到dex2jar根目录下面,然后cd到dex2jar根目录,执行命令 d2j-dex2jar classes.dex,则可以得到jar文件classes-dex2jar.dar,如图:
得到jar文件,就可以看里面的代码啦,利用工具jd-gui.exe打开jar包,代码显示如下
因为创建dome的时候没注意,创建了一个kotlin的dome,不过问题不大,看代码是一样的,(里面的clearFindViewByIdCache和findCachedViewById方法在真是代码里面是隐藏的),得到了所有的代码,就可以在里面看别人代码的实现啦,(如果对方app混淆了的话,就得仔细排查了)
到这里,我们得到了所有的资源文件和类文件,接下来我们需要用到apktool工具,把apk文件拷贝到该文件的同一个目录下面,如:
cd到该目录下面,执行命令
apktool d test.apk,执行完毕之后,如果不出意外,会得到一个text文件夹,打开文件夹,里面内容如下:
打开AndroidManifest.xml文件,可以看到包名以及之前dome里面第一个启动类,如:
看到上面包名为dome.test,第一个启动类为MainActivity,有了这个,我们就很好办了,开始撸代码
新建一个项目,包名设置和目标app一致,在和启动类同一包中新建一个类,为SActivity,并设置为Main 类,新建布局文件activity_s;如下:
进入app后,经过五秒之后调整到MainActivity界面,我这里只是放了一个简单的图片,如果真正的加入广告页面,可以在这个类里面访问接口显示广告等
代码编写好之后,不能直接把类文件放到目标反编译的文件中,我们知道安卓虚拟机运行需要的不是java文件,而是smail文件,如果直接把类文件放到里面去,肯定是GG的
下一步,把最新编写好的代码打包成一个apk,然后反编译这个apk,就可以得到新写的类的smail文件了,过程和上述一样,使用apktool工具,
我这里给apk取名为test_two.apk,故反编译之后文件夹为test_two文件夹,进入smail这个文件夹,来到包名对应下的文件夹下面,测试包名为dome/test,所有我们也进入到dome/testwen文件夹 ,看到有很多.smail文件,我们新增了一个SActivity类,所以只关注SACtivity相关的,如下:
我们看到有SActivity$****文件的,都是属于SActivity里面内部类的编译文件,一起拷贝到我们目标反编译的smail下面的对应文件夹里面,这里为smail/dome/test
然后把对应资源文件也拷贝到相对应的文件夹里面,
拷贝了文件就可以了吗? no,别忘记了,我们还加入资源图片,xml文件和对应的iD呢,所以还得手动的添加对应的R文件索引值
再次来到目标的反编译之后的文件夹中,可以看到里面有很多R$**.smail文件,首先找到R$layout.smail文件,用文本方式打开,如下:
可以看到里面有很多的值,我们把我们新加的activity_s手动添加进去
.field public static final activity_s:I = 0x7f09003f (注意值为唯一值,并且0x7f开头,具体资源ID值命名可在网上查阅)
如上,将start图片id已经xml文件里面定义的控件id添加进去
添加好之后还不行,还得需要来到value文件夹里面,找到public.xml文件,文本形式打开,打开之后如下:
可以看到里面定义了对应的类型和值,把刚刚我们添加的布局文件,drawable资源id以及控件id等手动添加进去
<public type="drawable" name="start" id="0x7f060073" />
<public type="id" name="image" id="0x7f070090" />
<public type="id" name="time" id="0x7f070091" />
<public type="layout" name="activity_s" id="0x7f09003f" />
添加之后并没完,还得改一个地方 来到res文件夹下面的value文件夹,文本形式打开ids.xml文件,看到如下数据
因为我们是自己定义的id,而不是使用系统里面的id,所有我们需要将我们定义的id添加进去,否则app运行的时候,会报找不到id错误:
<item type="id" name="image">false</item>
<item type="id" name="time">false</item>
定义id之后,我们再需要到到新增类里面的smail文件里面把原来应用了资源的值替换成我们手动添加的即可,具体值可以参照你反编译自己新建的项目apk里面的值,找到值对应的资源名称,然后在原apk里面找到自己对应的资源名称自定义的值替换即可
到此,资源修改差不多完成了,接着我们修改AndroidManifest.xml文件,修改启动类,然后再声明一个activity用来装载原来的Activity,如下:
到此,所有的文件修改完成,进行二次打包,二次打包过程和反编译目标app差不多,只是命令变成 apktool b 文件夹名字 -o new.apk
我这里为 apktool b test -o new.apk
执行完毕之后,如下
会在文件夹里面出现一个new.apk文件,注意,这个apk是不能安装的,因为还没对其签名,开始签名,把签名文件一起放到这个目录下面
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 签名文件名 -storepass 签名密码 待签名的APK文件名 签名的别名
签名完成之后,可输入一下命令检测是否签名成功
jarsigner -verify -verbose -certs 签名apk名称
到此,反编译完成
有不对之处----望指正