网络安全 逆向 apk 网络安全逆向分析

[复制链接]
发表于 2025-10-12 07:27:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[网安实践] 逆向分析

1 流量分析

  1. 借助Wireshark抓取Android模拟器中“QQ同步助手”登录和同步数据时的流量,回答以下问题:  
  2. (1)筛选流量中,对应域名 "mpssync.3g.qq.com" 的IP地址;
  3. (2)同步报文的TCP流量源IP:端口,目的IP:端口;
  4. (3)分析同步流量的数据特征,并根据这些特征,能否获取报文的一些信息,例如密文长度信息;
  5. (4)保存并上传流量分组文件。
复制代码

  • mpssync.3g.qq.com 的IP所在: 183.3.225.36 和 113.96.237.110
  • 同步报文 TCP 流量, 源 IP 为 10.12.181.187, 源端口为 3550, 目标 IP 为 113.96.237.110, 目标端口为 14000.
  • 同步流量的数据特性: 传输数据的前4个字节表现反面加密数据的长度(单元字节), 数据的加密范例为分组加密.
  • 流量分组文件:  lab3.pcapng
分析过程


  • 通过 Wireshark 截包, 过滤条件为 dns, 容易找到对域名 mpssync.3g.qq.com 的 DNS 查询和相应包, 如下图所示, 可以得到该域名对应的 IP 所在有 183.3.225.36 和 116.96.237.110.


  • 注: 在利用同步助手时, 要先下载 QQ, 利用 QQ 账号举行快捷登录才气乐成登录 QQ 同步助手. 别的, 须要在模仿器中添加接洽人, 如许才气举行数据同步.

  • 利用过滤条件来过滤与域名 mpssync.3g.qq.com 干系的数据包. 过滤条件如下, 即数据包的源或目标 IP 为域名的IP.
  1. ip.src==113.96.237.110 or ip.dst == 113.96.237.110 or ip.dst == 183.3.225.36 or ip.src==183.3.225.36
复制代码
如下图为过滤后得到的数据包.



由于本机的 IP 所在是 10.12.181.187, 因此可以得出, 同步报文的 TCP 流量源 IP 为本机的 IP 10.12.181.187, 源端口为 3550, 目标 IP 为域名 mpssync.3g.qq.com 的此中一个 IP 所在 113.96.237.110, 目标端口为 14000.
3. 选择此中一个报文, 右键"追踪流"并利用"Hex 转储"模式检察上述报文的传输数据.



通过观察上述数据可以发现, 传输的数据是颠末加密的, 而且前四个字节表现了加密的数据长度(即传输的数据长度-4), 如上图报文长度为 158h, 加密的数据长度为 154h, 而前 4 个字节的数据即为 154h. 而提供了数据长度的加密范例一样平常是分组加密.
2 函数调用栈动态跟踪

  1. 借助AndroidKiller分析和DDMS的“Method Profiling”功能,分析“QQ手机助手”登录和同步时的函数调用栈,回答以下问题:
  2. (1)程序的包名是什么?
  3. (2)在DDMS中对“QQ手机助手”进行动态跟踪时,PC端与手机(或模拟器)端连接的端口是多少,并参考实验手册中6.2节中的示例,附上截图。
  4. (3)trace文件中,列举若干涉及加解密函数的调用栈(附上截图)。
  5. (4)上传trace文件。
复制代码

 
  

  • 步伐包名: com.tencent.qqpim

  • PC端与手机模仿器毗连的端口为 8600

  • trace 文件中涉及加解密函数的调用栈












  • com.tencent.tccsync.TccTeaEncryptDecrypt.tccXXTeaDecrypt
  • com.tencent.tccsync.TccTeaEncryptDecrypt.encrypt
  • com.tencent.tccsync.TccTeaEncryptDecrypt.decrypt
  • com.tencent.tccsync.TccTeaEncryptDecrypt.tccXXTeaEncrypt
  • com.tencent.tccsync.TccTeaEncryptDecrypt.getXXTccTeaEncryptDecryptKey

  • trace 文件: 略
