首页
社区
课程
招聘
[分享]加固与脱壳-加固介绍
2022-2-2 15:28 7699

[分享]加固与脱壳-加固介绍

2022-2-2 15:28
7699

0x1 加固概念

  1.App主要面临威胁有

 

App主要面临威胁有,反编译,二次打包,动态调试,hook等

 

  2.为什么需要加固?

 

加固是为了保护APK不被别人逆向分析,保护程序核心代码。

0x2 加壳

  1.加壳概念

 

加壳通常是对dex文件进行加密存储,在程序运行的时候由壳程序将dex文件解密到内存执行

 

 

  2.壳程序和加密和的dex重新打包生成apk文件,加密后使用apktool工具反编译经常只能看到很少的代码(多数是壳程序代码),程序运行时通过壳程序解密dex文件到内存中执行。

 

  3.加壳的发展阶段

 

 

dex动态加载:破坏头等方法

 

代码抽取:将一部分函数放到so文件中

 

动态解密:只有函数被程序调用,才会解密

 

vmp虚拟机加密:只有vmp虚拟机才能执行代码

 

  4.代码混淆

 

名称混淆:将类名函数名替换为随机字符串

 

逻辑混淆:打乱代码执行流程,增加逆向人员分析程序流程的难度

0x3 反调试

  1.java层反调试

 

逆向工程师可以通过jdb调试工具对apk进行java代码调试,为了防止apk被调试,在配置文件清单加入AndroidMainfest.xml, Android: debuggable=false/true(false就是不允许调试)

 

针对这种反调试可以通过反编译修改属性false为true重新打包。

 

  2.so反调试实现

 

 

1)Ptrace防护,app运行后,还会产生一个子进程,对app进行附加,这个时候我们就不能使用动态调试工具对他附加了。

 

针对这种情况,我们可以开两个ida,先对子进程附加,这样子进程就处于暂停状态了,再用另外一个ida去附加app就没问题了。

 

2)为了解决上面的问题,出现了右边图示,app创建一个子进程,子进程创建一个子子进程,子进程就app附加,子子进程对子进程附加,app对子子进程附加,形成“黄金铁三角”。

 

针对这种情况,只能想办法修改安装系统源码,修改fork函数,让fork函数失效。

 

  3.tracePID反调试

 

通过检查TracePid的值是否为0来判断当前进程是否被调试(app运行时的状态)

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
40
41
42
43
44
45
adb devices
adb shell
ps  //列出进程
cat /proc/2004/status   //查看进程状态
 
Name:   sh
State:  R (running)
Tgid:   2004
Ngid:   0
Pid:    2004
PPid:   1078
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 1004 1007 1011 1015 1028 3001 3002 3003 3006 3009
VmPeak:     4680 kB
VmSize:     4680 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      2508 kB
VmRSS:      2508 kB
VmData:      932 kB
VmStk:       136 kB
VmExe:       280 kB
VmLib:      2868 kB
VmPTE:        16 kB
VmSwap:        0 kB
Threads:        1
SigQ:   2/28209
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000381000
SigCgt: 000000000801e4ff
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Seccomp:        0
Cpus_allowed:   3
Cpus_allowed_list:      0-1
voluntary_ctxt_switches:        76
nonvoluntary_ctxt_switches:     8

可以看到TracerPid: 0说明没有被别的进程附加调试(如果被调试TracerPid的值就是调试器进程id),pid是自己的id,ppid是父进程的id

0x3 反注入

  1.概念

 

程序在运行时会加载自身依赖的so文件,注入就是我们可以让程序加载我们自己定义的一些so文件,反注入检查当前加载的一些so文件,如果被注入,程序就结束。

 

  2.输入cat /proc/2004/maps,查看当前进程加载的哪些so文件。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
