首页
社区
课程
招聘
[原创]某陪玩软件协议加密算法分析(so层分析)
发表于: 2021-2-21 17:32 17241

[原创]某陪玩软件协议加密算法分析(so层分析)

2021-2-21 17:32
17241

1.jadx反编译apk,查看版本号
图片描述

2.打开libsmsdk.so,找到JNI_Onload函数,导入jni.h文件,找到RegisterNatives函数。

3.off_7283C即为JNI动态注册的函数。

aX2,aX4,aX6,aZ3,aY2_0 的传参和返回值都是jstring类型。初步判断这些是加解密函数。

4.要分析的协议

5.使用Frida hook java.net.SocketOutputStream.socketWrite函数,并打印调用栈

6.根据调用栈找到对应函数

7.打开IDA定位到y2 函数
图片描述

8.进入sub_19188() 函数
图片描述
图片描述
整个函数用了混淆,但影响不大,抓住关键点就行。

9.从返回值开始入手,返回值是jstring类型的指针
图片描述
根据v340,查找引用定位到此处
图片描述
好家伙,s即为加密结果的字符串指针。继续查找s引用
图片描述
继续查找v190的引用
图片描述
发现v190参数有两个来源。根据v190=v406定位到此处
图片描述
第二个来源定位到此处
图片描述

10.分别在上图的sub_6188处打上断点。IDA动态调试确认一下。发现在,v29 = sub_6188(v403, v28, 0)断下;
图片描述
执行前R0的值为
图片描述
执行后R0的值为
图片描述
可以确定此函数为加密算法了。

11.跟进此函数,查找a1的引用,定位到此处
图片描述
sub_3549C函数传入指针s,计算的结果在指针v54中,然后再传入sub_504c。

12.继续跟进sub_504C,查找a2的引用
图片描述
定位到此处
图片描述
根据传参猜测为AES加密。跟进sub_386B0函数确认一下,猜测此函数为扩展密钥函数,看看是否调用了sbox数组,进入子函数
图片描述
图片描述
可以确定次函数为AES加密算法了。

13.ida 动态调试抠出算法代码,测试运行,传入参数
图片描述
结果:
图片描述
进行base64位加密
图片描述
与原结果进行比较
图片描述
大功告成!

 
if ( v11 == -2109534065 )
        {
          v20 = v9->functions->RegisterNatives(&v9->functions, v34, (const JNINativeMethod *)off_7283C, 6);
          v5 = -1802225456;
          v10 = 86439211;
          v11 = -(~(v20 >> 31) | 0x3253F2B3) - 581453431;
        }
if ( v11 == -2109534065 )
        {
          v20 = v9->functions->RegisterNatives(&v9->functions, v34, (const JNINativeMethod *)off_7283C, 6);
          v5 = -1802225456;
          v10 = 86439211;
          v11 = -(~(v20 >> 31) | 0x3253F2B3) - 581453431;
        }
