声明:

1.本文转载自:http://www.2cto.com/Article/201311/256406.html,为了留作日后参考上传博客

2.如有转载请复试上面连接,尊重原创

apk文件签名绕过

0x01 Android签名机制

将APK重命名为zip文件,然后可以看到有个META-INF的文件夹,里面有三个文件,分别名为MANIFEST.MF、CERT.SF和CERT.RSA,这些就是使用signapk.jar生成的签名文件。

1、 MANIFEST.MF文件:

程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Base64进行编码。具体代码见这个方法:

1

private static Manifest addDigestsToManifest(JarFile jar)

关键代码是

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

for (JarEntry entry: byName.values()) {

String name = entry.getName();

if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&

!name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) &&

(stripPattern == null ||!stripPattern.matcher(name).matches())){

InputStream data = jar.getInputStream(entry);

while ((num = data.read(buffer)) > 0) {

md.update(buffer, 0, num);

}

Attributes attr = null;

if (input != null) attr = input.getAttributes(name);

attr = attr != null ? new Attributes(attr) : new Attributes();

attr.putValue("SHA1-Digest", base64.encode(md.digest()));

output.getEntries().put(name, attr);

}

}

之后将生成的签名写入MANIFEST.MF文件。关键代码如下:

1

2

3

4

5

Manifest manifest = addDigestsToManifest(inputJar);

je = new JarEntry(JarFile.MANIFEST_NAME);

je.setTime(timestamp);

outputJar.putNextEntry(je);

manifest.write(outputJar);

2、 生成CERT.SF文件:

对前一步生成的Manifest,使用SHA1-RSA算法,用私钥进行签名。关键代码如下:

1

2

3

4

5

6

7

Signature signature = Signature.getInstance("SHA1withRSA");

signature.initSign(privateKey);

je = new JarEntry(CERT_SF_NAME);

je.setTime(timestamp);

outputJar.putNextEntry(je);

writeSignatureFile(manifest,

new SignatureOutputStream(outputJar, signature));

3、 生成CERT.RSA文件:

生成MANIFEST.MF没有使用密钥信息,生成CERT.SF文件使用了私钥文件。那么我们可以很容易猜测到,CERT.RSA文件的生成肯定和公钥相关。 CERT.RSA文件中保存了公钥、所采用的加密算法等信息。核心代码如下:

1

2

3

4

je = new JarEntry(CERT_RSA_NAME);

je.setTime(timestamp);

outputJar.putNextEntry(je);

writeSignatureBlock(signature, publicKey, outputJar);

在程序中获取APK的签名时,通过signature方法进行获取,如下:

1

2

3

4

5

6

packageInfo = manager.getPackageInfo(pkgname,PackageManager.GET_SIGNATURES);

signatures = packageInfo.signatures;

for (Signature signature : signatures) {

builder.append(signature.toCharsString());

}

signature = builder.toString();

所以一般的程序就是在代码中通过判断signature的值,来判断APK是否被重新打包过。

0x02 签名绕过方式

在讲签名绕过的方式前,需要先明确DEX校验和签名校验:

1.将apk以压缩包的形式打开删除原签名后,再签名,安装能够正常打开,但是用IDE(即apk改之理,会自动反编译dex)工具二次打包,却出现非正常情况的,如:闪退/弹出非正版提示框。可以确定是dex文件的校验

2、将apk以压缩包的形式打开删除原签名再签名,安装之后打开异常的,则基本可以断定是签名检验。如果在断网的情况下同样是会出现异常,则是本地的签名检验;如果首先出现的是提示网络没有连接,则是服务器端的签名校验.

2.1.Java层校验

获取签名信息和验证的方法都写在android的java层。实例如下:

1、使用APKIDE反编译APK,不做任何操作,然后直接回编译,安装后运行,提示如下:

3、此处就是获取签名的,然后找程序判断签名的地方,进行修改,如下图,if-nez是进行判断的地方,将ne修改为eq。即if-eqz v2, :cond_0。则程序就可以绕过本地的签名交易。

2.2.NDK校验

将关键代码放到so中,在底层获取签名信息并验证。因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用。实例如下:

1、使用APKIDE反编译APK,不做任何操作,然后直接回编译,安装后运行,程序直接退出,无任何提示。

2、在APKIDE中搜索signatures(或者搜索错误提示),定位到签名验证的代码处。

3、使⽤用JD-GUI打开AppActivity,可以看到,此处是获取包名,然后进⾏行MD5计算。

4.在程序中搜索getSignature,发现并没有调⽤用此函数的地⽅方,猜测在so⽂文件中,搜索loadLibrary。

5.在代码中可以查找,可以找到调⽤用的是libcocos2dcpp.so

6.使⽤用IDA打开libcocos2dcpp.so,然后搜索getSiganture,找到调⽤用此函数的地方。

从代码中可以看到,此函数调⽤用了org.cocos2dx.cpp.AppActivity.getSignature

7、查看F5代码,发现此函数是判断签名的函数,然后我们双击此函数的调⽤者,部分代码如下。

