过年的时候看见一个apk,因为肺炎在屋头宅的发霉,拿出来玩玩,小白图个乐,大佬乎喷。
Apk信息
这个app的协议是明文,只有一个sign签名。
1APK的协议
长链接的心跳
返回值
登录和注册
Type 1=登录 2=注册
Username 和password 是账户和密码
imei手机序列号
t是时间戳
sign是加密验证
返回值:
2,搜索协议的逻辑
Name是搜索内容
应用上点击列表后向服务器发送 urn:btih: ,时间戳,sign
返回值
{"msg":"0",
"list":[{"name":"1.rm",
"data":"83a371d890c1178e8ecc8c060f17d2acf4a0eff707955035be407f7ce707d8ed49d5689a4abbffb8", "size":""}]}
返回值:
{"url":"http://120.76.250.16/video.php?host=sz.btfs.mail.ftn.qq.com&code=87d1e08d092c1d05527947754d542095aade3db0cf4619df17e81d10b6e414c4fe101e3622bbcc09f45404c17b601e05d2861bfb4799b740e087e2d94ab886f7&data=83a371d890c1178e8ecc8c060f17d2acf4a0eff707955035be407f7ce707d8ed49d5689a4abbffb81d30aadc7fb85e082658c7","cookie":"b4d29c58","msg":"0"}
这个就是视频源了,开始寻找sign的签名算法。
2 apk源码
在com.Soku. jxActivity的内部类madaper中onBindViewHolder方法发送hash以及data拿到视频地址
sign是调用com.Soku.Sign.getsign方法取返回值,传入的参数为 hash+time
(BuildConfig.VERSION_NAME的值是 6.3")
接下来调用 suritySignature.sign(),这个 类位于ibaba.wireless.security.jaq.SecuritySignature;
(SecureSignatureDefine.OPEN_KEY_SIGN_INPUT值为"INPUT")
之后是一个接口类IsecureSignatureComponent;他的实现在lib\armeabi\d1libsgmain.so中
但是这并不是一个so文件而是一个jar包。
我通过ddms绘制函数轨迹得到完整的调用链。
com.alibaba.wireless.security.a.h.a.sign()->
com.taobao.wireless.security.adapter.a.b.a()-> //判断传入的参数map类型
com.taobao.wireless.security.adapter.a.b.a();-> //重载的函数, 这个函数的作用是将Unicode字节码转成UTF-8
com.taobao.wireless.security.adapter.a.b.a();->
com.taobao.wireless.security.adapter.JNICLibrary.doCommandNative(int i, Object... objArr);
最后调用了native函数。传入的参数为10401,new object{ hash+time+“6.3“,"3be780bc-8cf2-446c-9e03-de3a8fd9d0a7", Integer.valueOf(3),"0335"}
接下来就开始对 libsgmain-5.4.56.so的分析
3 libsgmainso.so的分析
Jar包中的lib\armeabi\libsgmain-5.4.56.so,简单粗暴的将所有节头的偏移和大小置0后使用ida打开
这个so里面很多的流程混淆,具体可以参考这篇大佬的文章
详细分析一款移动端浏览器安全性
https://www.anquanke.com/post/id/179080
很多的函数并不能F5
经过分析,函数开始处与函数结束处取一个内存中的值判断是否相等,如果不相等就跳转另一个地址
并且这个值并不参与运算中来,所以修改后并不影响我们的分析并且可以愉快的F5了
执行流程
首先so会去寻找 Boolean,String,Integer并做方法全局化引用
。
然后0xb9b0处解密加载
com/taobao/wireless/security/adapter/common/HttpUti,
解密
函数
sub_903F0 他的第一个参数是要解密的数据,第二个是返回值,三是
要解密的数据的大小
首先申请一段56byte的内存(就叫malloc_56)再申请11byte的内存,将后面这个11byte的内存地址放入
malloc_56
的首地址。
这
11byte的内存存入的是10字节的密钥RC4算法,
malloc_56[1]是0,
malloc_56[2],是11,后面的都是一些函数地址了
密钥DcO/lcK+h? m3c*q@ (好像其他版本的密钥都是一样的)
接着再申请一个malloc_56,首地址存放要解密的数据地址。通过一个函数75DDA里的switch去调用sub_7C700
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-3-16 11:31
被yezheyu编辑
,原因: 其他原因