.data.rel.ro:0007283C off_7283C       DCD aZ1                 ; DATA XREF: JNI_OnLoad+2F0↑o
.data.rel.ro:0007283C                                         ; JNI_OnLoad+2F6↑o ...
.data.rel.ro:0007283C                                         ; "z1"
.data.rel.ro:00072840                 DCD aLandroidConten     ; "(Landroid/content/Context;)Ljava/lang/S"...
.data.rel.ro:00072844                 DCD sub_3F094+1
.data.rel.ro:00072848                 DCD aX2                 ; "x2"
.data.rel.ro:0007284C                 DCD aLjavaLangStrin_2   ; "(Ljava/lang/String;Ljava/lang/String;)L"...
.data.rel.ro:00072850                 DCD sub_3F098+1
.data.rel.ro:00072854                 DCD aX4                 ; "x4"
.data.rel.ro:00072858                 DCD aLjavaLangStrin_2   ; "(Ljava/lang/String;Ljava/lang/String;)L"...
.data.rel.ro:0007285C                 DCD sub_3F0A0+1
.data.rel.ro:00072860                 DCD aX6                 ; "x6"
.data.rel.ro:00072864                 DCD aLjavaLangStrin_2   ; "(Ljava/lang/String;Ljava/lang/String;)L"...
.data.rel.ro:00072868                 DCD sub_3F524+1
.data.rel.ro:0007286C                 DCD aZ3                 ; "z3"
.data.rel.ro:00072870                 DCD aLjavaLangStrin_3   ; "(Ljava/lang/String;)I"
.data.rel.ro:00072874                 DCD sub_3F634+1
.data.rel.ro:00072878                 DCD aY2_0               ; "y2"
.data.rel.ro:0007287C                 DCD aZljavaLangStri     ; "(ZLjava/lang/String;ZLjava/lang/String;"...
.data.rel.ro:00072880                 DCD sub_3F7AC+1
.data.rel.ro:0007283C off_7283C       DCD aZ1                 ; DATA XREF: JNI_OnLoad+2F0↑o
.data.rel.ro:0007283C                                         ; JNI_OnLoad+2F6↑o ...
.data.rel.ro:0007283C                                         ; "z1"
.data.rel.ro:00072840                 DCD aLandroidConten     ; "(Landroid/content/Context;)Ljava/lang/S"...
.data.rel.ro:00072844                 DCD sub_3F094+1
.data.rel.ro:00072848                 DCD aX2                 ; "x2"
.data.rel.ro:0007284C                 DCD aLjavaLangStrin_2   ; "(Ljava/lang/String;Ljava/lang/String;)L"...
.data.rel.ro:00072850                 DCD sub_3F098+1
.data.rel.ro:00072854                 DCD aX4                 ; "x4"
.data.rel.ro:00072858                 DCD aLjavaLangStrin_2   ; "(Ljava/lang/String;Ljava/lang/String;)L"...
.data.rel.ro:0007285C                 DCD sub_3F0A0+1
.data.rel.ro:00072860                 DCD aX6                 ; "x6"
.data.rel.ro:00072864                 DCD aLjavaLangStrin_2   ; "(Ljava/lang/String;Ljava/lang/String;)L"...
.data.rel.ro:00072868                 DCD sub_3F524+1
.data.rel.ro:0007286C                 DCD aZ3                 ; "z3"
.data.rel.ro:00072870                 DCD aLjavaLangStrin_3   ; "(Ljava/lang/String;)I"
.data.rel.ro:00072874                 DCD sub_3F634+1
.data.rel.ro:00072878                 DCD aY2_0               ; "y2"
.data.rel.ro:0007287C                 DCD aZljavaLangStri     ; "(ZLjava/lang/String;ZLjava/lang/String;"...
.data.rel.ro:00072880                 DCD sub_3F7AC+1
 
{
    "data": {
        "pri": "......",
        "fingerprint": "......",
        "tn": ".....",
        "sessionId": "......",
        "fpEncode": xx
    },
    "encrypt": 1,
    "organization": "......",
    "channel": "......"
}
{

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-5-14 17:26 被Mr.YX编辑 ,原因: 修改了部分错误
收藏
免费 8
支持
分享
最新回复 (17)
雪    币: 6573
活跃值: (3873)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
2
不错! 好文
2021-2-21 19:20
0
雪    币: 530
活跃值: (975)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享!超赞!真就ollvm是纸老虎了!
2021-2-21 22:10
0
雪    币: 262
活跃值: (357)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这是算法分析还是搁这找 call 呢... 这个 ollvm 的状态变量有点简陋.
2021-2-22 00:56
0
雪    币: 1229
活跃值: (694)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
前后都能连接上,文章分析的协议很完整
2021-2-22 10:59
0
雪    币: 252
活跃值: (3213)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
有些混淆确实变量很明显,,白混淆了~~
2021-2-23 10:02
0
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
给个联系方式大佬
2021-2-24 18:27
0
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
给个联系方式大佬,有偿分析
2021-2-24 18:27
0
雪    币: 634
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个是什么版本的APP?
2021-2-26 14:43
0
雪    币: 13038
活跃值: (5708)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux
10
可以提供一下原文件吗?想要复现一下,感谢!
2021-2-26 19:53
1
雪    币: 817
活跃值: (931)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
qux 可以提供一下原文件吗?想要复现一下,感谢!
已经提供了版本号,你去搜索下载一下
2021-2-28 12:08
0
雪    币: 634
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这个y2 在IDA中怎么看?
2021-3-1 14:26
0
雪    币: 13038
活跃值: (5708)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux
13
Mr.YX 已经提供了版本号,你去搜索下载一下
感谢!
2021-3-1 23:33
0
雪    币: 455
活跃值: (3885)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
前段时间分析过smid,讲道理,smid生成这一块还是做的一般般, md5、aes、rsa都是标准的。ollvm混淆强度也不够大,只分析过生成过程,生成之后正常业务能不能做就不清楚--
2021-3-15 02:37
0
雪    币: 280
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
感觉好有趣 可以提下原文件嘛 想跟着学一学
2022-11-23 15:18
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
有没有大佬frida hook smid hook so层 hook不到对应的函数呀
2023-9-4 22:20
0
雪    币: 3004
活跃值: (30866)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
mark
2023-9-5 10:03
1
游客
登录 | 注册 方可回帖
返回
//