8、从上图可以看出,只需要修改BEQ loc_11F754,让其不跳转到jjni——>error,就可以绕过签名校验。 查看HEX,使⽤010editor跳到0011F73E,修改D0为D1。成功绕过签名校验。

2.3.服务器验证

在android的java层获取签名信息,上传服务器在服务端进行签名然后返回验证结果。

如下图,网络验证时,如果网络没连接,一般都会提示错误。

既然是网络验证,肯定要把验证信息发送到服务端,然后进行验证,先看个简单的实例,下次会有个难度大的。

1、手机配置好抓包,然后抓包。第一种图是正常的APK的时候的数据包,第二个图是反编译的APK的数据包,通过对比,发现cookie中的public_key不一样,那么我们替换一下,发现可以正常使用APK的功能了。

2、将正确的public_key添加到APK中。打开反编译的代码,搜索signatures,定位到签名的代码。

可以看到,代码将signatures的值传递到V4中,然后传递到Utils->mPublicKey函数中,于是我们将正确的public_key传给V4。

然后重新打包,重新安装就可以了。

0x03.总结

java层的校验很容易就可以破解掉,在so层实现校验相对来说分析会更难点,而网络验证,如果仅仅是字符串的比较,那么也很容易破解掉。

apk文件签名绕过的更多相关文章

  1. 读取Android APK文件签名的方法

    在微信开放平台等申请API key 和secret时经常要用到apk文件签名,那么如何读取呢? 下面贴一下相关读取源码: 一共两个文件MainActivity和MD5, package com.lcg ...

  2. 如何给apk文件签名

    1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...

  3. (转载)重新对APK文件签名

    1.将证书(debug.keystore)复制到与需要重新签名的apk文件相同的目录下(如:复制到D:\Sign) 2.在cmd中切换到需要重新签名的apk文件的目录下 3.使用WinRAR打开要重新 ...

  4. Android之APK文件签名——keytool和jarsigner

    一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行:keytool -genkey -alias ChangeBackgroundWidget.keystore -keyalg RSA - ...

  5. [Android]使用platform密钥来给apk文件签名的命令

    1.使用platform密钥对apk进行签名 1.1.进入<Android_Source_Path>/build/target/product/security,找到[platform.p ...

  6. React Native之APK文件签名及打包

    生成apk签名文件 我们使用android studio的方式进行签名 AS工具栏找到并点击 build->gennrate signed apk 两种情况: 1.这里如果已经有签名文件了则直接 ...

  7. 【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用

    一个android apk的编译过程 请参考: http://www.2cto.com/kf/201312/261475.html 典型的编译过程: aapt( Android Asset Packa ...

  8. Apk去掉签名以及重新签名的方法

    Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败. 网上流传的"勾选允许安装未知来源的应用"其实跟签不 ...

  9. 【转】adb uninstall卸载apk文件说明

    昨天在使用adb卸载程序,结果死活卸载不了.我输入的命令和系统提示如下: [plain] view plaincopy   arthur@arthur-laptop:~$ adb uninstall  ...

随机推荐

  1. sql脚本创建用户角色权限表

    /******************************************/ /* 名称:权限管理 */ /* 编写日期:2010.5.20 */ /* 开发者:dangqinghua * ...

  2. MobSF 框架安装使用部署

    1.MobSF 简介 MobSF是Mobile Security Framework的缩写,这是一款智能化的开源移动应用(Android.IOS.Windows)测试框架,可以对应用进行动态.静态分析 ...

  3. npm 常用指令

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  4. Lucky Conversion(找规律)

    Description Petya loves lucky numbers very much. Everybody knows that lucky numbers are positive int ...

  5. mysql You can't specify target table 'xxx' for update in FROM clause

    含义:您不能在子句中为更新指定目标表'xxx'. 错误描述:删除语句中直接含select,如下: DELETE FROM meriadianannotation WHERE SeriesID IN ( ...

  6. lintcode-221-链表求和 II

    221-链表求和 II 假定用一个链表表示两个数,其中每个节点仅包含一个数字.假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式. 样例 给出 6->1-> ...

  7. ltnmp 3.0 发布,PHP 开发环境一键安装包

    PHP 开发环境一键安装包, 有个叫lnmp.这个ltnmp看起来更新比较多,开发比较频繁,包括的组件更多. 安装和使用教程:http://www.moqifei.com/ltnmp 标记一下.

  8. 【beta】Scrum站立会议第5次....11.7

    小组名称:nice! 组长:李权 成员:于淼  刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.11.7   12:00——12:30 地点:传媒西楼220室 本次对beta阶段的 ...

  9. APDU命令与响应格式【转】

    本文转载自:http://map.im/apduintroduce 命令格式 APDU命令由命令头和命令体组成: CLA | INS | P1 | P2 | Lc | DATA | Le命令头: CL ...

  10. bzoj4569-萌萌哒

    题目 有一个长度为\(n\)的十进制数,用\(s\)表示.有\(m\)个限制条件,每个条件形如:\((l_1,r_1,l_2,r_2)\),表示\(s[l_1:r_1]=s[l_2:r_2]\). 现 ...