本帖最后由 世事繁华皆成空 于 2015-8-8 11:33 编辑
转自:http://www.9hao.info/pages/2014/ ... -zheng-xing-jian-ce 常见android完整性检测
[1] 检测签名[2] 校验classes.dex [3] 检验整个apk(这种比较少见)
验证哪方面的检测
  先直接对apk进行签名,然后安装运行,如果运行出错那么可以推测有签名检测;如果签名没问题,那反编译再回编译安装运行出问题,那么说明有校验classes.dex校验。 找到校验的地方
[1] 针对签名 : 可以搜索getPackageInfo 、PackageManager、 Signature、signatures、签名信息RSA文件。 [2] 针对classes.dex, 搜索classes.dex,解压缩ZipEntry,资源文件读取也可以注意下.(还有一些,暂时不记得了)。 [3] 算法 md5,hash。 [4] 退出函数、错误提示等。搜索这些特征函数和字符串,找到校验的地方。
突破校验
1 爆破 如果只是本地校验,可以找到校验函数后修改调转;如果是网络验证,直接爆破容易失效。
2 文件重定向 我们先看看两个常见的检测代码(摘自《Android安全与逆向分析》 防止重编译小结)
签名获取: public int getSignature(String packageName) { PackageManager pm = this.getPackageManager(); PackageInfo pi = null; int sig = 0; try { pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); Signature[] s = pi.signatures; sig = s[0].hashCode(); } catch (Exception e1) { sig = 0; e1.printStackTrace(); } return sig; }
签名重定向: pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
getPackageInfo hook掉 获取到原始的pi信息 (网上说如果动态加载的.是没法hook住的??,没验证,不可能把 00) classes.dex校验: private boolean checkCRC() { boolean beModified = false; long crc = Long.parseLong(getString(R.string.crc)); ZipFile zf; try { zf = new ZipFile(getApplicationContext().getPackageCodePath()); ZipEntry ze = zf.getEntry("classes.dex"); Log.d("com.droider.checkcrc", String.valueOf(ze.getCrc())); if (ze.getCrc() == crc) { beModified = true; } } catch (IOException e) { e.printStackTrace(); beModified = false; } return beModified; }
dex重定向:
zf = new ZipFile(getApplicationContext().getPackageCodePath());
hook ZipFile定向到原始的apk. 如果你能搜索到明文classes.dex信息,可以修改明文字符串来重定向,参考帖子:
http://www.kanxue.com/bbs/showthread.php?t=190711 你可以直接修改系统,把系统的签名校验给patch了(参考:http://www.kanxue.com/bbs/showthread.php?t=190876) public void initZygote(StartupParam startupParam) throws Throwable { XposedHelpers.findAndHookMethod("java.security.Signature",null,"verify", byte[].class,new XC_MethodHook(){ protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("disabled verifysignature......"); param.setResult(Boolean.TRUE); } });
ps:这样有写局限,别人要装你修改的apk,需要装个xposed,当然自己也可以实现一个hook用于文件重定向,还有就是给系统带来风险. 3 安装文件替换
程序安装完成,apk文件将保存在/data/app(名字一般为:包名-1.apk或包名-2.apk)、系统程序apk文件保存在/system/app root@android:/ # ls -l /data/app |busybox grep com.citicbank.cyberpay.uils -l /data/app |busybox grep com.citicbank.cyberpay.ui-rw-r--r-- system system 7892655 2014-08-24 18:51 com.citicbank.cyberpay.ui-2.apk
classes.dex文件保存在/data/dalvik-cache,供dalvik执行,命名方式data@app@包名-数字-apk@classes.dex 255|root@android:/data/dalvik-cache # ls -l /data/dalvik-cache|busybox grep com.citicbank.cyberpay.uiache|busybox grep com.citicbank.cyberpay.ui <-rw-r--r-- system u0_a66 4974920 2014-08-24 19:27 data@app@com.citicbank.cyberpay.ui-2.apk@classes.dex
android系统在安装的时候校验签名,安装之后不校验, 这样我们就可以替换安装文件来绕过检测的目的 ^^.
把修改apk的签名替换成原本的apk的签名,然后在替换系统里面的apk和dex. adb push E:\测试\zhifu_sign.apk /data/dalvik-cache/data@app@com.citicbank.cyberpay.ui-2.apk@classes.dex4160 KB/s (7902332 bytes in 1.854s)(ps: apk和dex都可以)Desktop>adb push E:\测试\zhifu_sign.apk /data/app/com.citicbank.cyberpay.ui-2.apk3235 KB/s (7902332 bytes in 2.385s)
写个脚本,杠杠的 00. ----------------------------------------------------分割线------------------------------------------- 但是呢,理想很丰满,现实很骨感------
签名还能怎么读 ?
特征字符串和特征函数有这么容易搜索到?
还有个apktool指纹 ^^ |