某神奇 App data 加密算法解析 (一)
一、目标
李老板:奋飞呀,我遇到一个超级牛掰的 App,它请求的时候有个 data 参数加密,用尽了你介绍的所有的方法,都找不到它是如何加密的。
奋飞:子曾经曰过,老板的嘴,骗人的鬼。有这么牛掰的 App,那么我们这帮兄弟早就失业了。
某神奇 App v10.1.0
点 社区-> 随便打开一篇有评论的文章
今天的目标就是这个 data
二、步骤
搜索特征字符串
目标是 data,所以我们第一个搜索 "data"
一共有 130 多个结果,开始一个一个点开分析了,逆向木有那么酷,有很大一部分是苦力活。
比如这种 baidu 、 meizu 、tencent 、google 开头的类,大概率是第三方 sdk 用的。可以排除掉。
命中的原则就是, "data" 和 "timestamp" 在一起。
遗憾的是木有找到,也许是结果太多,眼花了,看漏了吧。
不死心,我们再尝试搜一下 "timestamp" 只要它和 "data"在一起,也算命中。
这次只有 40 个结果,一个一个认真的找过去,还是没找到。这下死心了,说明特征串搜索失败。
Hook Base64
这个 data 数据看上去超级像 Base64,所以我们第一步是 Hook Base64
frida 跑起来,spawn 启动不了,要么说没有这个包名,用 app 名称也提示找不到。
算了,attach 倒是成功了。
不过在意料之中,木有任何输出,李老板毕竟也和我们混了这么多期,肯定他也是试过 Hook Base64 的。
Hook java.lang.StringBuilder 字符串定位
在 java 层组装字符串,大概率是逃不过 StringBuilder,我们观察一下 data 数据的特征。
他们没有一样的开头,但是他们有一样的身体,字符串里面都含有 +
我们要匹配 + 并且字符串长度大于 150,我掰指头数了,data 数据的长度大概是 190 多。
frida 跑起来,Attach 上,依然没有任何输出,有点不对劲,我们把 hook StringBuilder 的所有输出打印下,结果还是没有任何输出。
可能 Attach 模式有问题,必须得 spawn 模式了。
Xcube
被我们冷落了许久的 Xcube 可以派上用场了,Xcube 可以不使用 frida spawn 模式启动,但提供 spawn 模式一样的效果,具体使用方法参见 http://91fans.com.cn/post/antifridaoper/。
配置好 xcube.yaml 跑起来。
见鬼了,李老板这次没说错,居然还是没有任何输出。Xcube 也不好使了。
换手机
真的,很多时候网友问我,为啥我 hook 不上,为啥我启动不了,为啥我抓不了包。
这个真是玄学,换个手机也许就好了。
我手头有好几个测试机,分别装了不同的抓包软件,不同版本的 Android 系统。
终于在一台 google pixel 2xl 上 成功的用 frida spawn 模式启动 了 app,并且打印出了字符串信息。
当然打出了一堆 base64 数据,但是没有我们想要的数据。
hook_libart
java 层 hook 不到数据,那么我们就去 Native 层
再跑一下,依然没有我们想要的数据。
小小的总结一下
App 中的字符串,要么出现在 java 层,要么出现在 Native 层。我们都 Hook 上了,居然还是没有找到。
只剩下一种可能了,这个字符串木有在 App 中被处理。
比如说,App 中嵌入了一个浏览器,运行了一个 H5 页面,页面中 js 去做的加密和 http 请求.....
这样的话,我们就 hook 不到了。
调试网页中的 js
从抓包结果里面我们找到了文章的 Get 请求
然后可以直接用 Chrome 打开,
刷新一下,就找到了我们心心念念的 data
还是被李老板骗了,网页 js 做的加密,你 App 里能找到就见鬼了。
既然确定这个 comments-and-reply-encrypt 请求是 js 发出的,就好办了,
搜索一下,发现它来自于 ArticleDetail.js
双击 搜索到的结果,在 Network 窗口定位这个 js, 然后右键 Open in Sources panel 进入到源码窗口。
源码有点乱,我们点 {} 图标格式化一下。
然后在 ArticleDetail.js 源码中搜索 comments-and-reply-encrypt
定位到了 getCommentEncrypt
继续搜索 getCommentEncrypt ,定位到了一个加密函数 encryptSm4ECB
这么牛掰的名字,大概率是我们心爱的 data 加密了。
函数还是很清晰的,返回了 data 和 timestamp。
给它下个断点,然后重新刷新一下页面。 成功触发了断点。
搞定,收工。
三、总结
字符串一定是有迹可循,apk 中不出现,运行时也一定会出现。
现在开发 App 的手段多种多样,传统手艺也不能丢,这个样本就是鼓捣了半天,万万没想到就是个网页。
排除所有不可能的因素之后,无论剩下的多么难以置信,那就是真相。
版权声明: 本文为 InfoQ 作者【奋飞安全】的原创文章。
原文链接:【http://xie.infoq.cn/article/341f8e00a225c78d85bea71e8】。文章转载请联系作者。
评论