首页
社区
课程
招聘
去花枝零.三《电商某宝》
发表于: 2023-7-12 17:26 9651

去花枝零.三《电商某宝》

2023-7-12 17:26
9651

没有什么最高最低境界 闲来无事 搞一下新so 提升下技术

今天就献丑拿某电商排行第一的APK样本做一下IDA脚本一键去花指令分析。还有我们追求的是完美去花 而不是去花 完美去花再去动态调试会更清晰的调试出来函数路径 这个大家应该都能理解把!

献上对比图,因为没有对比就没有伤害

图片描述

图片描述

顺带着还原个字符串混淆,左边是混淆前,右边是去了混淆后,可以看到所有字符串的明文跟引用全部成功修复

图片描述

当然还有替换进去的运行图

图片描述
图片描述


讲完效果就开干呗!

简单分析

  • 字符串混淆
    图片描述
    图片描述
    图片描述

经笔者分析,此so大量引用文中 HlupqL3ZAR J2qaFN4xHz pDhsAJkF7h TToWEhuDP6 四个函数,大家都知道FindClass参数原型是

1
jclass FindClass(const char* name)

上三个图中的byte_25A6D8地址明显是未初始化在开始的阶段,而当经过j_HlupqL3ZAR函数才会赋值,我们有理由怀疑HlupqL3ZAR函数是字符串解密函数!并且解密后置标志位byte_25A81F为1 防止每次使用都去解密,浪费效率!!!

直接还原下这个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main
 
import "fmt"
//    # 参数1返回值 参数2是data长度 3是加密前的块长度是参数2 参数4是key 参数5是key长度 参数6是iv
func HlupqL3ZAR(arg1 []byte, arg2 int32, arg3 []byte, arg4 []byte, arg5 int32, arg6 byte) {
    if arg2 != 0 {
        var x12_1 int64
        if (arg2 & 1) != 0 {
            x12_1 = 1
            arg1[0] = arg4[0] ^ (arg3[0] - arg6)
        } else {
            x12_1 = 0
        }
        if ((arg2&1) != 0 && arg2 != 1) || ((arg2&1) == 0 && arg2 != 1) {
            x8_4 := int64(0)
            x11_1 := arg3[(x12_1 + 1):]
            v11addr := x12_1 + 1
            for (arg2 - int32(x12_1)) != int32(x8_4) {
                x14_1 := int32((x12_1 + 1) + x8_4)
                x16_3 := arg1[(x12_1 + x8_4):]
                x16_3[0] = arg4[((x14_1-1)%arg5)] ^ (arg3[v11addr+x8_4-1] - arg6) //
                x13_5 := x11_1[x8_4]
                x8_4 = (x8_4 + 2)
                x16_3[1] = arg4[(x14_1%arg5)] ^ (x13_5 - arg6)
            }
        }
    }
}
 
func main() {
    {
        byte_25A6D8 := make([]byte, 48)
        byte_1D7C5B := []byte{0x6A, 0x92, 0x37, 0x70, 0x68, 0x8F, 0x3B, 0x2B, 0x68, 0x8D, 0x43, 0x70, 0x5E, 0x94, 0x56, 0x2A, 0x73, 0x88, 0x55, 0x1C, 0x36, 0x7E, 0x3F, 0x2C, 0x5C, 0x7D, 0x3B, 0x19, 0x60, 0x52, 0x39, 0x1D, 0x6C, 0x91, 0x79, 0x3C, 0x6C, 0x8E, 0x1F, 0x25, 0x6A, 0x88, 0x54, 0x19, 0x70, 0x92, 0x3A, 0x8D, 0x96, 0x31, 0xDD, 0xDD, 0x5E, 0x50, 0x12, 0xA8, 0x59, 0xC4, 0xBE, 0x59, 0x07, 0xBB, 0x8F, 0xE0, 0xA6}
        byte_19D0CB := []byte{0xB0, 0x94, 0xCD, 0xF6}
        HlupqL3ZAR(byte_25A6D8, 48, byte_1D7C5B, byte_19D0CB, 4, 151)
        fmt.Println(string(byte_25A6D8))
    }
 
}

图片描述

