过年的时候看见一个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":"566K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5x3q4)9J5k6e0M7$3i4K6u0W2x3U0f1H3i4K6u0W2x3e0k6Q4x3V1k6$3K9h3c8W2L8#2)9J5k6i4m8Z5M7q4)9K6c8X3S2G2M7%4c8Q4x3@1c8K6P5W2)9J5k6h3u0@1k6Y4y4Q4x3X3g2E0j5h3W2D9i4K6u0W2k6Y4c8F1i4K6u0W2M7i4q4Q4x3X3g2U0L8$3#2Q4x3U0k6S2L8i4m8Q4x3@1u0U0L8$3c8W2i4K6y4p5z5o6N6V1x3h3f1H3z5r3b7H3z5e0u0U0x3h3b7H3y4e0f1J5y4K6V1@1y4K6M7#2y4r3b7#2y4o6t1H3z5e0g2S2j5h3c8W2x3$3c8T1x3r3y4X3y4o6j5I4z5h3c8X3x3e0N6W2z5o6q4V1x3e0m8T1y4X3f1@1x3e0c8U0y4r3k6W2x3e0l9I4k6e0x3$3x3U0u0T1j5X3y4U0x3o6W2X3y4o6f1@1x3o6c8U0x3e0N6T1y4U0l9I4k6e0l9#2k6o6t1^5y4U0q4T1k6X3t1@1y4K6V1&6j5U0M7@1x3r3f1H3z5o6N6W2x3X3b7&6y4r3q4T1z5o6R3$3k6U0N6Q4x3U0k6S2L8i4m8Q4x3@1u0V1j5i4c8S2i4K6y4p5z5o6y4S2x3K6M7I4k6o6R3&6x3r3x3I4x3e0M7^5k6e0S2W2j5$3x3^5j5K6l9$3x3r3j5I4y4$3b7J5j5h3y4X3y4r3p5H3k6h3k6X3y4K6l9%4z5e0f1#2x3o6x3#2j5X3f1@1x3o6N6X3y4$3y4W2y4K6l9%4k6o6S2W2k6o6b7&6k6o6f1$3z5o6W2S2y4r3q4T1j5X3k6X3j5U0R3I4k6o6x3H3j5h3q4V1j5K6N6X3j5U0R3#2k6e0l9^5x3U0j5#2z5r3x3%4","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里面很多的流程混淆,具体可以参考这篇大佬的文章
详细分析一款移动端浏览器安全性
3dfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2S2L8Y4q4#2j5h3&6C8k6g2)9J5k6h3y4G2L8g2)9J5c8Y4m8G2M7%4c8Q4x3V1k6A6k6q4)9J5c8U0p5%4z5e0l9^5x3l9`.`.
很多的函数并不能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
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!
最后于 2020-3-16 11:31
被yezheyu编辑
,原因: 其他原因