浅谈android完整性检测
本帖最后由 世事繁华皆成空 于 2015-8-8 11:33 编辑转自:http://www.9hao.info/pages/2014/08/qian-tan-androidwan-zheng-xing-jian-ce常见android完整性检测 检测签名 校验classes.dex 检验整个apk(这种比较少见)
验证哪方面的检测 先直接对apk进行签名,然后安装运行,如果运行出错那么可以推测有签名检测;如果签名没问题,那反编译再回编译安装运行出问题,那么说明有校验classes.dex校验。找到校验的地方 针对签名 : 可以搜索getPackageInfo 、PackageManager、 Signature、signatures、签名信息RSA文件。 针对classes.dex, 搜索classes.dex,解压缩ZipEntry,资源文件读取也可以注意下.(还有一些,暂时不记得了)。 算法 md5,hash。 退出函数、错误提示等。搜索这些特征函数和字符串,找到校验的地方。
突破校验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.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/approot@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.dex255|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指纹 ^^ smile1110 发表于 2015-8-8 13:00
俺觉得如何检查 签名 最简单就是修改为更高版本号以后进行模拟器重新安装 若是能安装覆盖那就是用的默认签 ...
不用,把apk解包。原封不动回包,如果不能正常运行就是有验证,然后可以分别确定是签名验证还是dex验证 俺觉得如何检查 签名 最简单就是修改为更高版本号以后进行模拟器重新安装 若是能安装覆盖那就是用的默认签名 若是不能那就是没有 不知道说的对不对 俺也刚学 本帖最后由 7535668 于 2015-8-8 11:37 编辑
沙发是我的吗?
嘿嘿,关注楼主好多年了,终于找到一个坐沙发的机会了。
只想问问楼主:你饭吃了吗?
{:1_918:}
老大的二楼我要了! 我不是小三 7535668 发表于 2015-8-8 11:36
沙发是我的吗?
嘿嘿,关注楼主好多年了,终于找到一个坐沙发的机会了。
只想问问楼主:你饭吃了吗?
刚吃了才回来 谢谢楼主分享,好厉害的样子,虽然看不懂 楼主威武,顶一定 学习了!! 好腻害,赞一个
页:
[1]
2