安全测试-App反编译实践篇记录

一、么是Android反编译

        我们在手机下载的AndroidApp安装包是Apk文件(AndroidApplicationPackage)。通过Apk文件,我们也可以得到这个应用的代码和资源文件,对应用进行修改。我们如何获取这些文件,这就需要Android反编译技术。计算机逆向工程(Reverseengineering)也称为计算机软件还原工程,是指通过对apk软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出apk产品所使用的思路、原理、结构、算法、等要素,某些特定情况下可能推导出源代码。

二、Android反编译工具

        Android应用程序只是一个数据和资源的归档文件。就算是这样,也不能把解压缩归档包.apk来获得可读的源代码。对于这些情况,我们必须依赖于将字节代码(如在classes.dex中)转换为可读源代码。

三、什么是dex文件

        dex是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。由于dalvik是一种针对嵌入式设备而特殊设计的java虚拟机,所以dex文件与标准的class文件在结构设计上有着本质的区别。当java程序编译成class后,还需要使用dx工具将所有的class文件整合到一个dex文件,目的是使其中各个类能够共享数据,在一定程度上降低了冗余,同时也是文件结构更加紧凑,实验表明,dex文件是传统jar文件大小的50%左右

dex2jar简介

dex2jar可以将字节码.dex文件转换为可读的.jar文件。下载安装电脑上首先必须安装配置好Java环境,点击下载地址:dex2jar下载地址,https://github.com/pxb1988/dex2jar/releases下载后直接解压即可,解压后可以看到如下图所示文件内容:

四、执行编译

  1. 用压缩软件打开apk包,然后将classes.dex文件解压出来放置到我们解压的dex2jar文件目录中。假如包中有classes.dex classes2.dexclasses3.dex classes4.dex...等多个类似的文件,这是因为apk中方法数超过了65536个,使用了multidexsupportlibrary将一个apk中的dex文件分割成多个dex文件的缘故。相关知识可以搜索android65k来进行了解。                              详细操作:一个APK中包含多个dex方法 - 简书 可以去这个网址了解一下

    那么下面的展示是一个classes.dex的操作内容

classes.dex 复制放置在dex2jar文件目录下

 

2.打开cmd窗口进入dex2jar目录中,执行命令:d2j-dex2jar.bat classes.dex 即可完成编译。

如果想覆盖已经生成的classes-dex2jar.jar文件,可以添加参数--force

3.解压完成之后我们可以看到多了一个文件,这个是刚才操作生成的classes-dex2jar jar包

此时需要利用工具对该jar包进行预览。

五、JD-GUI

        JD-GUI是一个独立的图形实用程序,显示.class文件的Java源代码。您可以使用JD-GUI浏览重建的源代码,以立即访问方法和字段。下载地址:Java Decompiler

        安装完成之后启动JD-GUI,将上面生成的classes-dex2jar导入进来,依次点击File-Openfile加载之后可以看到如下所示界面:

 

        一般App为了保障安全都会进行代码混淆或加密,所以一般反编译的代码都是经过混淆的代码不能直接看到原始代码。

六、Apktool简介

        APKTool是GOOGLE提供的APK编译工具,能够反编译及回编译apk,同时安装反编译系统apk所需要的framework-res框架,清理上次反编译文件夹等功能。需要java支持 。与JD-GUI相比,Apktool的主要优点是它是双向的。这意味着如果你反编译一个应用程序并修改它,然后使用Apktool重新编译它,它能重新编译,并生成一个新的.apk文件。然而,dex2jarJD-GUI不能做类似功能,因为它提供近似代码,而不是准确的代码。

下载安装

这里以Windows为例,其他环境请参考:Apktool - How to Install

*下载apktool.bat打开页面后另外为文件名命名为:apktool.bat保存类型选择所有文件。*下载apktool.jar选择最新版本下载然后重命名为apktool.jar·

*创建文件夹自定义名称,如apktool,然后将apktool.batapktool.jar放置在该文件夹中。

·安装JDK1.8以上版本。验证是否安装成功可以打开cmd进入到apktool文件目录,然后输入命令apktool看到如下提示说明安装成功

问题,如果遇到该提示,麻烦重新检查一下java的版本和重新配置一下环境变量

向编译

        apktool编译命令apktoold[path][app-name].apkd标志表示反编译(decode)。

编译完成后会生成和apk包名一样的文件夹,文件夹里面包含资源文件和代码的文件。 

打包编译

        当修改反编译后的文件或者代码之后,我们可以调用命令:apktool b[path][target-app-name].apk重新打包生成apk文件

*b表示build·

*kaoyan3.1.0表示上面反编译的文件名称·

*o表示指定生成的apk文件名称

签名

生成签名文件

        上面打包编译生成的apk还不能直接安装,因为没有签名。因此还需要签名,我们可以自己成一个签名文件,首先需要安装好jdk环境。使用keytool命令可以生成签名文件,操作如下:·

-genkey产生证书文件·

-alias产生别名·

-keystore指定密钥库的.keystore文件·

-keyalg指定密钥的算法,这里指定为RSA(非对称密钥算法)·

-validity为证书有效天数,这里我们写的是20000

有部分人可能会遇到:'keytool' 不是内部或外部命令,也不是可运行的程序

这个问题解决很简单

把jdk\bin 加入环境变量即可

然后输入指令:

keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

行完成之后会生成android.keystore签名文件

 

行签名

执行签名操作如下:

又遇到类似问题 ,解决方法重新安装java,重新配置路径解决。

解决以上问题

行签名

执行签名操作如下:

jarsigner -verbose -keystore android.keystore -signedjar new_cyy.apk new_cy.apk android.keystore

-verbose指定生成详细输出·

-keystore指定数字证书存储路径·

-signedjar指定要签名的apk文件·

new_kaoyan-signed.apk指签名后的apk文件名·

new_kaoyan.apk原来的apk文件名·

android.keystore别名

        这样,就完成了对一个apk的签名过程,然后就可以安装使用了。

        注意:如果你的手机上原来就有这个apk,需先卸载,不然签名冲突无法安装。

操作难免会遇到各种各样的环境问题,遇到问题不要慌可以把问题抛出来大家一起解决

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值