Fetching...

-

Just a minute...

研究背景

在之前OLLVM项目的研究过程中,我们发现反调试技术对反混淆脚本有一定的干扰作用,如果可以在OLLVM的中间代码中自动化插入反调试代码,那么就可以给OLLVM的代码混淆增加一层保障。

方案分析

探讨多种方案以后,我认为最适合在汇编代码中进行代码嵌入,原因如下:

1.首先,在C语言或者LL层的高级语言中,存在比较复杂的括号和分支语句,代码有可能错误的嵌入。

2.其次,反调试代码主要是以汇编语言为主,所以选择越底层的语言嵌入越好。

但是在汇编代码中的嵌入依然存在很大的问题:

1.我们要确定汇编程序的代码段,而且要把函数进行划分,甚至要划分出,在一个基本块或函数之内进行代码嵌入。

2.汇编代码中存在比较多的分支和跳转,混淆代码的插入可能会破坏原程序流程。

3.有些混淆代码并不是连续的,而且包含跳转语句,因此嵌入时需要对上下文的语义进行分析。

初步脚本

选择一种最简单的嵌入形式,即假设已经确定需要嵌入的代码段,处理完分支和跳转,而且嵌入的代码是连续的,那么只需要直接完成嵌入工作即可。于是用python写出一个样例脚本模拟OLLVM的工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#conding=utf-8
from Cryptodome.Util.number import *;

code=[" .byte 0x80 ;auto insert\n",
" int 3 ;auto insert\n",
" rdtsc ;auto insert\n"]

n=int(input("请输入需要插入的代码段的数量:"))
with open("Code.asm","r") as f:
strr=[]
while(True):
line=f.readline()
if not line:
break
strr.append(line)
for i in range(n):
index=getRandomRange(1,len(strr))
cindex=getRandomRange(0,3)
strr.insert(index,code[cindex])
with open("output.asm","w") as o:
for i in range(len(strr)):
o.write(strr[i])

运行效果

假设有下面这样的汇编文件Code.asm:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
start:
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov es,ax
cld
lea di,nametab
a20loop:
call b10read
cmp namelen,0
jz a30
cmp namectr,30
je a30
call d10stor
jmp a20loop
a30:
cmp namectr,1
jbe a40
; call g10sort
call k10disp
a40:
mov ah,4ch
Int 21h
b10read proc near
mov ah,09h
lea dx ,messg1
int 21h
mov ah,0ah
lea dx,namepar
int 21h
mov ah,09h
lea dx,crlf
Int 21h
mov bx,0
mov bl ,namelen
mov cx,21
sub cx,bx
b20:
mov namefld[bx],20h
inc bx
loop b20
ret
d10stor proc near
inc namectr
cld
lea si , namefld
mov cx,10
rep movsw
ret
g10sort proc near
sub di ,40
mov endaddr,di
g20:
mov swapped,0
lea si,nametab
g30:
mov cx,20
mov di,si
add di,20
add ax,di
mov ax,di
mov bx,si
repe cmpsb
jbe g40
call h10xchg
g40: mov si,ax
cmp swapped,0
jnz g20
ret
h10xchg proc near
mov cx,10
lea di , namesav
mov si,bx
rep movsw
mov cx,10
mov di,bx
rep movsw
mov cx ,10
lea si,namesav
rep movsw
mov swapped,1
ret
k10disp proc near
mov ah,09
lea dx,messg2
int 21h
lea si,nametab
k20:
lea di,namesav
mov cx,10
rep movsw
mov ah,09
lea dx, namesav
int 21h
dec namectr
jnz k20
ret

运行后得到的output.asm如下:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
start:
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
mov es,ax
cld
lea di,nametab
a20loop:
call b10read
cmp namelen,0
jz a30
cmp namectr,30
je a30
call d10stor
jmp a20loop
a30:
cmp namectr,1
jbe a40
; call g10sort
call k10disp
a40:
mov ah,4ch
Int 21h
b10read proc near
mov ah,09h
lea dx ,messg1
int 21h
mov ah,0ah
lea dx,namepar
int 21h
mov ah,09h
lea dx,crlf
Int 21h
mov bx,0
mov bl ,namelen
int 3 ;auto insert
mov cx,21
sub cx,bx
b20:
rdtsc ;auto insert
mov namefld[bx],20h
inc bx
loop b20
ret
rdtsc ;auto insert
d10stor proc near
inc namectr
cld
int 3 ;auto insert
lea si , namefld
mov cx,10
rep movsw
rdtsc ;auto insert
ret
g10sort proc near
rdtsc ;auto insert
sub di ,40
mov endaddr,di
g20:
mov swapped,0
lea si,nametab
g30:
mov cx,20
mov di,si
int 3 ;auto insert
add di,20
.byte 0x80 ;auto insert
add ax,di
mov ax,di
mov bx,si
repe cmpsb
jbe g40
call h10xchg
g40: mov si,ax
cmp swapped,0
jnz g20
ret
h10xchg proc near
mov cx,10
lea di , namesav
mov si,bx
rep movsw
mov cx,10
mov di,bx
rep movsw
mov cx ,10
lea si,namesav
rep movsw
.byte 0x80 ;auto insert
mov swapped,1
ret
k10disp proc near
mov ah,09
lea dx,messg2
int 21h
lea si,nametab
k20:
int 3 ;auto insert
lea di,namesav
mov cx,10
rep movsw
mov ah,09
lea dx, namesav
int 21h
dec namectr
jnz k20
ret

