二、漏洞原理 ART虚拟机在加载并执行一个文件时,会首先判断这个文件的类型。如果这个文件是一个Dex文件,则按Dex的格式加载执行,如果是一个APK文件,则先抽取APK中的dex文件,然后再执行。...总而言之,Android在加载执行代码时,只认文件头,而安装验证签名时只认文件尾。 因此只要构造一个APK,从其头部看是一个Dex文件,从其尾部看,是一个APK文件,就可以实施攻击。...很显然,v2版本要比v1更加严格,安全性会高很多。 但遗憾的是,Android从7.0开始才引入v2签名。之前的所有Android系统只能验证v1签名的app,即使这个app也用V2签名了。...表4 v1 v2签名对比 对于android 7.0以上,系统在校验签名是会先检查是否存在V2签名方案,若存在,则通过V2签名方案对APK进行校验,否则使用V1签名方案对APK进行校验。 ?...图4 Android v2签名流程 对于android 7.0以下的系统,不支持V2签名方案,所以APK在签名时最好将两种签名方案都支持。
总而言之,Android在加载执行代码时,只认文件头,而安装验证签名时只认文件尾。 因此只要构造一个APK,从其头部看是一个Dex文件,从其尾部看,是一个APK文件,就可以实施攻击。...directory中的每一项,获取每个文件的 local file header,最后通过 local file header 获取每个文件的内容。...很显然,v2版本要比v1更加严格,安全性会高很多。 但遗憾的是,Android从7.0开始才引入v2签名。之前的所有Android系统只能验证v1签名的app,即使这个app也用V2签名了。...表4 v1 v2签名对比 对于android 7.0以上,系统在校验签名是会先检查是否存在V2签名方案,若存在,则通过V2签名方案对APK进行校验,否则使用V1签名方案对APK进行校验。...图4 Android v2签名流程 对于android 7.0以下的系统,不支持V2签名方案,所以APK在签名时最好将两种签名方案都支持。
使用APK签名方案v2进行签名时,会在APK文件中插入一个APK签名分块,该分块位于“ZIP中央目录”部分之前并紧邻该部分。...在“APK签名分块”内,v2签名和签名者身份信息会存储在APK签名方案v2分块中。...找到“APK 签名分块”中的第一个“APK 签名方案 v2 分块”。如果 v2 分块存在,则继续执行第 3 步。否则,回退至使用 v1 方案验证 APK。...对“APK 签名方案 v2 分块”中的每个 signer 执行以下操作: 从 signatures 中选择安全系数最高的受支持 signature algorithm ID。...使用时间点 必须在应用构建过程中的两个特定时间点之一使用 zipalign,具体在哪个时间点使用,取决于所使用的应用签名工具: 如果使用的是 jarsigner,则只能在为 APK 文件签名之后执行 zipalign
下面也将以自己应用方式演示 2.具体使用过程 (1)生成apk文件并安装 自己的应用,在Android7.0以下手机测试时,直接生成apk即可,不需额外操作。...在apk文件的META-INF文件夹.sf文件中开头有X-Android-APK-Signed: 2,表明是使用了v1+v2签名,没有则是v1签名。...该漏洞可以绕过签名校验的两个条件: (1)应用apk(v1签名)安装时的签名校验,是解压apk,执行文件和目录的校验;未在zip目录中的数据不做处理 (2)应用执行时,虚拟机可直接执行Dex文件和apk...再修改dex文件的大小和校验值。 修复建议: 注意使用v1和v2混合签名。单纯的v2的签名在Android7.0以下是不支持的。...apk签名v2方案是Android 7.0时推出的,和v1方案的区别主要是不再需要解压apk,而是直接校验apk文件,除了签名信息块外,所有对apk文件的修改都会被检测出来,此时该漏洞添加dex文件的方式不再有效
影响范围: Android 5.0-8.0且使用Signaturescheme V1签名的APK文件,不影响Signaturescheme V2 自测: ?...0x01 漏洞原理 Android在4.4引入ART虚拟机,相比较于Dalvik虚拟机仅能运行包装于apk中的dex文件,ART还允许直接运行优化后的dex文件。...因此根据以上两点,攻击者可以通过将恶意dex文件置于apk文件的头部(如上图所示),在系统安装apk文件时,系统安装器解压zip时并没有先判断apk文件的头部magic字段,直接默认是apk(zip)文件...,从而直接从文件尾部进行读取解压,此时签名没有任何变化,因此可欺骗系统,从而进行安装。...攻击关键点是当用户点击运行apk时,系统ART虚拟机会去判断文件头部的magic字段,从而使用不同的策略执行文件,由于该apk文件头部被修改为恶意dex,因此art虚拟机直接执行恶意dex文件。
APK 打包器将 DEX 文件和编译后的资源合并到一个 APK 中。不过,在将应用安装并部署到 Android 设备之前,必须先为 APK 签名。 3.....class 一起通过dx工具打包成dex文件 5.apkbuilder(生成未签名apk) apkbuilder工具会将所有没有编译的资源、.arsc资源、.dex文件打包到一个完成apk文件中 tips...得到一个签名后的apk(signed.apk) apksigner 是google 退出的V2签名方式 Jarsigner 是之前一直使用的V1签名方式 可以通过在命令行中输入apksigner --...help来获取详情信息,如果沒有特殊需求,使用下面命令即可完成签名 ${ANDROID_HOME}/build-tools/28.0.3/apksigner sign --ks **.keystore...apk文件时的速度会更快。
用apktool对apk进行解包,解包后的文件夹更名为test,文件夹导入Eclipse 2. test.apk用WinRAR打开,提取classes.dex文件到dex2jar文件夹.../CERT.RSA文件存放apk的数字签名信息。...导出apk的源代码 test.apk用WinRAR打开,提取里边的classes.dex文件到dex2jar目录,执行cmd命令 d2j-dex2jar.bat classes.dex -o test.jar...(图片省略) apk签名 本案例使用android_nixiang工具完成apk的签名 autosign工具的使用需要.keystore .pk8 .pem三个文件,参考:https://blog.csdn.net...127.0.0.1:62001 # 使用62001端口连接模拟器设备 adb root # 获取模拟器设备root权限 adb push [本地文件路径] [模拟器文件路径]
在我们的 Dex 文件中,大多数方法引用属于android.support软件包,因此我们将要去除该支持库。具体做法为: 从build.gradle中彻底清除依赖块。...在 APK Analyser 中,v2 签名并不可见,因为它在 APK 文件本身中以二进制块的形式存在。v1 签名是可见的,它是以CERT.RSA 和 CERT.SF文件的形式给出。...签名 大小(字节) v1 3511 v2 3307 看上去从此以后我们使用的是 v2。 下面的操作将无需 IDE 的支持 现在我们要手工编辑我们的 APK 了。我们将使用如下命令: # 1\....总而言之,gradle 生成了一个未签名的归档文件,zipalign 更改了未压缩资源的字节对齐方式,用于改进加载 APK 时的 RAM 使用,最后 APK 将被加密签名。...(优化为 1757 字节,削减 1%) 让我们查看一下最终的 APK。 ? 终归,我们使用 v2 签名在 APK 中留名。让我们创建一个利用压缩破解的新密钥库。 ? 这可削减 20 个字节。
,需要将AIDL 转换成Jave代码; 将Java代码编译成.class字节码文件; 使用dex工具将.class文件转换成Dalvik 字节码,也就是.dex文件; 通过ApkBuilde工具将.dex...文件和其它资源文件打包成未签名的apk; 通过签名工具给apk签名,v1签名使用jarsigner、v2签名使用apksigner(sdk 25版本开始提供) Android的打包流程可以查看:Android...keytool -printcert -file CERT.RSA 除了使用命令方式外,我们还可以使用工具来察看,如macOS的fHash等软件,将apk文件拖到软件中即可,如下所示。...但是,单独给一个未签名的apk签名,就需要借助签名工具,v1签名是使用jarsigner,v2签名是使用apksigner。...] [需要签名的apk路径] -digestalg [摘要算法的名称如SHA1] -sigalg [签名算法的名称如MD5withRSA] [证书别名] 例如,我有一个签名文件叫 demo.keystore
,需要将AIDL 转换成Jave代码; 将Java代码编译成.class字节码文件; 使用dex工具将.class文件转换成Dalvik 字节码,也就是.dex文件; 通过ApkBuilde工具将.dex...文件和其它资源文件打包成未签名的apk; 通过签名工具给apk签名,v1签名使用jarsigner、v2签名使用apksigner(sdk 25版本开始提供) Android的打包流程可以查看:Android...keytool -printcert -file CERT.RSA 除了使用命令方式外,我们还可以使用工具来察看,如macOS的fHash等软件,将apk文件拖到软件中即可,如下所示。 ?...但是,单独给一个未签名的apk签名,就需要借助签名工具,v1签名是使用jarsigner,v2签名是使用apksigner。...] [需要签名的apk路径] -digestalg [摘要算法的名称如SHA1] -sigalg [签名算法的名称如MD5withRSA] [证书别名] 例如,我有一个签名文件叫 demo.keystore
如果使用的是 jarsigner,只能在为 APK 文件签名之后执行 zipalign。 下面具体聊聊两种签名工具。...但是缺点也很明显,META-INFO文件夹不会被签名,所以美团针对这种签名方式设计了一种多渠道打包方案: 利用pythone在META-INFO文件夹中创建一个文件,其名称就是渠道名,然后用java去读取文件名获取渠道...v2签名 Android7.0之后,推出了v2签名,为了解决v1签名速度慢以及签名不完整的问题。 apk本质上是一个压缩包,而压缩包文件格式一般分为三块: 文件数据区,中央目录结果,中央目录结束节。...而v2要做的就是,在文件中插入一个APK签名分块,位于中央目录部分之前,如下图: ? 这样处理之后,文件就完成无法修改了。...v3签名 Android 9 推出了v3签名方案,和v2签名方式基本相同,不同的是在v3签名分块中添加了有关受支持的sdk版本和新旧签名信息,可以用作签名替换升级。
如 RSA 作为数字签名方案使用时,它的使用流程如下:这种签名实际上就是用信源的私钥加密消息,加密后的消息即成了签体;而用对应的公钥进行验证,若公钥解密后的消息与原来的消息相同,则消息是完整的,否则消息不完整...打包生成APK文件 所有没有编译的资源,如images、assets目录下资源(该类文件是一些原始文件,APP打包时并不会对其进行编译,而是直接打包到APP中,对于这一类资源文件的访问,应用层代码需要通过文件名对其进行访问...);编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中。...Android签名方案 Android 系统从诞生到现在的1.0版本,一共经历了三代应用签名方案,分别是v1、v2和v3方案。 v1 方案:基于 JAR 签名。...也就是说设备上安装了一个使用 v1 签名的 APK,可以使用 v2 签名的 APK 进行覆盖安装,反之则不允许。 以上就是本文的全部内容,希望对大家的学习有所帮助。
所以如果想继续使用上述方案,需要关闭Gradle Plugin中的V2签名选项,禁用V2签名。...因此在校验时,需要先解压出原始文件,才能进行校验。而解压操作无疑是耗时的。 2) V1签名仅仅校验APK第一部分中的文件,缺少对APK的完整性校验。...V2签名机制 不同于V1,V2签名会生成一个签名块,插入到APK中。因此,V2签名后的APK结构如下图所示: APK签名块位于中央目录之前,文件数据之后。...因为,我们V2签名块中的数据摘要是针对APK的文件内容块、中央目录和EOCD三块内容计算的。...但是在写入签名块后,修改了EOCD中的中央目录偏移量,那么在进行V2签名校验时,理论上在“数据摘要校验”这步应该会校验失败啊!但是为什么V2签名可以校验通过那?
它们的作用分别是: apktool : 对apk文件进行解包,可解析出res资源,代码可解为smali格式。也可 dex2jar : 可将apk包中的classes.dex转为jar包。...2、先用压缩软件如Winrar打开apk包,解压出classes.dex文件,然后运行命令“d2j-dex2jar.bat classes.dex”,如果成功即可在当前目录下看到classes_dex2jar.jar...重新打包 apktool同时也用来将解包后的资源重新打包为apk,另外还需要签名工具signapk.jar,以及签名所需的key文件。...不过这个apk还无法直接安装,Android上的app都要经过签名后方可正常使用。...具体执行指令时,smali都要把参数放入寄存器中,然后再对寄存器进行运算。
移动安全公司GuardSquare的研究团队发现,该漏洞存在于Android操作系统读取应用程序签名的机制中。...对于APK和DEX文件,这些字节的位置是不同的,研究人员发现他们可以在APK中注入DEX文件,Android操作系统仍然会认为它正在读取原始的APK文件。...这是因为DEX的插入过程不会改变Android检查完整性的字节,而且文件的签名也不会改变。研究人员把这个漏洞称为Janus。...此外,由于更新后的应用程序会继承原来应用程序的权限,所以通过这种方法,恶意软件可以通过替换应用来获取敏感权限。...根据GuardSquare的报告,Janus漏洞只影响使用v1签名方案签名的应用程序。使用签名方案v2签署的应用不受影响。 另外,Janus仅影响运行Android 5.0及更高版本的设备。
Java 接口文件; 通过 Java Compiler 编译 R.java、Java 接口文件、Java 源文件,生成 .class 文件; 通过 dex 命令,将 .class 文件和第三方库中的...关于签名 之前写的东西有点遗漏啊,谷歌官方有说明,下面是引用啊 注意:您必须在应用构建过程中的两个特定时间点之一使用 zipalign,具体在哪个时间点使用,取决于您所使用的应用签名工具: 如果您使用的是...如果您在使用 apksigner 为 APK 签名之后对 APK 做出了进一步更>改,签名便会失效。...如果您使用的是 jarsigner,则只能在为 APK 文件签名之后执行 zipalign。...链接地址 那么当使用V1签名时,编译流程顺序还是6-7 而当使用的是V2的签名时,则编译流程顺序是7-6 结束 其实并没有什么想说的,只是想给各位老哥表演下倒立吹牛逼。觉得还ok 给我点个赞把。
所以如果想继续使用上述方案,需要关闭Gradle Plugin中的V2签名选项,禁用V2签名。...因此在校验时,需要先解压出原始文件,才能进行校验。而解压操作无疑是耗时的。 V1签名仅仅校验APK第一部分中的文件,缺少对APK的完整性校验。...V2签名机制 不同于V1,V2签名会生成一个签名块,插入到APK中。因此,V2签名后的APK结构如下图所示: APK签名块位于中央目录之前,文件数据之后。...因为,我们V2签名块中的数据摘要是针对APK的文件内容块、中央目录和EOCD三块内容计算的。...但是在写入签名块后,修改了EOCD中的中央目录偏移量,那么在进行V2签名校验时,理论上在“数据摘要校验”这步应该会校验失败啊!但是为什么V2签名可以校验通过那?
在实际分析中,还可以使用IDA Pro直接分析APK文件,使用dex2jar与jd-gui配合进行Java源码级的分析等。这些分析方法会在本书后面的章节中详细介绍。...APK文件在打包时,strings.xml中的字符串被加密存储为resources.arsc文件并保存到APK程序包中;如果APK文件被成功反编译,这个文件就被解密了。...使用ApkTool反编译APK文件后,所有的索引值都保存在与string.xml文件处于同一目录的public.xml文件中。...可以猜测:ApkTool内部使用baksmali将APK中的DEX文件反编译为smali文件,但ApkTool在反编译APK时没有处理instant-run.zip中的DEX文件,因此,在反汇编输出信息中没有程序真正的反汇编代码...在APK启动时,会有固定的DEX加载启动程序来加载该文件,这缩短了代码编译过程所花费的打包时间。
所以如果想继续使用上述方案,需要关闭Gradle Plugin中的V2签名选项,禁用V2签名。...因此在校验时,需要先解压出原始文件,才能进行校验。而解压操作无疑是耗时的。 V1签名仅仅校验APK第一部分中的文件,缺少对APK的完整性校验。...V2签名机制 不同于V1,V2签名会生成一个签名块,插入到APK中。因此,V2签名后的APK结构如下图所示: ? APK签名块位于中央目录之前,文件数据之后。...简而言之:优先校验V2,没有或者不认识V2,则校验V1。 这里引申出另外一个问题:APK签名时,只有V2签名,没有V1签名行不行?...因为,我们V2签名块中的数据摘要是针对APK的文件内容块、中央目录和EOCD三块内容计算的。
如何逆向 查看资源文件 把要解压的APK拷贝到APKs目录 使用 apktool d APKs/xxx.apk -o dir 将APK解压到当前目录,得到完整的资源文件。...打包回APK apktool b APKs/xxx –o file.apk 将文件恢复到apk 重新签名 jarsigner -verbose -keystore demo.keystore -...查看源码 若要查看源码,将xxx.apk命名为xxx.zip,使用unzip命令解压,得到dex文件,目录结构如下: AndroidManifest.xml classes2.dex javax...使用dex2jar工具逆向dex文件: % d2j-dex2jar.sh *.dex dex2jar classes.dex -> ....也就是说,在smali里的所有操作都必须经过寄存器来进行: 本地寄存器用v开头数字结尾的符号来表示,如v0、v1、v2、… 参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2、… 特别注意的是
领取专属 10元无门槛券
手把手带您无忧上云