工具cryscanner使用记录
# 描述
部署并使用工具cryscanner
# 前言
这个工具完成的不是很好,代码中有必须进行修改的地方,否则无法正常运行。此外,给的例子中,配置文件也需要修改,否则无法正常运行。
# 步骤
# 部署
1、克隆这个仓库
git clone https://github.com/amitsirius/cryscanner.git
1
2、修改其源代码
# 文件log_scanner
# log_scanner.py文件中
# 开头部分添加以下代码
import re
# def __parseObjects(self, obj):函数中
# 删掉以下两行
fname_t = Word(printables) + Suppress(Literal('('))
fname = fname_t.parseString(obj[0])[0]
# 修改为以下代码
fname = None
header = obj[0].strip()
match = re.search(r'\bin\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(', header)
if match:
fname = match.group(1)
else:
match = re.match(r'([A-Za-z_][A-Za-z0-9_]*)\s*\(', header)
if match:
fname = match.group(1)
if fname is None:
print(f"[ERROR]: unable to parse function header: {header}")
return
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 文件order
# order.py文件中
# 删掉以下代码
from greenery.lego import parse
# 修改为下列代码
from greenery import parse
# 函数def __init__(self, fsm, states, finals)中
# 删掉以下代码
self.machine.add_transition(trigger=key2, source=str(key), dest=str(fsm.map[key][key2]))
self.gmachine.add_transition(trigger=key2, source=str(key), dest=str(fsm.map[key][key2]))
self.events.add(key2)
print(f"trigger={key2}, source={key}, dest={fsm.map[key][key2]}");
# 修改为以下代码
trigger = str(key2)
self.machine.add_transition(trigger=trigger, source=str(key), dest=str(fsm.map[key][key2]))
self.gmachine.add_transition(trigger=trigger, source=str(key), dest=str(fsm.map[key][key2]))
self.events.add(trigger)
print(f"trigger={trigger}, source={key}, dest={fsm.map[key][key2]}");
# 函数def verify(self, LObj)中
# 修改以下代码
for k in self.FSM.events:
if self.Objects[k].getfname() == o.getfname():
call_flow.append(k)
# 变成下面代码
for k in self.FSM.events:
if k not in self.Objects:
continue
if self.Objects[k].getfname() == o.getfname():
call_flow.append(k)
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
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
3、修改各个子测试例子中的rules文件
OBJECTS
a: EVP_CIPHER_CTX_new()
b: EVP_CIPHER_CTX_free(c)
…………
l: des_ecb_cipher()
ORDER
(ab)*
(cd+ed*)*
(km+nm*)*
(fg+h)*
CONSTRAINTS
x1: REPLAY(i:salt)
x2: REPLAY(c:iv)
…………
x9: RAND(f:key)
FORBIDDEN
h,l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
需要注意的点,如果log解析成功,但是规则分析时出错。大概率是CONSTRAINTS 这个部分的内容写的不规范。一定是 x_{n}:开头的 ,有的会没有这个。
另外一个例子:
OBJECTS
a: RSA_public_encrypt()
b: RSA_private_decrypt()
c: RSA_generate_key()
d: RSA_generate_key_ex()
ORDER
CONSTRAINTS
x1: EQ(b:padding == 4)
x2: EQ(d:bits >= 1024)
FORBIDDEN
a,b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
3、创建conda虚拟环境
conda create -n cryscanner python=3.12.3 -y
# 如果环境中没有gdb,openssl 。也需要安装
conda install gdb openssl
1
2
3
2
3
4、安装依赖,以下内容写入一个require.txt文件中,pip install -r require.txt即可
greenery==4.2.2
mpmath==1.3.0
nistrng==1.2.3
numpy==2.5.0
pyparsing==3.3.2
scipy==1.18.0
six==1.17.0
sympy==1.14.0
transitions==0.9.3
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 运行
1、创建可运行例子
首先编译一个包含密码学调用的程序,以tests/aes_encryption/aes_example.c为例子
gcc -g -o aes_example aes_example.c -lcrypto
1
生成了 aes_example
2、执行gdb调试,生成log文件
接下来执行
gdb -q aes_example testMessage
# 如果程序需要输入参数,可以使用以下命令
gdb --args yourExeFile arg1Babala arg2
1
2
3
2
3
在gdb命令行中,依次输入
# gdb命令行中输入
source debug_lib.py
simple_command
1
2
3
2
3
输出会被保存到 log.txt 中
如果想要直接一条命令执行,中间不输入其他命令,也可以执行下面的命令
gdb -q \
-ex 'set debuginfod enabled on' \
-ex 'set pagination off' \
-ex 'source debug_lib.py' \
-ex 'simple_command' \
-ex 'quit' \
--args ./aes_example testMess
1
2
3
4
5
6
7
2
3
4
5
6
7
3、解析log文件
接下来运行 main.py
python ../../main.py -r rules -l log.txt
1
会得到分析结果。