简单的分析:某点评 TCP协议 算法-初始化密钥(一)

查看 74|回复 7
作者:西枫游戏   
前言
简单分析{某点评}TCP私信协议,
[color=]本帖只负责分析交流切勿他用
。若侵犯了权益,麻烦管理帮忙删除,谢谢!
--------------------------------------------------------------------------------------------------------------------------------------------------------
TCP交互流程
TCP协议交互理解:
  • 请求服务器共享密钥,或本地按规则生成一组key【篇文比较长分段开始】
  • RSA公钥加密并且组包发送到服务器统一加密密钥({某小破站登陆协议一样})【
    [color=]暂时先分析统一密钥
  • 登陆服务器:组包数据包括 1. 登陆的设备id  2. 附带APP版本号   3. 附带该账号的uid   4. 附带该账号的令牌{token,CK}之类

    --------------------------------------------------------------------------------------------------------------------------------------------------------
    工具
  • 样本 11.12.14
  • frIDA - 16.1.11
  • objection - 1.11.0
  • jadx-gui
  • 小米note7

    --------------------------------------------------------------------------------------------------------------------------------------------------------
    分析流程

  • 作为TCP协议,抓包工具一般都难搞  两个方向: 1 . objection 批量搜索“Socket” 或者其他关键字并复制下来 然后批量hook这些类  2. frida脚本 hook  java 层的系统加解密并且打印堆栈。
  • adb 命令 运行frida-server 并且端口转发。
  • 发送私聊信息 “123456789”  触发 hook 加解密算法 发现一个可疑的算法堆栈



  • 1.png (85.28 KB, 下载次数: 0)
    下载附件
    2024-1-23 13:52 上传
  • 跟进堆栈之后发现是一个AES加解密算法,可以确定的是 TCP协议组完包后 对称算法 AES   AES/CTR/NoPadding   加密后再发送的。现在目的是看看key是从哪里来。



  • 2.png (67.67 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:00 上传



    3.png (72.35 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:00 上传
  • Key参数的来源,由b方法的参数传进来的。HOOK  b方法打印堆栈之后  跟到了一个接口   
    [color=]【b方法是传进去key   c方法是加密 e方法是解密】



  • 4.png (22.83 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:04 上传



    5.png (12.83 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:06 上传
  • 继续往下跟加密算法,看看是那个调用是这个加密。。。



  • 6.png (33.88 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:10 上传
  • 继续跟进key是从哪里赋值的。



  • 7.png (55.07 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:12 上传



  • 8.png (77.93 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:14 上传
  • 跟进去后发现key是由本地的【
    [color=]PBKDF2WithHmacSHA1
    】  算法得到得的。 直接定义64个随机字母就可以。key的由来已经搞定了,是本地生成的,对称加解密的话肯定是要上传的服务器统一密钥。所以现在开始寻找上传key的地方。



  • 9.png (77.95 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:24 上传
  • 继续跟进 【com.sankuai.xm.base.proto.protosingal.d】 dVar.g 这个方法  。发现   marshall()  方法 调用了【 dVar.g = RSA加密后的结果   dVar.h = p.getBytes(); 】这两个已知参数。



  • 10.png (77.46 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:28 上传
  • 继续跟进X方法后  记住这个this.f87924b 这个   【
    [color=]public ByteBuffer f87924b
    】肯定下  这个是把已知参数传进去然后开始组包。所以继续跟进  【
    [color=]super.marshall()



  • 11.png (27.28 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:31 上传



  • 12.png (82.17 KB, 下载次数: 0)
    下载附件
    2024-1-23 14:42 上传
  • 目前理顺一下。【
    [color=]当前组好统一密钥的数据包后,发送到服务器。这个密钥就统一好了
    】简单的参数我就不列举了,略微带过 第一次同步密钥的情况下是不需要加密。-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    二进制数据包解析:
  • 密钥:【
    [color=]3f7cdf7a1c29ec3166af5d63b3b52c58c1f2c7500d03fd388dd897d5d9579c86
  • 公钥:【MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkDUifT/SK+x6eeutgOrOzaKnG3GnAog74NSkKsm8smkZXhOSzZa7E7irOxcwB60WawGAQR8BHbO7kosYlz6SJyR8ZIGfVa+jV3uBfylP+uIl/6JvdK8h7yhbLbMSsQkCnMIEWCP9YEtHxjo1cxyUlQL2yIly9eY015EiYp1Z8swIDAQAB】
  • 二进制数据组包:{
    [color=]0,0,0,227,0,3,0,124,0,0,0,0,143,104,25,231,0,0,0,1,0,0,0,0,0,5,0,128,7,177,17,195,30,164,186,28,119,182,2,34,143,158,251,19,38,173,176,161,46,123,97,48,95,140,209,35,149,122,147,4,121,101,113,219,29,81,215,249,237,193,188,99,223,81,58,119,207,227,135,115,40,175,107,140,19,180,204,72,9,195,192,70,18,237,30,145,127,62,136,44,184,129,16,254,33,56,222,46,245,102,182,162,241,176,184,18,245,133,59,172,193,119,34,255,114,3,59,156,159,60,117,240,156,119,96,145,148,73,23,204,180,198,212,252,209,100,80,212,179,223,198,237,236,212,20,229,0,69,32,112,97,115,115,112,111,114,116,58,49,57,49,53,57,56,52,52,52,53,95,116,105,109,101,58,50,48,50,52,58,48,49,58,50,51,32,49,52,58,53,55,58,49,54,58,55,55,49,115,101,115,115,105,111,110,73,68,58,50,54,51,52,52,52,53,48,52,53
    }
  • {
    [color=]0,0,0,227
    }  // 数据包长度
  • {
    [color=]0,
    [color=]3,0,124
    }  //  固定【196732】类似于标签
  • {
    [color=]143,104,25,231
    }  // CRC32 签名
  • {
    [color=]128
    }  //RSA加密后的AES_CTR_KEY的数据长度
  • {
    [color=]7,177,17,195,30,164,186,28,119,182,2,34,143,158,251,19,38,173,176,161,46,123,97,48,95,140,209,35,149,122,147,4,121,101,113,219,29,81,215,249,237,193,188,99,223,81,58,119,207,227,135,115,40,175,107,140,19,180,204,72,9,195,192,70,18,237,30,145,127,62,136,44,184,129,16,254,33,56,222,46,245,102,182,162,241,176,184,18,245,133,59,172,193,119,34,255,114,3,59,156,159,60,117,240,156,119,96,145,148,73,23,204,180,198,212,252,209,100,80,212,179,223,198,237,236,212,20,229
    }  // RSA加密后的AES_CTR_KEY的数据
  • {
    [color=]69
    } // 明文数据长度
  • {
    [color=]32,112,97,115,115,112,111,114,116,58,49,57,49,53,57,56,52,52,52,53,95,116,105,109,101,58,50,48,50,52,58,48,49,58,50,51,32,49,52,58,53,55,58,49,54,58,55,55,49,115,101,115,115,105,111,110,73,68,58,50,54,51,52,52,52,53,48,52,53
    }  // 明文数据
  • 明文数据【passport:1915984445_time:2024:01:23 14:57:16:771sessionID:2634445045】 // 包含uid // time // 以及uuid的CRC32签名
  • 服务器 【103.x.x.49 : 8500】 目前统一密钥分析完毕。【仅供学习交流 若侵犯了权益,麻烦管理帮忙删除,谢谢】

    下载次数, 密钥

  • lengong   

    不检测frida吗
    moruye   

    这不是阿里系的,这是美团的,大众点评
    bhwxha   

    有意思,这个比较经典的算法
    hjsen   

    顶你个肺
    shequ123   


    bhwxha 发表于 2024-1-24 15:28
    这不是阿里系的,这是美团的,大众点评

    谢谢你的提醒哈,已经更改了。
    alongzhenggang   

    我遇到个apk游戏加密方式和你这文章里写的非常像,苦于不会hook,怎么办
    西枫游戏
    OP
      


    midnight091 发表于 2024-3-5 20:36
    我遇到个apk游戏加密方式和你这文章里写的非常像,苦于不会hook,怎么办

    HOOK 需要过检测的。其他的都简单
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部