分析过程





  • 利用 AndroidKiller 打开 QQ手机助手的 APK, 即可得到步伐包名: com.tencent.qqpim

  • 在手机模仿器(此处利用的雷电模仿器)正在运行, 且此中运行有 QQ手机助手时, 启动 DDMS. 可以看到跟踪到的装备"雷电模仿器"对应的 emulator-5554, 此中可以看到进程列表中有运行的 QQ手机助手的包名, 选中后点击上面的 “Start Method Profiling” 按钮, 并选择 “Trace based profiling” 选项开始跟踪.


  • 注: DDMS 工具通过 Android SDK 的 tools/monitor.bat 文件举行启动, 要求 JDK 版本不能高出 1.8.

  • 然后在手机模仿器上利用 QQ手机助手举行同步, 之后再点击按钮 “Stop Method Profiling”, 关闭跟踪. 如图在 Temp 路径下得到了跟踪的 trace 文件.
  • 利用 Android SDK 工具 Traceview 检察上述得到的 trace 文件. 该工具由 tools/tracview.bat 文件启动, 利用如下下令打开 trace 文件.
  1. PS> .\traceview.bat E:\xxx\ddms_lab3.trace    # 需要trace文件的绝对路径
复制代码
 

  
在 Find 文本框中输入"encrypt"和"decrypt"来搜索和加密干系的函数, 具体的搜索效果和截图见上文的答案.
3 函数参数动态跟踪

  1. 安装Frida工具,编写Python脚本,基于动态跟踪结果,回答以下问题:
  2. (1)基于DDMS动态跟踪结果,列举同步过程中,调用了哪些加解密函数,并分析函数参数列表中的参数含义,比如,明文、密文和密钥。
  3. (2)针对每一加解密函数,编写Python脚本,跟踪函数的输入和输出,分析可能采用的密钥、明文或密文数组。
  4. (3)在跟踪函数参数时,同时利用Wireshark抓取同步时的报文,将报文与跟踪的函数参数(密文)进行比对。
  5. (4)上传相关脚本和跟踪结果文件。
