首页
论坛
课程
招聘
[原创]某陪玩软件协议加密算法分析(so层分析)
2021-2-21 17:32 10435

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

2021-2-21 17:32
10435

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

 

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

1
2
3
4
5
6
7
if ( v11 == -2109534065 )
        {
          v20 = v9->functions->RegisterNatives(&v9->functions, v34, (const JNINativeMethod *)off_7283C, 6);
          v5 = -1802225456;
          v10 = 86439211;
          v11 = -(~(v20 >> 31) | 0x3253F2B3) - 581453431;
        }

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.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

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

 

4.要分析的协议

1
2
3
4
5
6
7
8
9
10
11
12
{
    "data": {
        "pri": "......",
        "fingerprint": "......",
        "tn": ".....",
        "sessionId": "......",
        "fpEncode": xx
    },
    "encrypt": 1,
    "organization": "......",
    "channel": "......"
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at com.android.okhttp.okio.Okio$1.write(Okio.java:76)
    at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:155)
    at com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176)
    at com.android.okhttp.okio.RealBufferedSink.write(RealBufferedSink.java:46)
    at com.android.okhttp.internal.http.Http1xStream$FixedLengthSink.write(Http1xStream.java:288)
    at com.android.okhttp.okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176)
    at com.android.okhttp.okio.RealBufferedSink$1.write(RealBufferedSink.java:198)
    at java.io.OutputStream.write(OutputStream.java:75)
    at com.ishumei.O000O0000O0oO.O000O00000OoO.a(Unknown Source:245)
    at com.ishumei.O000O0000O0oO.O000O00000OoO.a(Unknown Source:119)
    at com.ishumei.O0000O000000oO.O000O0000OoO$O0000O000000oO$1.run(Unknown Source:94)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.os.HandlerThread.run(HandlerThread.java:65)

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

1
2
3
4
5
6
7
public static String a(boolean z, String str, boolean z2, String str2) {
       try {
           return new SMSDK().y2(z, str, z2, str2);
       } catch (Throwable th) {
           throw new IOException(th);
       }
   }

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位加密
图片描述
与原结果进行比较
图片描述
大功告成!


看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

最后于 2021-5-14 17:26 被Mr.YX编辑 ,原因: 修改了部分错误
收藏
点赞5
打赏
分享
最新回复 (14)
雪    币: 11081
活跃值: 活跃值 (3157)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
LowRebSwrd 活跃值 4 2021-2-21 19:20
2
0
不错! 好文
雪    币: 470
活跃值: 活跃值 (808)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
_air 活跃值 2021-2-21 22:10
3
0
感谢分享!超赞!真就ollvm是纸老虎了!
雪    币: 262
活跃值: 活跃值 (322)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
327135569 活跃值 2021-2-22 00:56
4
0
这是算法分析还是搁这找 call 呢... 这个 ollvm 的状态变量有点简陋.
雪    币: 1226
活跃值: 活跃值 (615)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
ST0n5 活跃值 2021-2-22 10:59
5
0
前后都能连接上,文章分析的协议很完整
雪    币: 1157
活跃值: 活跃值 (873)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
gtict 活跃值 2021-2-23 10:02
6
0
有些混淆确实变量很明显,,白混淆了~~
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
静思己过 活跃值 2021-2-24 18:27
7
0
给个联系方式大佬
雪    币: 229
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
静思己过 活跃值 2021-2-24 18:27
8
0
给个联系方式大佬,有偿分析
雪    币: 655
活跃值: 活跃值 (375)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
歌神鸡比 活跃值 2021-2-26 14:43
9
0
这个是什么版本的APP?
雪    币: 8578
活跃值: 活跃值 (1435)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux 活跃值 2021-2-26 19:53
10
1
可以提供一下原文件吗?想要复现一下,感谢!
雪    币: 1006
活跃值: 活跃值 (705)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Mr.YX 活跃值 2021-2-28 12:08
11
0
qux 可以提供一下原文件吗?想要复现一下,感谢!
已经提供了版本号,你去搜索下载一下
雪    币: 655
活跃值: 活跃值 (375)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
歌神鸡比 活跃值 2021-3-1 14:26
12
0
这个y2 在IDA中怎么看?
雪    币: 8578
活跃值: 活跃值 (1435)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux 活跃值 2021-3-1 23:33
13
0
Mr.YX 已经提供了版本号,你去搜索下载一下
感谢!
雪    币: 1495
活跃值: 活跃值 (2458)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
hczhong 活跃值 2021-3-15 02:37
14
0
前段时间分析过smid,讲道理,smid生成这一块还是做的一般般, md5、aes、rsa都是标准的。ollvm混淆强度也不够大,只分析过生成过程,生成之后正常业务能不能做就不清楚--
游客
登录 | 注册 方可回帖
返回