前言
最近遇到一个wibu加密的程序,使用wibu证书进行授权,类似于sentianl的软锁SL,没有加密狗。
前期准备
- 下载运行环境codemeter runtime,我这里使用的是程序自带的runtime,版本为6.60,运行平台为linux。
下载链接:https://pan.baidu.com/s/1E_6qsUx57Irc4s-E88fD6g?pwd=koqk 提取码:koqk
1
2
3
4
5
6
7
8
|
$cmu
-
v
cmu
-
CodeMeter Universal Support Tool.
Version
6.60
of
2017
-
Dec
-
18
(Build
2869
)
for
Linux
Copyright (C)
2007
-
2017
by WIBU
-
SYSTEMS AG.
All
rights reserved.
Operating System:
Name: Ubuntu
18.04
.
6
LTS (Kernel
5.4
.
0
-
124
-
generic)
Architecture: x86_64
|
- 一个以WibuCmLIF结尾的许可信息文件
由于某种原因,无法分享我在使用的WibuCmLIF文件,有需要的朋友可以找找使用wibu加密的产品。
空许可信息文件的生成可以通过以下命令行,此操作需要测试fsb或厂商fsb,详情可参考
1
|
cmboxpgm.exe
-
f6000010
-
lif:
"MyFirstUfcLif.WibuCmLIF"
-
lfs:smart:
3
-
lpn:
"Universal Firm Code - 2000"
-
lpid:
2000
-
lopt:vm,reimport
-
v
|
初步接触
- 先使用
cmu -i -f xxx.WibuCmLIF
来尝试导入许可信息文件,结果报错:无法在虚拟机上导入该证书
1
2
3
4
5
6
|
$cmu
-
i
-
f xxx.WibuCmLIF
cmu
-
CodeMeter Universal Support Tool.
Version
6.60
of
2017
-
Dec
-
18
(Build
2869
)
for
Linux
Copyright (C)
2007
-
2017
by WIBU
-
SYSTEMS AG.
All
rights reserved.
List
remote updates failed: It
is
not
permitted to use this license on a virtual machine, Error
273.
|
- 只能先跟一下cmu,看看cmu的工作原理。cmu绝大多数的功能都是由libwibucm.so实现。继续跟踪该so文件,发现它connect一个服务端,并将xxx.WibuCmLIF的内容加密后打包发送,可以大胆的猜测服务端才是这次分析主菜。服务器端的端口为22350,程序为CodeMeterLin。
1
2
3
|
sudo netstat
-
tlp | grep
22350
tcp
0
0
0.0
.
0.0
:
22350
0.0
.
0.0
:
*
LISTEN
12483
/
CodeMeterLin
tcp6
0
0
[::]:
22350
[::]:
*
LISTEN
12483
/
CodeMeterLin
|
- cmu还有一个有趣的方法防止调试,就是上述xxx.WibuCmLIF加密时使用当前时间作为密钥,服务器收到加密数据使用接收到数据的时间作为密钥解密,一旦调试起来在传输的某个过程停留超过几秒则服务器无法解密数据,错误代码如下所示。
1
2
3
4
5
6
|
cmu
-
i
-
f xxx.WibuCmLIF
cmu
-
CodeMeter Universal Support Tool.
Version
6.60
of
2017
-
Dec
-
18
(Build
2869
)
for
Linux
Copyright (C)
2007
-
2017
by WIBU
-
SYSTEMS AG.
All
rights reserved.
List
remote updates failed: A network error occurred, Error
100.
|
分析CodeMeterLin
先分析一下CodeMeterLin有哪些算法,在IDA上最好是使用findcrypt插件,另外还可使用binwalk或者die。 我这里使用的是die,可以看到有base64和AES、sha256等常用算法。
打开WibuCmLIF文件看看,看到这串字符串大概就能推断出是base64加密。解密后放进die看看其熵值,蛮高的,感觉还是加密的状态。
一开始认为需要aes或des解密,在两个算法的相关函数下断点,并没有发现明显解密的过程,最后直接追踪tcp接收流的去向,找到了相关的解密(解扰)算法,其中0x5917和0x4A6B是算法参数,而a2初值为WibuCmLIF文件的时间戳(TimeStamp)。解完之后可以再看看数据的熵值,看看是不是还需要解密。如图,熵值降低了很多,并且能看到明显的字符串,可以认为解密成功了。
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
|
char __fastcall license_dec(__int64 a1, __int64 a2)
{
int
v2;
/
/
edx
char result;
/
/
al
_DWORD
*
v4;
/
/
rcx
unsigned __int64 v5;
/
/
r8
unsigned __int64 v6;
/
/
r8
unsigned
int
v7;
/
/
edx
__int64 v8;
/
/
rax
v2
=
*
(_DWORD
*
)(a1
+
260
);
result
=
0
;
if
( (v2 &
1
)
=
=
0
)
{
result
=
1
;
if
( (v2 &
2
) !
=
0
)
{
v4
=
*
(_DWORD
*
*
)(a1
+
264
);
if
( v4 )
{
v5
=
*
(_QWORD
*
)(a1
+
280
);
if
( v5 )
{
result
=
0
;
if
( !a2 )
return
result;
v6
=
v5 >>
2
;
if
( v6 )
{
v7
=
0
;
v8
=
0LL
;
do
{
v4[v8] ^
=
a2;
v8
=
+
+
v7;
a2
=
0x5917
*
a2
+
0x4A6B
;
}
while
( v7 < v6 );
v2
=
*
(_DWORD
*
)(a1
+
260
);
}
}
}
result
=
1
;
*
(_DWORD
*
)(a1
+
260
)
=
v2 &
0xFFFFFFFD
;
}
}
return
result;
}
|
解完后的数据是一段asn1码流,可以使用一些在线网站初步解析,但里面有很多wibu自己定义的字段,需要写代码将这些asn1定义涵盖进来。
这里先放LIF的解析过程,有兴趣的朋友可以自行查看,后续的文件也会涉及到这里面的函数。这里先看看虚拟机检测函数,大致是检测CPU信息、硬盘信息、中断表、驱动等,待会需要先强制修改返回值来跳过虚拟机检查。
【预告】
接下来会讲解一下如何asn1的一些相关知识,以及如何使用CodeMeterLin内的asn1定义解析码流。
更多【wibu证书 - 初探】相关视频教程:www.yxfzedu.com