aosp:/ # cat /proc/2004/maps
8aaaa000-8aaf0000 r-xp 00000000 08:02 353        /system/bin/sh
8aaf0000-8aaf1000 r--p 00045000 08:02 353        /system/bin/sh
8aaf1000-8aaf2000 rw-p 00046000 08:02 353        /system/bin/sh
8aaf2000-8aaf3000 rw-p 00000000 00:00 0          [heap]
c7bc0000-c7c80000 rw-p 00000000 00:00 0          [anon:libc_malloc]
c7c91000-c7cb1000 r--s 00000000 00:0e 4157       /dev/__properties__/u:object_r:
default_prop:s0
c7cb1000-c7d9c000 r-xp 00000000 08:02 1197       /system/lib/libc++.so
c7d9c000-c7d9d000 ---p 00000000 00:00 0
c7d9d000-c7da1000 r--p 000eb000 08:02 1197       /system/lib/libc++.so
c7da1000-c7da2000 rw-p 000ef000 08:02 1197       /system/lib/libc++.so
c7da2000-c7da3000 rw-p 00000000 00:00 0          [anon:.bss]
c7da3000-c7e81000 r-xp 00000000 08:02 1198       /system/lib/libc.so
c7e81000-c7e82000 ---p 00000000 00:00 0
c7e82000-c7e85000 r--p 000de000 08:02 1198       /system/lib/libc.so
c7e85000-c7e87000 rw-p 000e1000 08:02 1198       /system/lib/libc.so
c7e87000-c7e88000 rw-p 00000000 00:00 0          [anon:.bss]
c7e88000-c7e89000 r--p 00000000 00:00 0          [anon:.bss]
c7e89000-c7e8f000 rw-p 00000000 00:00 0          [anon:.bss]
c7e8f000-c7ec4000 r-xp 00000000 08:02 1274       /system/lib/libm.so
c7ec4000-c7ec5000 r--p 00034000 08:02 1274       /system/lib/libm.so
c7ec5000-c7ec6000 rw-p 00035000 08:02 1274       /system/lib/libm.so
c7ec9000-c7ecb000 r-xp 00000000 08:02 1295       /system/lib/libnetd_client.so
c7ecb000-c7ecc000 ---p 00000000 00:00 0
c7ecc000-c7ecd000 r--p 00002000 08:02 1295       /system/lib/libnetd_client.so
c7ecd000-c7ece000 rw-p 00003000 08:02 1295       /system/lib/libnetd_client.so
c7ed3000-c7ef3000 r--s 00000000 00:0e 4184       /dev/__properties__/properties_
serial
c7ef3000-c7ef4000 rw-p 00000000 00:00 0          [anon:linker_alloc_vector]
c7ef4000-c7ef5000 r--p 00000000 00:00 0          [anon:atexit handlers]
c7ef5000-c7f15000 r--s 00000000 00:0e 4184       /dev/__properties__/properties_
serial
c7f15000-c7f16000 rw-p 00000000 00:00 0          [anon:linker_alloc_vector]
c7f16000-c7f17000 rw-p 00000000 00:00 0          [anon:linker_alloc_small_object
s]
c7f17000-c7f18000 rw-p 00000000 00:00 0          [anon:linker_alloc_vector]
c7f18000-c7f1a000 rw-p 00000000 00:00 0          [anon:linker_alloc]
c7f1a000-c7f1b000 r--p 00000000 00:00 0          [anon:linker_alloc]
c7f1b000-c7f1c000 rw-p 00000000 00:00 0          [anon:linker_alloc_lob]
c7f1c000-c7f1d000 r--p 00000000 00:00 0          [anon:linker_alloc]
c7f1d000-c7f1e000 rw-p 00000000 00:00 0          [anon:linker_alloc_vector]
c7f1e000-c7f1f000 rw-p 00000000 00:00 0          [anon:linker_alloc_small_object
s]
c7f1f000-c7f20000 rw-p 00000000 00:00 0          [anon:linker_alloc_vector]
c7f20000-c7f21000 rw-p 00000000 00:00 0          [anon:linker_alloc_small_object
s]
c7f21000-c7f22000 rw-p 00000000 00:00 0          [anon:arc4random _rsx structure
]
c7f22000-c7f23000 rw-p 00000000 00:00 0          [anon:arc4random _rs structure]
 
c7f23000-c7f24000 r--p 00000000 00:00 0          [anon:atexit handlers]
c7f24000-c7f25000 ---p 00000000 00:00 0          [anon:thread signal stack guard
 page]
c7f25000-c7f27000 rw-p 00000000 00:00 0          [anon:thread signal stack]
c7f27000-c7f29000 r--p 00000000 00:00 0          [vvar]
c7f29000-c7f2a000 r-xp 00000000 00:00 0          [vdso]
c7f2a000-c7ff7000 r-xp 00000000 08:02 226        /system/bin/linker
c7ff7000-c7ffa000 r--p 000cc000 08:02 226        /system/bin/linker
c7ffa000-c7ffb000 rw-p 000cf000 08:02 226        /system/bin/linker
c7ffb000-c7ffd000 rw-p 00000000 00:00 0
c7ffd000-c7ffe000 r--p 00000000 00:00 0
c7ffe000-c8000000 rw-p 00000000 00:00 0
cffdf000-d0000000 rw-p 00000000 00:00 0          [stack]

  3.可以将系统so文件加入白名单,如果加载了非白名单so文件,就可以判断被注入了。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞4
打赏
分享
最新回复 (2)
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2022-2-6 21:17
2
0
谢谢,正在学习当中。
雪    币: 280
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jinju 2022-2-28 11:49
3
0
奈斯
游客
登录 | 注册 方可回帖
返回