Gemini首先需要大量的源代码和对应的汇编代码作为训练数据。这些数据可以从开源项目或者其他途径获取。而在我们的这次项目中不需要进行数据收集阶段,因此为实现Gemini,我们首先需要做的是进行ACFG的提取,接着进行一系列的操作实现代码复现。
2.1.1.1 ACFG提取
收集到的数据需要进行预处理以便于神经网络的训练,此处对应我们进行的ACFG的提取。ACFG的提取方法我们采用和Genius相同方法,大致提取ACFG的过程如下:
1.对给定的源代码进行语法分析,生成语法树。
2.对语法树进行遍历,提取出函数、变量、控制语句等信息,并构建AST(抽象语法树)。
3.对AST进行数据流分析,确定每个变量在程序执行过程中的值和使用情况。
4.在数据流分析的基础上,构建CFG(控制流图),表示程序中各个控制语句之间的依赖关系。
5.将CFG转化为ACFG(抽象控制流图),其中每个节点表示一个代码块,每个边表示控制流经过的条件和可能的路径。ACFG可以用于代码的优化和分析。
提取ACFG的过程是一个复杂的过程,需要对源代码进行多次分析和转换,以确保提取出的ACFG能够准确地反映出程序的控制流程。我们利用交互式反汇编器专业版(Interactive Disassembler Professional)来进行ACFG的提取。它是最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器,是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序,被公认为最好的逆向工程利器,是分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具,支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。实验进行环境为Python2.7。因为IDA6.8版本的IDApython功能尚不完全,因此事先需要我们手动进行配置,在此不再赘述。ACFG提取的脚本,srtp.py如下:
# -*- coding: utf-8 -*-
import os
import re
# -*- coding: utf-8 -*-
import os
import re
i = 1
while i < 101 :
# 执行jmeter脚本
cmd = "C:\\Users\\security\\Desktop\\IDA_6.8\\idaq.exe -c -A -S\"C:\\Users\\security\\" \
"Desktop\\Gencoding-master\\Gencoding-master\\raw-feature-extractor\\preprocessing_ida.py " \
"--path C:\\Users\\security\\Desktop\\test\" data_set/"+str(i)
其中使用的核心脚本函数为preprocessing_ida.py:
from func import *
from raw_graphs import *
from idc import *
import os
import argparse
def parse_command():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--path", type=str, help="The directory where to store the generated .ida file")
args = parser.parse_args()
return args
if __name__ == '__main__':
args = parse_command()
#path = args.path
path = idc.ARGV[2]
analysis_flags = idc.GetShortPrm(idc.INF_START_AF)
analysis_flags &= ~idc.AF_IMMOFF
# turn off "automatically make offset" heuristic
idc.SetShortPrm(idc.INF_START_AF, analysis_flags)
idaapi.autoWait()
cfgs = get_func_cfgs_c(FirstSeg())
binary_name = idc.GetInputFile() + '.ida'
fullpath = os.path.join(path, binary_name)
pickle.dump(cfgs, open(fullpath,'w'))
print binary_name
idc.Exit(0)
这是最终提取出的100个ACFG:
在提取ACFG的时候,第81个文件无法正常进行,对其单独进行提取的时候,会弹出如下警告:
采用64位的IDA后,可以成功实现提取。
至此,ACFG的提取过程结束,对Gemini复现的初步探索得以实现。