复制代码

  • 同步过程中利用的加解密函数及其参数寄义:


  • byte[] com.tencent.tccsync.TccTeaEncryptDecrypt.tccXXTeaDecrypt(byte[] arg1, byte[] arg2): 参数1为密文, 参数2为密钥, 返回值为明文.
  • byte[] com.tencent.tccsync.TccTeaEncryptDecrypt.tccXXTeaEncrypt(byte[] arg1, byte[] arg2): 参数1为明文, 参数2为密钥, 返回值为密文.
  • byte[] com.tencent.tccsync.TccTeaEncryptDecrypt.encrypt(byte[] arg1): 参数1为明文, 返回值为密文.
  • byte[] com.tencent.tccsync.TccTeaEncryptDecrypt.decrypt(byte[] arg1): 参数1为密文, 返回值为明文.
  • byte[] com.tencent.tccsync.TccTeaEncryptDecrypt.getXXTccTeaEncryptDecryptKsyy(): 返回值为密钥.

  • 通太过析:


  • tccXXTeaEncrypt和 tccXXTeaDecrypt 函数大概接纳的密钥有: [8,6,3,8,1,8,0,2,6,9,6,3,3,3,1,h,^,J,9,o,`], [1,7,7,2,7,0,1,4,9,7,&,C,O,M,N,:,8,6,3,8,1,8,0,2,6,9,6,3,3,3,1,&,1,2,3,8,5,9,0,5,6,9,&,1,6,2,1,6,6,9,5,1,0], [D,F,G,#,$,%,^,#,%,$,R,G,H,R,(,&,*,M,<,>,<].
  • tccXXTeaDecrypt解密的明文有一些类似网址的数据.
  • tccXXTeaEncypt和 encrypt 加密的明文数据难以辨认, 推测应该是编码格式不精确. 不外在此中找到了个人的QQ号等信息
  • decrypt 函数中能在解密数据中看到一些类似网址的信息.
  • getXXTccTeaEncryptDecryptKsyy() 函数并没有截获到.

  • 如下图可以看到, 利用 tccXXTeaEncypt 加密的数据与现实 Wireshark 截获的发送的数据是同等的. 同样的, decrypt 待解密的数据与 Wireshark 截获的收到的数据是同等的. 差异之处在于现着实发送时会在加密数据前添加了 4 个字节表现数据长度.
  • 脚本代码
  1. import frida
  2. import sys
  3. # 获取设备
  4. redev = frida.get_remote_device()
  5. print("redev:", redev)
  6. # 获取应用进程
  7. front_app = redev.get_frontmost_application()
  8. print("front_app:", front_app)
  9. qqtb = "com.tencent.qqpim"
  10. session = redev.attach(qqtb)
  11. # Js脚本对应字符串
  12. jscode = """
  13. //转换为数组
  14. var toStr = function(title, obj){
  15.     return title + ":["+JSON.parse(JSON.stringify(obj))+"] ";
  16. }
  17. //函数标题
  18. var funcTitle = function(funcName) {
  19.     return "Hooked Function: "+funcName+" "
  20. }
  21. //转换为ASCII码输出
  22. var toAscii = function(arr) {
  23.     var s=[];
  24.     for(var i=0;i<arr.length;i++){
  25.         s.push(String.fromCharCode(arr[i]));
  26.     }
  27.     return s;
  28. }
  29. //转换为16进制字符串输出
  30. var toHex = function(arr) {
  31.     var s=[];
  32.     for(var i=0;i<arr.length;i++){
  33.         s.push((arr[i]&0xff).toString(16));
  34.     }
  35.     return s;
  36. }
  37. Java.perform(function () {
  38.     //选择捕获包
  39.     var tted = Java.use("com.tencent.tccsync.TccTeaEncryptDecrypt");
  40.     //设置捕获函数 tccXXTeaDecrypt
  41.     tted.tccXXTeaDecrypt.implementation = function (arg1, arg2) {
  42.         var msg = funcTitle("tccXXTeaDecrypt");
  43.         msg += toStr("arg1(Hex)", toHex(arg1));
  44.         msg += toStr("arg2(ASCII)", toAscii(arg2));
  45.         //输出返回值
  46.         var rtn = this.tccXXTeaDecrypt(arg1, arg2);
  47.         msg += toStr("rtn(ASCII)", toAscii(rtn));
  48.         send(msg);
  49.         return rtn;
  50.     };
  51.     //设置捕获函数 tccXXTeaEncrypt
  52.     tted.tccXXTeaEncrypt.implementation = function (arg1, arg2) {
  53.         var msg = funcTitle("tccXXTeaEncrypt");
  54.         msg += toStr("arg1(ASCII)",toAscii(arg1));
  55.         msg += toStr("arg2(ASCII)", toAscii(arg2));
  56.         //输出返回值
  57.         var rtn = this.tccXXTeaEncrypt(arg1, arg2);
  58.         msg += toStr("rtn(Hex)", toHex(rtn));
  59.         send(msg);
  60.         return rtn;
  61.     }
  62.     //设置捕获函数 encrypt
  63.     tted.encrypt.implementation = function (arg1) {
  64.         var msg = funcTitle("encrypt");
  65.         msg += toStr("arg1(ASCII)", toAscii(arg1));
  66.         var rtn = this.encrypt(arg1);
  67.         msg += toStr("rtn(Hex)",toHex(rtn));
  68.         send(msg);
  69.         return rtn;
  70.     }
  71.     //设置捕获函数 decrypt
  72.     tted.decrypt.implementation = function (arg1) {
  73.         var msg = funcTitle("decrypt");
  74.         msg += toStr("arg1(Hex)", toHex(arg1));
  75.         var rtn = this.decrypt(arg1);
  76.         msg += toStr("rtn(ASCII)",toAscii(rtn));
  77.         send(msg);
  78.         return rtn;
  79.     }
  80.     //设置捕获函数 getXXTccTeaEncryptDecryptKey
  81.     tted.getXXTccTeaEncryptDecryptKey = function () {
  82.         var msg = funcTitle("getXXTccTeaEncryptDecryptKey");
  83.         var rtn = this.getXXTccTeaEncryptDecryptKey();
  84.         msg += toStr("rtn(Hex)",toHex(rtn));
  85.         send(msg);
  86.         return rtn;
  87.     }
  88. });
  89. """
  90. script = session.create_script(jscode)
  91. def on_message(message,data):
  92.     print(message)
  93. script.on('message', on_message)
  94. script.load()
  95. sys.stdin.read()
复制代码
分析过程


  • 安装 Frida 及其干系工具:
    在安装有 python 的根本上, 利用 pip 工具下载 Frida 及其工具
  1. PS> pip install frida    # 安装Frida
  2. PS> pip install frida-tools    # 安装frida-tools
  3. PS> frida --version    # 查看Frida版本
复制代码
如图所示, 当前下载的 Frida 版本为 14.2.18



  • 安装 frida-server 并启动:
    在 GitHub 上下载对应的服务端步伐, 对应雷电模仿器, 下载的为 frida-server-14.2.18-android-x86.
    雷电模仿器的根目次下提供了 adb 工具, 利用该工具将 frida-server 传至手机模仿器中.
    利用 adb devices 指令可以检察当前毗连的装备列表, 在启动雷电模仿器的情况下, 是主动毗连的, 如下图所示, "-"后的数字即为毗连的端标语.

    利用 push 下令将 frida-server 传至手机模仿器.
  1. PS>  .\adb.exe push .\frida-server-14.2.18-android-x86 /data/local/tmp
复制代码
利用 chmod 下令更高 frida-server 的权限, 然后启动.
  1. PS> ./adb.exe shell
  2. # cd /data/local/tmp
  3. # chmod 777 frida-server-14.2.18-android-x86    # 更改权限
  4. # ./frida-server-14.2.18-android-x86     # 启动
复制代码
在一个新的控制台窗口利用下令 frida-ps -U 检察是否有正常输出.



  • 接纳 frida 跟踪 Java 函数参数:
    编写如下 Python 代码:
  1. import frida
  2. import sys
  3. # 获取设备
  4. redev = frida.get_remote_device()
  5. print("redev:", redev)
  6. # 获取应用进程
  7. front_app = redev.get_frontmost_application()
  8. print("front_app:", front_app)
  9. qqtb = "com.tencent.qqpim"
  10. session = redev.attach(qqtb)
  11. # Js脚本对应字符串
  12. jscode = """
  13. Java.perform(function () {
  14.     //选择捕获函数TccTeaEncryptDecrypt
  15.     var tted = Java.use("com.tencent.tccsync.TccTeaEncryptDecrypt");
  16.     //设置捕获函数
  17.     tted.tccXXTeaDecrypt.implementation = function (arg1, arg2) {
  18.         //捕获到了函数
  19.         send("Hook start ...");
  20.         //输出参数1
  21.         send("arg1:");
  22.         send(arg1);
  23.         //输出参数2
  24.         send("arg2:");
  25.         var ss = [];
  26.         for (var i = 0; i < arg2.length; i++) {
  27.             //将参数有ASCII码转为字符
  28.             ss.push(String.fromCharCode(arg2[i]));
  29.         }
  30.         send(ss.toString());
  31.         //输出返回值
  32.         var rtn = this.tccXXTeaDecrypt(arg1, arg2);
  33.         send("rtn:");
  34.         send(rtn);
  35.         return rtn;
  36.     };
  37. });
  38. """
  39. script = session.create_script(jscode)
  40. def on_message(message,data):
  41.     print(message)
  42. script.on('message', on_message)
  43. script.load()
  44. sys.stdin.read()
复制代码
该脚本现实上就是选择了 QQ 手机助手中的解密函数 com.tencent.tccsync.TccTeaEncryptDecrypt 举行了捕捉操纵, 将其函数参数和返回效果举行了输出.

  • 在手机模仿器中开启 QQ 手机助手后运行脚本. 并在手机模仿器中利用 QQ 手机助手举行同步操纵, 即可捕捉到数据.

    如图为脚本捕捉的数据, 经分析可以看出, 对于该函数 TccTeaEncryptDecrypt, 其第一个参数值有正有负, 应该是密文; 第二个参数长度固定, 且在后续的捕捉中重复出现, 应该是解密用的密钥; 返回值为 128 以内的数字, 应该是明文.


  • 注: 运行脚本时出现 frida.ServerNotRunningError: unable to connect to remote frida-server 的错误, 则须要开启端口转发, 利用如下下令:
  1. PS> .\adb.exe forward tcp:27042 tcp:27042
复制代码

  • 同理, 利用上述方法, 通过修改脚本中的捕捉函数, 可以对别的几个加解密函数举行捕捉分析.
    终极脚本如下:
  1. import frida
  2. import sys
  3. # 获取设备
  4. redev = frida.get_remote_device()
  5. print("redev:", redev)
  6. # 获取应用进程
  7. front_app = redev.get_frontmost_application()
  8. print("front_app:", front_app)
  9. qqtb = "com.tencent.qqpim"
  10. session = redev.attach(qqtb)
  11. # Js脚本对应字符串
  12. jscode = """
  13. //转换为数组
  14. var toStr = function(title, obj){
  15.     return title + ":["+JSON.parse(JSON.stringify(obj))+"] ";
  16. }
  17. //函数标题
  18. var funcTitle = function(funcName) {
  19.     return "Hooked Function: "+funcName+" "
  20. }
  21. //转换为ASCII码输出
  22. var toAscii = function(arr) {
  23.     var s=[];
  24.     for(var i=0;i<arr.length;i++){
  25.         s.push(String.fromCharCode(arr[i]));
  26.     }
  27.     return s;
  28. }
  29. //转换为16进制字符串输出
  30. var toHex = function(arr) {
  31.     var s=[];
  32.     for(var i=0;i<arr.length;i++){
  33.         s.push((arr[i]&0xff).toString(16));
  34.     }
  35.     return s;
  36. }
  37. Java.perform(function () {
  38.     //选择捕获包
  39.     var tted = Java.use("com.tencent.tccsync.TccTeaEncryptDecrypt");
  40.     //设置捕获函数 tccXXTeaDecrypt
  41.     tted.tccXXTeaDecrypt.implementation = function (arg1, arg2) {
  42.         var msg = funcTitle("tccXXTeaDecrypt");
  43.         msg += toStr("arg1(Hex)", toHex(arg1));
  44.         msg += toStr("arg2(ASCII)", toAscii(arg2));
  45.         //输出返回值
  46.         var rtn = this.tccXXTeaDecrypt(arg1, arg2);
  47.         msg += toStr("rtn(ASCII)", toAscii(rtn));
  48.         send(msg);
  49.         return rtn;
  50.     };
  51.     //设置捕获函数 tccXXTeaEncrypt
  52.     tted.tccXXTeaEncrypt.implementation = function (arg1, arg2) {
  53.         var msg = funcTitle("tccXXTeaEncrypt");
  54.         msg += toStr("arg1(ASCII)",toAscii(arg1));
  55.         msg += toStr("arg2(ASCII)", toAscii(arg2));
  56.         //输出返回值
  57.         var rtn = this.tccXXTeaEncrypt(arg1, arg2);
  58.         msg += toStr("rtn(Hex)", toHex(rtn));
  59.         send(msg);
  60.         return rtn;
  61.     }
  62.     //设置捕获函数 encrypt
  63.     tted.encrypt.implementation = function (arg1) {
  64.         var msg = funcTitle("encrypt");
  65.         msg += toStr("arg1(ASCII)", toAscii(arg1));
  66.         var rtn = this.encrypt(arg1);
  67.         msg += toStr("rtn(Hex)",toHex(rtn));
  68.         send(msg);
  69.         return rtn;
  70.     }
  71.     //设置捕获函数 decrypt
  72.     tted.decrypt.implementation = function (arg1) {
  73.         var msg = funcTitle("decrypt");
  74.         msg += toStr("arg1(Hex)", toHex(arg1));
  75.         var rtn = this.decrypt(arg1);
  76.         msg += toStr("rtn(ASCII)",toAscii(rtn));
  77.         send(msg);
  78.         return rtn;
  79.     }
  80.     //设置捕获函数 getXXTccTeaEncryptDecryptKey
  81.     tted.getXXTccTeaEncryptDecryptKey = function () {
  82.         var msg = funcTitle("getXXTccTeaEncryptDecryptKey");
  83.         var rtn = this.getXXTccTeaEncryptDecryptKey();
  84.         msg += toStr("rtn(Hex)",toHex(rtn));
  85.         send(msg);
  86.         return rtn;
  87.     }
  88. });
  89. """
  90. script = session.create_script(jscode)
  91. def on_message(message,data):
  92.     print(message)
  93. script.on('message', on_message)
  94. script.load()
  95. sys.stdin.read()
复制代码
截获到的干系函数截图:












  • 在跟踪的同时打开 Wireshark 举行截包, 按上述的过滤条件找到与域名 mpssync.3g.qq.com 的 IP 干系的数据包, 跟踪流后举行数据包和利用脚本捕捉的数据举行对比, 可以看到是同等的, 具体见上述效果.
4 二进制代码分析

  1. 借助IDA Pro分析“QQ手机助手”中与同步相关的so文件,回答以下问题:
  2. (1)与同步操作有关的文件名称;
  3. (2)比较Java代码(借助AndroidKiller分析)与二进制代码中对应函数参数列表的差异;
  4. (3)还原与加密密钥相关的二进制代码,以C代码形式呈现;
  5. (4)还原二进制代码中核心的加解密代码,以C代码形式呈现;
  6. (5)上传还原的C代码(说明其主要功能)。
复制代码

  • 与同步操纵有关的文件名称: lib/armeabi/libSync.so
  • 二进制代码中, 只有 getXXTccTeaEncryptDecryptKey 函数同 Java 代码一样, 函数参数均为 0; 别的 4 个加解密函数, 二进制代码比 Java 代码多 2 个参数: 第一个参数的范例为 JNIEnv*, 第二个参数的范例为 jobject.
  • 还原的 C 代码:  encdec.c
  • 干系函数的告急功能:


  • getXXTccTeaEncryptDecryptKey: 获取固定密钥 DFG#$%^#%$RGHR(&*M<><


  • 调用函数: 调用函数: sub_16F4


  • decrypt: 给定密文利用固定密钥举行解密.


  • 调用函数: sub_16F4, sub_183C


  • encrypt: 给定明文利用固定密钥举行加密.


  • 调用函数: sub_16F4, sub_183C


  • tccXXTeaDecrypt: 给定明文和密钥举行解密.


  • 调用函数: sub_183C


  • tccXXTeaEncrypt: 给定密文和密钥举行解密.


  • 调用函数: sub_183C


  • sub_16F4: 获取固定密钥 DFG#$%^#%$RGHR(&*M<><
  • sub_183C: 给定待处置处罚的数据, 密钥和模式(加密大概解密)举行加解密.


  • 调用函数: sub_C62C, sub_C49C


  • sub_C62C: 加密函数. 六个参数分别为明文数组指针, 明文长度, 密钥数组指针, 密钥长度, 用于存放密文的缓冲区指针及其长度. 函数的返回值为密文的长度.


  • 调用函数: sub_C4D8


  • sub_C49C: 解密函数. 六个参数分别为密文数组指针, 密文长度, 密钥数组指针, 密钥长度, 用于存放明文的缓冲区指针及其长度. 函数的返回值为明文的长度.


  • 调用函数: sub_C340


  • sub_C4D8: 具体的加密函数, 参数和返回值同 sub_C62C, 对密钥举行 MD5 哈希后利用类似 XXTEA 的加密算法举行数据加密.


  • 调用函数: sub_C2C4, sub_144C0


  • sub_C340: 具体的解密函数, 参数和返回值同 sub_C49C, 对密钥举行 MD5 哈希后利用类似 XXTEA 的解密算法举行数据解密.


  • 调用函数: sub_C2C4, sub_144C0


  • sub_C2C4: MD5 哈希算法
  • sub_144C0: 除法运算.
分析过程


  • 起首借助 AndroidKiller 工具通过加解密函数所在的包名 com.tencent.tccsync.TccTeaEncryptDecrypt找到对应的 smali 文件, 并举行反编译, 得到其 Java 代码.

    可以看到, 上述提到的加解密函数此处只有界说, 因此是原生函数, 而该类中有一个静态初始化块, 此中有函数 getLibName(), 因此可以得知这些函数是通过外部加载的, 点击该函数跳转到其所在的类, 可以得到加载的库文件名 “Sync”, 因此终极可以确定加解密的函数应该在库文件 libSync.so 中实现.
  • 利用 IDA Pro 打开 lib/armeabi/libSync.so 文件, 可以在函数列表中找到这些加解密函数.

    如图为 tccTeaEncrypt 函数反编译后的 C 代码, 可以看到其有 4 个参数, 比 Java 代码中的参数多了 2 个, 其他几个函数也是云云. 只有没有参数的 getXXTccTeaEncryptDecryptKey, 其反汇编后的 C 代码也没有参数. 根据 .so 库中有关 Java 导出函数的参数的约定,第一个参数的范例是布局体指针 JNIEnv*,第二个参数的范例肯定是 jobject
  • 颠末对反汇编的函数举行分析得到. 和加解密干系的一共有 5 个函数.
    此中 tccXXTeaDecrypt、tccXXTeaEncrypt、encrypt 和 decrypt 四个函数中都调用了 sub_183C 函数. 进太过析, 该 sub_183C 函数是举行数据加解密的焦点函数, 其完备的函数署名为 jbyteArray __fastcall sub_183C(JNIEnv *env, jbyteArray srcArray, jbyteArray key, int doEncrypt). 此中第二个参数是待处置处罚的数据的 byte[] 范例数组, 加密时是明文, 解密时是密文; 第三个参数是密钥的 byte[] 数组; 第四个参数是一个标记参数, 为 1 时表现加密, 为 0 时表现解密. 别的, 对于 tccXXTeaDecrypt、tccXXTeaEncrypt两个函数, 密钥数组是直接由参数转达给 sub_183C 函数; 而对于 encrypt 和 decrypt 函数, 密钥是由 sub_16F4函数得到的, 而现实上其返回的是一个固定的密钥 DFG#$%^#%$RGHR(&*M<><. 而函数 getXXTccTeaEncryptDecryptKey 就是直接调用的 sub_16F4 获取的这一固定密钥.
    对于 sub_183C 函数即焦点的加解密函数, 其告急分为三部门, 第一部门是由 GetByteArrayElements 和 GetArrayLength 分别获取待处置处罚数组 SRCArray 和密钥 key 所对应的原始 byte 数组的指针以及数组的长度. 接下来第二部门通过判断第四个参数 doEncrypt 来对数据举行加密大概解密, 加密调用函数 subC62C, 解密调用函数 sub_C49C. 末了第三部门是通过 NewByteArray 函数为加密或解密后的数据创建 Java 的 byte数组, 然后通过 SetByteArrayRegion 将由第二部门的函数得到的加密或解密的数据存储到 Java 的数组中.
    因此, 对于加密数据, 告急是通过调用函数 sub_C62C. 其函数署名为 jsize __fastcall sub_C62C(jbyte *plainBuf, jsize plainLen, jbyte *key, jsize keyLen, void *cipherBuf, int bufLen). 六个参数分别为明文数组指针, 明文长度, 密钥数组指针, 密钥长度, 用于存放密文的缓冲区指针及其长度. 函数的返回值为密文的长度. 在该函数中告急举行了 cipherBuf 的特别情况处置处罚, 然后告急是通过调用 sub_C4D8 函数完成的数据加密.
    同样的, 对于解密数据, 告急是通过调用函数 sub_C49C. 其函数署名为 jsize __fastcall sub_C49C(jbyte *cipherBuf, jsize cipherLen, jbyte *keyBuf, jsize keyLen, char *plainBuf, int bufLen). 六个参数分别为密文数组指针, 密文长度, 密钥数组指针, 密钥长度, 用于存放明文的缓冲区指针及其长度. 函数的返回值为明文的长度. 在该函数中, 告急的解密操纵是通过调用函数 sub_C340 得到的.
    对于 sub_C4D8 和 sub_C340函数, 它们的函数署名分别和调用它们的函数 sub_C62C和 sub_C49C 是类似的. 通太过析和查阅有关资料, 通过一些比力有特点的数值, 如 52 和 0x9e3779b9可以得到, 这两个函数的焦点算法与 XXTEA 加解密算法是类似的. 不外在此之前, 均利用了 sub_C2C4 函数举行了处置处罚. 在 sub_C2C4 函数中调用的 sub_C160 中有 1732584193, -271733879 等一组数字, 而这些数字是在 MD5 算法中用到的, 因此可以推测 sub_C2C4 函数现实上为 MD5 哈希函数, 也就是说密钥在利用之前都会举行 MD5 的哈希操纵.


  • PS: 逆向的 libSync.so 文件及相应的 IDA 文件:  libSync.so libSync.idb
5 报文还原测试(选做)

登录后复制 
  1. 根据抓取的报文,跟踪的密钥和还原代码,测试对跟踪和分析结果的正确性。上传分析过程和结果。
复制代码
网络安全学习门路

对于从来没有打仗过网络安全的同砚,我们帮你准备了具体的学习发展门路图。可以说是最科学最体系的学习门路,各人跟着这个大的方向学习准没标题。



同时每个发展门路对应的板块都有配套的视频提供:

须要网络安全学习门路和视频教程的可以在品评区留言哦~
末了

   

  • 如果你确实想自学的话,我可以把我自己整理收藏的这些教程分享给你,内里不光有web安全,另有渗出测试等等内容,包罗电子书、口试题、pdf文档、视频以及干系的课件条记,我都已经学过了,都可以免费分享给各人!
    给小同伴们的意见是想清楚,自学网络安全没有捷径,相比而言体系的网络安满是最节省本钱的方式,由于可以或许帮你节省大量的时间和精神本钱。对峙住,既然已经走到这条路上,固然前程看似困难重重,只要咬牙对峙,终极会收到你想要的效果。
  黑客工具&SRC技能文档&DF册本&web安全等(可分享)


结语

网络安全产业就像一个江湖,各色人等聚集。相对于西欧国家根本踏实(懂加密、会防护、能挖洞、擅工程)的浩繁王谢端正,我国的人才更多的属于歪路左道(许多白帽子大概会不平气),因此在将来的人才造就和创建上,须要调解布局,鼓励更多的人去做“正向”的、团结“业务”与“数据”、“主动化”的“体系、创建”,才气解人才之渴,真正的为社会全面互联网化提供安全保障。
   特别声明:
此教程为纯技能分享!本教程的目标决不是为那些怀有不良动机的人提供及技能支持!也不负担由于技能被滥用所产生的连带责任!本教程的目标在于最大限度地唤醒各人对网络安全的器重,并接纳相应的安全步伐,从而镌汰由网络安全而带来的经济丧失
  

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表