初步实现了嵌入功能。


2020520 愿所有关心我的人都能被温柔相待,愿世间所有人都能乐观阳光积极向上。特别感谢我的父母一直含辛茹苦地哺育着我,我爱你们。

Related post
Comment
Share
  • ACTF2020密码学部分writeup

    编写的项目文件请参考项目链接。同时欢迎大家访问ACTF2020的所有赛题。喜欢的话请多多资瓷一下,给我们实验室的项目加个Star或者Fork,谢谢。 为了保护服务器的同时不给选手带来更多困难,密码学部分的交互题开了pow算力检测,我也...

    ACTF2020密码学部分writeup
  • 基于门限方案的条形码保密及容错技术

    关键词:门限方案,条形码保密,条形码容错,条形码认证与防伪造。 经历过初期两个小项目的探索,我们项目团队积累了一定的项目研究经验,在老师和16级学长的帮助下,我们把研究方向转到了门限方案的实际应用上。结合市面上用9张合并的条形码提高条...

    基于门限方案的条形码保密及容错技术
  • 2020新年原创脚本-其中的小把戏你清楚吗

    关键词:随机数素数生成,新年祝福小程序。 脚本创作这是我在大年三十写的一个程序,当时我正准备去伯克利交流,但由于疫情的缘故,出国变数增大,所以我就打算通过随机数“未卜先知”。以下就是我的脚本: 12345678910111213141...

    2020新年原创脚本-其中的小把戏你清楚吗
  • 基于CRT的物流信息安全处理方案

    关键词:中国剩余定理,密钥分发技术,隐私保护。 引言在2018年11月份的时候,段老师在密码学课上讲到了密钥分发协议,我当时就觉得这个协议很有意思也很有应用前景。后来老师还很主动地分享了一下它的idea,其中一部分就是有关物流单上的信...

    基于CRT的物流信息安全处理方案
  • 基于CRT的新型群文件共享系统

    关键词:隐私保护,权限管理,身份认证,中国剩余定理,密钥分发,密钥更新。 这个项目的是在2019年寒假期间进行的,4月份在中南大学信息安全作品赛答辩,但是由于功能只实现了主体部分,加之我在台上比较胆怯紧张,所以只获得团队三等奖,但是当...

    基于CRT的新型群文件共享系统
  • 安卓反混淆软件探索-deobf

    关键词:代码混淆,代码反混淆及其原理,代码反混淆软件测试与性能对比。 前言我们的大创项目其实是分两方面进行的,一方面,我们从代码混淆的角度比较各种软件对安卓程序的加固能力;另一方面,我们着重针对OLLVM进行反混淆测试。OLLVM集成...

    安卓反混淆软件探索-deobf
  • 记一次安卓代码加固软件的测试过程

    关键词:代码加固,软件测试,原理分析,过程分析。 在大创项目的实践中,我们对市面上的一些安卓代码加固软件进行了采集,经过搜集,发现了几类代码加固方法并分组进行研究。我发现很多代码加固软件都是对java字节码进行混淆与加固,另外一些则选...

    记一次安卓代码加固软件的测试过程
  • 对OLLVM代码加固技术的改进

    1.反静态调试反静态调试可以通过花指令,代码加密,代码加壳等方式实现。 请看图1所示的一段反调试代码: ​ 图1 花指...

    对OLLVM代码加固技术的改进
  • OLLVM代码加固机制分析

    我们通过自己编写测试代码,再用OLLVM的不同指令进行加固,并逆向查看加固效果,加深对代码加固机理的了解。OLLVM目前提供的功能包括控制流平坦化(fla指令),指令替代(sub指令),代码虚拟化(bcf指令)以及虚假控制流(obf指...

    OLLVM代码加固机制分析
  • 对音频缓存加密的探讨

    关键词:缓存解密,批量自动执行脚本,版权保护相关建议。 前段时间,某音乐被爆其缓存文件只使用了简单的异或加密,且容易得到加密密钥为0xa3。原文链接点击这里。以下是我的延伸探讨。 1.对音频缓存的批量解密攻击抱着好奇的心理,我把手机...

    对音频缓存加密的探讨
Please check the parameter of comment in config.yml of hexo-theme-Annie!