前言
这一周分析的是外卖平台到家美食会,主要因为实验室工作需要,所以时间有限只能拿这个应用来分析了。主要因为这个应用逻辑代码非常简单,巨简单无比。所以分析起来并没有什么难度。没有涉及到so层,所以我把标题定为数据加密分析。包括本地数据存储加密的分析,网络数据加密的分析。
分析
本地数据加密分析
账号密码等关键信息都存在了shared_prefs文件夹中,我们直接将这个文件夹拖出来,打开里边的文件查看
用户名和密码,接下来找这个加密方式是如何实现的。关键函数如下:
在classes2的dex中我们找到了这个继承SharedPreferences的函数,其中就有对函数的加密和解密方式,在这里说明一下,加密和解密的实现都是通过getString和putString进行调用。也就是说sharedpreferences的存取都会调用加解密函数。接下来我们来分析加解密函数:
密钥在类中静态定义出来:
这里需要说明的是密钥生成过程还用了android_id这个字段是对设备的唯一标识,所以我们可以通过函数直接调用它,来生成最终的密钥
解密函数如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| private String b(String s){ char[] d = new char[]{'\u0017', '-', 'O', 'A', 'b', '\u0015', '\r', '\u0012', '@', '\u001C'}; byte[] v0_1 = Base64.decode(s, 0); try{ SecretKey v1 = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(new PBEKeySpec( d)); Cipher v2 = Cipher.getInstance("PBEWithMD5AndDES"); String android_id = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID); v2.init(2, ((Key)v1), new PBEParameterSpec(android_id.getBytes("utf-8"), 20)); return new String(v2.doFinal(v0_1), "utf-8");} catch(Exception e){ throw new RuntimeException(((Throwable)e)); } }
|
打印出密钥以及密码
网络协议分析
我们来分析登录过程,这个应用的登录抓到的数据包及其简单,分析也不难,一看就是md5。但是有个地方比较难受的就是如果你选择密码登录的话他会有两个发送密码的数据包,其中第一个为你输入密码的md5,第二个计算md5的时候会传入空值,再计算出md5并和验证码一起发送过去。所以这里我在动态调试的时候下断点总是下不到。
选择密码登陆时,第一次输入密码进行md5发送过去
第二次数据包则是将密码项为空传入md5函数中。我们可以cv这段代码进行验证
Password就为ae.b(“”)返回的结果。截取代码下来进行验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public static String b(String arg7) { String v0_2; try { byte[] v1 = MessageDigest.getInstance("MD5").digest(arg7.getBytes("UTF-8")); StringBuilder v2 = new StringBuilder(v1.length * 2); int v3 = v1.length; int v0_1; for(v0_1 = 0; v0_1 < v3; ++v0_1) { int v4 = v1[v0_1]; if((v4 & 255) < 16) { v2.append("0"); } v2.append(Integer.toHexString(v4 & 255)); } v0_2 = v2.toString(); } catch(Exception v0) { v0_2 = ""; } return v0_2; }
|
执行这段代码会返回d41d8cd98f00b204e9800998ecf8427e
总结
这周的应用分析代码工作比较简单,主要是有些逻辑和解密函数的还原需要一些时间,第一次关注本地数据的加密存储。在以后的分析中也会把这一项作为一个关注点。了解更多的本地数据存储机制。