得到结果,确认无误,不过我们只是拿到并无大用,我们要做的是让IDA也知道他是啥这样他才能更好的帮我们去分析引用不是嘛!要学会跟IDA分工合作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
LOAD:0000000000152D50                 ADRP            X20, #byte_25A81F@PAGE
LOAD:0000000000152D54                 LDRB            W8, [X20,#byte_25A81F@PAGEOFF]
LOAD:0000000000152D58                 TBZ             W8, #0, loc_152D70
----
 
-----
LOAD:0000000000152D84                 ADRP            X0, #byte_25A6D8@PAGE
LOAD:0000000000152D88                 ADRP            X2, #byte_1D7C5B@PAGE
LOAD:0000000000152D8C                 ADRP            X3, #byte_19D0CB@PAGE
LOAD:0000000000152D90                 ADD             X0, X0, #byte_25A6D8@PAGEOFF
LOAD:0000000000152D94                 ADD             X2, X2, #byte_1D7C5B@PAGEOFF
LOAD:0000000000152D98                 ADD             X3, X3, #byte_19D0CB@PAGEOFF
LOAD:0000000000152D9C                 MOV             W1, #0x30 ; '0'
LOAD:0000000000152DA0                 MOV             W4, #4
LOAD:0000000000152DA4                 MOV             W5, #0x97
LOAD:0000000000152DA8                 BL              j_HlupqL3ZAR
LOAD:0000000000152DAC                 MOV             W8, #1
LOAD:0000000000152DB0                 STRB            W8, [X20,#byte_25A81F@PAGEOFF]

经过分析我们发现所有的字符串混淆都有以下特征,首先就是拿到标志位0x25A81F 判断字符串是否已经被初始化 如果初始化过将会跳转下一个分支处理 这就是 TBZ W8, #0, loc_152D70指令要做的事情
如果未初始化,将要保存string的地址加载到x0 w1保存数据长度 .... 以上go代码有注释,此处不在废话!
初始化完成后将会 STRB W8, [X20,#byte_25A81F@PAGEOFF] 置0x25A81F为1 已标记此string被处理过!

根据特征我们直接写idapass脚本!

  • 处理前 我们不能清晰的知道每个string的值 需要动态调试
    图片描述

  • 处理后 静态就可以看到一切 省时省力
    图片描述


样本 某宝最新版 libsgm。。。so-6.6.230509.so

因为这个so很复杂 本来准备分几篇发呢 看了下...


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2024-3-31 19:54 被至尊小仙侠编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (12)
雪    币: 498
活跃值: (4291)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2023-7-12 17:38
0
雪    币: 3443
活跃值: (14163)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
3
到你这什么都是“最高“” 
2023-7-12 17:41
0
雪    币: 2978
活跃值: (7983)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
珍惜Any 到你这什么都是“最高“”
没有啊 最新的两个帖子 没贴最高啊  如果有问题的话 我改一下
2023-7-12 17:47
0
雪    币: 2978
活跃值: (7983)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5

给大家说声对不起 起了个让大家介意我的标题 大佬批评的对   我的标题确实有问题 我改正 

最后于 2024-3-31 18:55 被至尊小仙侠编辑 ,原因:
2023-7-12 18:07
0
雪    币: 1030
活跃值: (344)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这次给你81,戒骄戒躁,继续前行
2023-7-12 19:02
0
雪    币: 2978
活跃值: (7983)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
ForrestV 这次给你81,戒骄戒躁,继续前行[em_28]
谢谢谢谢 文章我会慢慢加出来 这个so确实比较难  我想想思路怎么写出来
2023-7-12 19:05
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
大佬,这个去花的脚本星球有不
2023-9-10 11:07
0
雪    币: 3535
活跃值: (31011)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2023-9-10 22:33
1
雪    币: 88
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
带样本号了,这个必须给满分
2024-3-1 15:36
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
大佬星球还可以加吗?
2024-3-14 10:41
0
雪    币: 5
活跃值: (374)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
一个处理前贴图 一个处理后贴图
哈哈哈哈哈哈哈
懂的人不看 不懂的人看了也不懂
帖子0分 
但是开课的话 可以加1分
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
2024-3-15 10:23
0
雪    币: 220
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
懂的人不看 不懂的人看了也不懂,帖子确实0分
2024-3-18 12:30
0
游客
登录 | 注册 方可回帖
返回
//