From d52ccb61acb3d9220c67b7b36488e3f8ccf494db Mon Sep 17 00:00:00 2001 From: jco Date: Fri, 7 Sep 2018 16:13:36 +0200 Subject: [PATCH] Add new functionality - Comparaison via callCFG --- docs/CALL_CFG.md | 138 +++++ docs/screenshots/callCFG.png | Bin 0 -> 14174 bytes docs/screenshots/callCFG_2.png | Bin 0 -> 10921 bytes docs/screenshots/callCFG_view.png | Bin 0 -> 89376 bytes docs/screenshots/example_callCFG_view.png | Bin 0 -> 53808 bytes docs/screenshots/jaccard_index.png | Bin 0 -> 29412 bytes docs/screenshots/new_callCFG.png | Bin 0 -> 16764 bytes polichombr/analysis_tools/__init__.py | 5 + .../analysis_tools/lib_callCFG/C_CFG.py | 540 ++++++++++++++++++ .../analysis_tools/lib_callCFG/__init__.py | 7 + .../lib_callCFG/ccfg_analyzeitrb.py | 39 ++ .../lib_callCFG/compare_ccfg.py | 182 ++++++ polichombr/controllers/analysis.py | 2 +- polichombr/controllers/api.py | 21 +- polichombr/controllers/callCFG.py | 139 +++++ polichombr/controllers/sample.py | 10 +- polichombr/controllers/tasks/task_callCFG.py | 68 +++ polichombr/controllers/tasks/task_peinfo.py | 239 +++++--- polichombr/models/callCFG.py | 68 +++ polichombr/templates/sample.html | 72 +++ polichombr/views/api_sample.py | 38 ++ polichombr/views/forms.py | 5 +- polichombr/views/webui_sample.py | 99 +++- requirements.txt | 1 + 24 files changed, 1588 insertions(+), 85 deletions(-) create mode 100644 docs/CALL_CFG.md create mode 100644 docs/screenshots/callCFG.png create mode 100644 docs/screenshots/callCFG_2.png create mode 100644 docs/screenshots/callCFG_view.png create mode 100644 docs/screenshots/example_callCFG_view.png create mode 100644 docs/screenshots/jaccard_index.png create mode 100644 docs/screenshots/new_callCFG.png create mode 100644 polichombr/analysis_tools/__init__.py create mode 100644 polichombr/analysis_tools/lib_callCFG/C_CFG.py create mode 100644 polichombr/analysis_tools/lib_callCFG/__init__.py create mode 100644 polichombr/analysis_tools/lib_callCFG/ccfg_analyzeitrb.py create mode 100644 polichombr/analysis_tools/lib_callCFG/compare_ccfg.py create mode 100644 polichombr/controllers/callCFG.py create mode 100644 polichombr/controllers/tasks/task_callCFG.py create mode 100644 polichombr/models/callCFG.py diff --git a/docs/CALL_CFG.md b/docs/CALL_CFG.md new file mode 100644 index 0000000..aa26383 --- /dev/null +++ b/docs/CALL_CFG.md @@ -0,0 +1,138 @@ +# Call CFG + +Call CFG is a program's representation, based on the *Control Flow Graph* _(CFG)_ and *function call*. Two features are available : *Generation* and *Comparaison*. This documentation will explain these features. + + +## Mode 1 : Generation + +### Algorithm specification + +1. Determine the beginning address of analysis. Otherwise, entrypoint will be used. +2. Get all `call` instructions of function analyzed (determined by address in previous step) from disassembled code (with `metasm`) +3. For each `call` instruction : + * Get Machoc hash of '*caller function*' + * Get Machoc hash of '*called function*' + * Create t-uple `Machoc(caller function) -> Machoc(called function)` + * Back to *step 3* recursively for each '*called function*' +4. Stored all t-uples in database +5. Generate .dot and .png files + +### Example + +Here is an example to illustrate the algorithm. From binary to call CFG representation.
+*(The source code is displayed for better understanding)* + +* Source code + +``` +int main(){ + for (int i=0; i < 2000; i++){ + if (i > 100) + printf("This is a program test : %d\n",i); + else + function2(); +} + +void function2(){ + return; +} +``` + + +* Call CFG representation + +![Example Call CFG](screenshots/callCFG.png) + +With this example, extracted t-uples are : + +* Machoc('sym._main') -> Machoc('sym.__main') +* Machoc('sym._main') -> Machoc('sym._printf') +* Machoc('sym._main') -> Machoc('sym._function2') + +That corresponds to : + +``` +(ccdaf4fc, e1aa82b3) +(ccdaf4fc, 1a02300e) +(ccdaf4fc, 7c91cb3a) +``` + + +## Mode 2 : Comparaison + +This second feature compare two call CFG and allow us to identify quickly the precise differences. + +### Algorithm specification + +1. Get t-uples from database for compared files n°1 and n°2 : `tuples_ccfg_1` and `tuples_ccfg_2`
*(Feature 'Generation' must be used first)* +2. Jaccard index (Intersection over Union) is calculated, using t-uples +3. Set differences are calculated : `tuples_ccfg_1 \ tuples_ccfg_2` and `tuples_ccfg_2 \ tuples_ccfg_1` +4. Create new call CFG with differences in specific color (red) + +### Example + + * T-uples of analyzed file n°1 : `tuples_ccfg_1` + +We can use example in *Mode 1 : Generation* : + +``` +(ccdaf4fc, e1aa82b3) +(ccdaf4fc, 1a02300e) +(ccdaf4fc, 7c91cb3a) +``` + + * T-uples of analyzed file n°2 : `tuples_ccfg_2` + +We can generate t-uples from this example binary :
+*(The source code is displayed for better understanding)* + +``` +int main(){ + for (int i=0; i < 10; i++){ + if (i % 2 = 0) + printf("Even number : %d\n",i); + else + printf("Odd number : %d\n",i); +} +``` + +Call CFG representation : + +![Example Call CFG File 2](screenshots/callCFG_2.png) + + +``` +(ccdaf4fc, e1aa82b3) +(ccdaf4fc, 1a02300e) +(ccdaf4fc, 1a02300e) +``` + + * Jaccard index + +With this representation, we can easily calculate Jaccard index : + +![Example Jaccard Index](screenshots/jaccard_index.png) + +`S(cCFG1, cCFG2) = 2 / 4 = 50.0 % ` + +* Set differences + +`cCFG2 \ cCFG2 = (ccdaf4fc, 1a02300e) ` + +`cCFG1 \ cCFG2 = (ccdaf4fc, 7c91cb3a) ` + + +* New call CFG of analyzed file n°1, with differents in analyzed file n°2 + +![Example new Call CFG](screenshots/new_callCFG.png) + + +## Usage : + +You can find comparaison results in tab 'Classification' in Polichombr. Except for this example, only binaries with Jaccard index >= 80 % are displayed. + +![Call CFG Polichombr Example](screenshots/example_callCFG_view.png) + +## Screenshot : + +![Call CFG Polichombr](screenshots/callCFG_view.png) \ No newline at end of file diff --git a/docs/screenshots/callCFG.png b/docs/screenshots/callCFG.png new file mode 100644 index 0000000000000000000000000000000000000000..652fdbb42e43ffaedc9bc6b9701907d7be46c9cc GIT binary patch literal 14174 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/callCFG_view.png b/docs/screenshots/callCFG_view.png new file mode 100644 index 0000000000000000000000000000000000000000..fef57246389d7b50a6b9afb879928371893ab9eb GIT binary patch literal 89376 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 MA$vCYw9c*n1=>DjN&o-= literal 0 HcmV?d00001 diff --git a/docs/screenshots/jaccard_index.png b/docs/screenshots/jaccard_index.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ae43d2e7bff914a4582ec4c26ab377835e2631 GIT binary patch literal 29412 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 BD+&Mr literal 0 HcmV?d00001 diff --git a/docs/screenshots/new_callCFG.png b/docs/screenshots/new_callCFG.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d1a46a588654e0ffcce78b527e2c3badb1936d GIT binary patch literal 16764 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 \""+str(function_called_offset2)+"\" [color=\""+color+"\"];" + return content+"\n" + + def add_tuple(self, function_machoke1, function_machoke2, adresse_offset, adresse_offset2, offset_called_func): + """ + Save t-uple analyzed + """ + + if str(function_machoke2).startswith('0x'): + function_machoke2 = 'sub_'+function_machoke2[2:] + + #T-uples saved in DB offset_callCFG (with more details) + if function_machoke1+','+function_machoke2 not in self.tuple_ccfg_db: + self.tuple_offset.append([adresse_offset+','+adresse_offset2,function_machoke1+','+function_machoke2, "sub_"+adresse_offset[2:]+",sub_"+offset_called_func[2:]]) + + #T-uples saved in DB callCFG + self.tuple_ccfg_db.append(function_machoke1+','+function_machoke2) + + + def run_cmd_radare2(self, cmd, instance_r2 = None): + """ + Return radare2 result of command + """ + + if instance_r2: + return instance_r2.cmd(cmd) + else: + return self.r2_binary.cmd(cmd) + + def generate_file(self, content, filename=None): + """ + Generate dot and CFG files + Save file in directory 'polichombr/storage/' + """ + + if filename == None: + filename = self.hashfile + remove_extension = filename.split('.') + if len(remove_extension) > 1: + base_filename = ".".join(remove_extension[:-1]).split("/")[-1] + else: + base_filename = ".".join(remove_extension).split("/")[-1] + + dot_filename = "polichombr/storage/"+base_filename+'.dot' + png_filename = "polichombr/storage/"+base_filename+'.png' + + f = open(dot_filename,'wb') + f.write(content) + f.close() + self._print("Dot file generated : "+dot_filename) + + + (graph,) = pydot.graph_from_dot_file(dot_filename) + graph.write_png(png_filename) + self._print("PNG file generated : "+png_filename) + + def remove_duplicate(self, dict): + """ + Return dict without duplicates values + """ + + ret = {} + for key,value in dict.iteritems(): + if key not in ret.keys(): + ret[key] = value + return ret + + + + def generate_dot_content_info(self, function_offset): + """ + Return call CFG in dot format from specific + """ + + adresse_offset = self.get_offset(function_offset) + function_call = self.get_call_in_function(function_offset) + function_machoc = self.get_machoke_from_function(function_offset, self.machoc_functions) + dot_content = self.format_block_dot(function_offset, function_machoc, adresse_offset) + + #UCALL + for call_func in function_call["ucall"]: + machoke_signature = "" + offset_called_func = self.get_offset(call_func) + dot_content += self.format_block_dot(call_func, machoke_signature, offset_called_func) + dot_content += self.format_edge_dot(function_offset, call_func) + func_name_array = call_func.split(' ') + if len(func_name_array) == 1: + func_name = func_name_array[0] + else: + func_name = func_name_array[1].replace('(','').replace(')','')+func_name_array[0] + + + #self.add_tuple(function_machoc, func_name, adresse_offset,offset_called_func, offset_called_func) + self.add_tuple(function_machoc, machoke_signature, adresse_offset,offset_called_func, offset_called_func) + + + #CALL + for call_func in function_call["call"]: + machoke_signature = self.get_machoke_from_function(call_func, self.machoc_functions) + offset_called_func = self.get_offset(call_func) + #self.add_tuple(function_machoc, machoke_signature if machoke_signature != "" else call_func , adresse_offset,offset_called_func, offset_called_func) + self.add_tuple(function_machoc, machoke_signature , adresse_offset,offset_called_func, offset_called_func) + + + dot_content += self.format_block_dot(call_func, machoke_signature, offset_called_func) + dot_content += self.format_edge_dot(function_offset, call_func)#, offset_called_func) + + + + if call_func not in self.function_analyzed: + self.function_analyzed.append(call_func) + try: + dot_content += self.generate_dot_content_info(call_func) + except: + pass + + return dot_content + + + def generate_dot_info(self, function_offset): + """ + Concatenate dot content file + """ + + dot_content = """digraph code { + graph [bgcolor=azure fontsize=8 fontname="Courier" splines="ortho"]; + node [fillcolor=gray style=filled shape=box]; + edge [arrowhead="normal"];""" + + dot_content += self.generate_dot_content_info(function_offset) + + dot_content += "}" + + self.generate_file(dot_content) + +############################################################################# +############################## COMPARE ############################## +############################################################################# + + + def generate_dot_compare_info(self, function_offset,diff_tuples, second_filename): + """ + Concatenate dot compare content file + """ + + dot_content = """digraph code { + graph [bgcolor=azure fontsize=8 fontname="Courier" splines="ortho"]; + node [fillcolor=gray style=filled shape=box]; + edge [arrowhead="normal"];""" + + dot_content += self.generate_dot_content_compare_info(function_offset, diff_tuples) + + dot_content += "}" + + tmp_filename1 = self.hashfile.split('/')[-1].split('.')[0] + tmp_filename2 = second_filename.split('/')[-1].split('.')[0] + + filename = tmp_filename1+"_"+tmp_filename2 + self.generate_file(dot_content, filename) + + def generate_dot_content_compare_info(self, function_offset, diff_tuples): + """ + Return comapre call CFG in dot format from specific + """ + + adresse_offset = self.get_offset(function_offset) + function_call = self.get_call_in_function(function_offset) + function_machoc = self.get_machoke_from_function(function_offset, self.machoc_functions) + + dot_content = "" # Important ! + + if function_offset not in self.function_analyzed: + dot_content = self.format_block_dot(function_offset, function_machoc, adresse_offset, True) + + #UCALL + for call_func in function_call["ucall"]: + func_name_array = call_func.split(' ') + if len(func_name_array) == 1: + func_name = func_name_array[0] + else: + func_name = func_name_array[1].replace('(','').replace(')','')+func_name_array[0] + + tuple_tmp = function_machoc+","+func_name + dot_content += self.format_block_dot(call_func, "", self.get_offset(call_func), True) + dot_content += self.format_edge_dot(function_offset, call_func, tuple_tmp in diff_tuples) + if tuple_tmp in diff_tuples: + diff_tuples.remove(tuple_tmp) + + #CALL + for call_func in function_call["call"]: + machoke_signature = self.get_machoke_from_function(call_func, self.machoc_functions) + if machoke_signature == "": + tuple_tmp = function_machoc+","+call_func + else: + tuple_tmp = function_machoc+","+machoke_signature + dot_content += self.format_block_dot(call_func, machoke_signature, self.get_offset(call_func), True) + dot_content += self.format_edge_dot(function_offset, call_func, tuple_tmp in diff_tuples ) + if tuple_tmp in diff_tuples: + diff_tuples.remove(tuple_tmp) + + if call_func not in self.function_analyzed: + self.function_analyzed.append(call_func) + try: + dot_content += self.generate_dot_content_compare_info(call_func, diff_tuples) + except: + pass + + return dot_content + + def process_get_all_machoc_functions(self, filename, offset, instance_r2): + """ + Get machoc functions + """ + + machoc_functions = parse_machoc_signatures(filename+'.sign') + return self.get_all_machoc_functions(offset, instance_r2, machoc_functions) + + def get_all_machoc_functions(self, offset, instance_r2, machoc_functions): + """ + Get machoc functions from specific offset + """ + + all_machoc_func = [] + + function_call = self.get_call_in_function(offset, instance_r2) + function_machoc = self.get_machoke_from_function(offset, machoc_functions, instance_r2) + + + if self.first_loop == False: + all_machoc_func.append(function_machoc) + self.first_loop = True + + for call_func in function_call["ucall"]: + func_name_array = call_func.split(' ') + if len(func_name_array) == 1: + func_name = func_name_array[0] + else: + func_name = func_name_array[1].replace('(','').replace(')','')+func_name_array[0] + all_machoc_func.append(func_name) + + for call_func in function_call["call"]: + machoke_signature = self.get_machoke_from_function(call_func, machoc_functions, instance_r2) + if machoke_signature == "": + all_machoc_func.append(str(call_func)) + else: + all_machoc_func.append(machoke_signature) + if call_func not in self.all_machoc_function_analyzed: + self.all_machoc_function_analyzed.append(call_func) + try: + all_machoc_func.extend(self.get_all_machoc_functions(call_func, instance_r2, machoc_functions)) + except: + pass + return all_machoc_func + + + def init_r2_instance(self, filename): + """ + Initialize radare2 instance with filename parameter + """ + instance_r2 = r2pipe.open(filename, ['-2']) + # Open binary + if not self.is_valid_file(instance_r2): + self.kill("Not a valid binary file", instance_r2) + return + self.run_cmd_radare2('aaa', instance_r2) + return instance_r2 + + + def process_compare_call_CFG(self, compare_tuples): + """ + Process callCFG from entrypoint offset + """ + + filename2,diff_tuples,file2_offset = compare_tuples + instance_r2 = self.init_r2_instance(filename2) + + #Etape 1 : Get all machoc functions of file 2 + self.all_machoc_function_analyzed = [] + self.first_loop = False + self.array_all_machoc_func = self.process_get_all_machoc_functions(filename2, file2_offset, instance_r2) + self.function_analyzed = [] + + #Etape2 : Compare file 1 and file 2 + self.generate_dot_compare_info(self.offset, diff_tuples, filename2) + +############################################################################# +############################################################################# +############################################################################# + + def get_offset(self, func_name, instance_r2 = None): + """ + Return offset from specific + """ + + result = self.run_cmd_radare2('s @ '+str(func_name), instance_r2) + return result + + def process_call_CFG(self): + """ + Process callCFG from entrypoint offset + """ + + self._print("Start offset : "+str(self.get_offset(self.offset))) + self.generate_dot_info(self.offset) + + @staticmethod + def is_good_offset_value(offset): + """ + Check if offset is a good value + NOT USED YET + """ + r2_tmp = r2pipe.open(filename, ['-2']) + try: + r2_tmp.cmd("s {}".format(offset)) + return True + except: + return False \ No newline at end of file diff --git a/polichombr/analysis_tools/lib_callCFG/__init__.py b/polichombr/analysis_tools/lib_callCFG/__init__.py new file mode 100644 index 0000000..2f64a42 --- /dev/null +++ b/polichombr/analysis_tools/lib_callCFG/__init__.py @@ -0,0 +1,7 @@ +""" + This file is part of Polichombr. + + Organization : EDF-R&D-PERICLES-IRC + Author : JCO +""" + diff --git a/polichombr/analysis_tools/lib_callCFG/ccfg_analyzeitrb.py b/polichombr/analysis_tools/lib_callCFG/ccfg_analyzeitrb.py new file mode 100644 index 0000000..5e72882 --- /dev/null +++ b/polichombr/analysis_tools/lib_callCFG/ccfg_analyzeitrb.py @@ -0,0 +1,39 @@ +""" + This file is part of Polichombr. + + (c) 2016 ANSSI-FR + + + Description: + AnalyzeIt task implementation. +""" + +import os + +def remove_blacklist_machoc(functions): + blacklisted = [0x1a02300e,0xd3fa94a] + for func in list(functions.keys()): + if functions[func]["machoc"] in blacklisted: + functions.pop(func) + return functions + + +def parse_machoc_signatures(fname): + """ + Returns a dict containing the functions and the hashes + """ + # MACHOC report: we load the functions, hashes, etc. + functions = {} + if not os.path.exists(fname): + return functions + with open(fname) as infile: + fdata = infile.read() + items = fdata.split(";") + for i in items: + if ":" in i: + subitems = i.split(":") + machoc_h = int(subitems[0].strip(), 16) + address = int(subitems[1].strip(), 16) + functions[address] = dict(machoc=machoc_h, name="") + #functions = remove_blacklist_machoc(functions) + return functions \ No newline at end of file diff --git a/polichombr/analysis_tools/lib_callCFG/compare_ccfg.py b/polichombr/analysis_tools/lib_callCFG/compare_ccfg.py new file mode 100644 index 0000000..f6faac8 --- /dev/null +++ b/polichombr/analysis_tools/lib_callCFG/compare_ccfg.py @@ -0,0 +1,182 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" + This file is part of Polichombr. + + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description: Comparaison between callCFG + Date : 08/2018 +""" + +import sqlite3 as lite +import hashlib,os, argparse, collections, copy, hashlib, datetime +from ast import literal_eval + +from polichombr.controllers.callCFG import callCFGController, offset_callCFGController +from polichombr import api + +from C_CFG import * + +class compare_ccfg(): + def __init__(self, sample_id): + """ + Constructor + """ + + self.sample_id = sample_id + + self.ctrl_callCFG = callCFGController() + self.ctrl_offset_callCFG = offset_callCFGController() + + def _print(self, message): + """ + Print and log message + """ + #self.app.logger.info(self.tmessage + message) + print message + + + def compare_tuples(self, tuples_file1, tuples_file2): + """ + Return A_union_B and A_inter_B + """ + diff_tuples = [] + + tuples_file1 = list(literal_eval(tuples_file1)) + tuples_file2 = list(literal_eval(tuples_file2)) + + # Calculate (tuples_file1 U tuples_file2) + all_tuples = list() + all_tuples.extend(tuples_file1) + all_tuples.extend(tuples_file2) + total_element = len(all_tuples) + + # Get common element + count = 0 + for tuple_element in tuples_file1: + if tuple_element in tuples_file2: + tuples_file2.remove(tuple_element) + count += 1 + else: + diff_tuples.append(tuple_element) + + a_union_b = float(total_element-count) # A_union_B + a_inter_b = float(count) # A_inter_B + return a_inter_b, a_union_b, diff_tuples + + + def process_all_comparaison(self): + """ + Process comparaison with all objects in database + """ + + ccfg_obj1 = self.ctrl_callCFG.get_by_id(self.sample_id) + if ccfg_obj1 == None: + return + all_ccfg_obj = self.ctrl_callCFG.get_all(self.sample_id) + + dict_result = {} + + for ccfg_obj2 in all_ccfg_obj: + # Cast result into object callCFG_db + dict_result[ccfg_obj2.sample_id] = self.process_comparaison(ccfg_obj1, ccfg_obj2) + + return dict_result + + def get_png_comparaison(self, sample_id_2): + """ + Generate compare call-CFG PNG + """ + + + ccfg_obj1 = self.ctrl_callCFG.get_by_id(self.sample_id) + ccfg_obj2 = self.ctrl_callCFG.get_by_id(sample_id_2) + if ccfg_obj1 == None or ccfg_obj2 == None: + return + + self.process_comparaison(ccfg_obj1, ccfg_obj2, True) + + + + def process_comparaison(self, ccfg_obj1, ccfg_obj2, png=False): + """ + Process comparaison between ccfg_obj1 and ccfg_obj2 parameters + """ + + #Calculate difference pourcent with Jaccard Distance + a_inter_b, a_union_b, diff_tuples_1 = self.compare_tuples(ccfg_obj1.func_tuples, ccfg_obj2.func_tuples) #Get elements IN file1 and NOT IN file2 + a_inter_b, a_union_b, diff_tuples_2 = self.compare_tuples(ccfg_obj2.func_tuples, ccfg_obj1.func_tuples) #Get elements IN file2 and NOT IN file1 + + pourcent = (a_inter_b / a_union_b) * 100 + + + #Print result when Jaccard Distance >= 80% + result_diff = {} + if pourcent >= 80: + result_diff = self.get_differences(diff_tuples_1, diff_tuples_2, ccfg_obj1.sample_id, ccfg_obj2.sample_id) + + #Generate new call_CFG with differences + if png: + sample_1 = api.get_elem_by_type("sample", ccfg_obj1.sample_id) + sample_2 = api.get_elem_by_type("sample", ccfg_obj2.sample_id) + + c_cfg_inst = call_CFG(sample_1.storage_file, ccfg_obj1.offset_entrypoint) + + + tuples_file_2 = sample_2.storage_file, diff_tuples_1, ccfg_obj2.offset_entrypoint + c_cfg_inst.process_cCFG(tuples_file_2) + + else: + return pourcent, a_inter_b, a_union_b, result_diff + + + def get_differences(self, diff_tuples_1, diff_tuples_2, sample_id_1, sample_id_2): + """ + Print offset of call's differences between file1 and file2 + """ + + #Elements IN 'filename1' and NOT IN 'filename2' + diff_plus = [] + for value in diff_tuples_1: + tmp_dict = {} + id_row = "{0},{1}".format(sample_id_1, value) + row_inst = self.ctrl_offset_callCFG.get_by_id(id_row) + + if row_inst != None: + sample_id, machoc1, machoc2 = row_inst.id.split(',') + parent_func, child_func = row_inst.func_name.split(',') + offset_parent, offset_child = row_inst.offset_func.split(',') + + tmp_dict["parent_func"] = parent_func + tmp_dict["offset_parent"] = offset_parent + tmp_dict["child_func"] = child_func + tmp_dict["offset_child"] = offset_child + tmp_dict["machoc1"] = machoc1 + tmp_dict["machoc2"] = machoc2 + diff_plus.append(tmp_dict) + + + #Elements IN 'filename2' and NOT IN 'filename1' + diff_minus = [] + for value in diff_tuples_2: + + tmp_dict_2 = {} + + id_row = "{0},{1}".format(sample_id_2, value) + row_inst = self.ctrl_offset_callCFG.get_by_id(id_row) + + if row_inst !=None: + sample_id, machoc1, machoc2 = row_inst.id.split(',') + parent_func, child_func = row_inst.func_name.split(',') + offset_parent, offset_child = row_inst.offset_func.split(',') + + tmp_dict_2["parent_func"] = parent_func + tmp_dict_2["offset_parent"] = offset_parent + tmp_dict_2["child_func"] = child_func + tmp_dict_2["offset_child"] = offset_child + tmp_dict_2["machoc1"] = machoc1 + tmp_dict_2["machoc2"] = machoc2 + diff_minus.append(tmp_dict_2) + print "\n" + return diff_plus, diff_minus \ No newline at end of file diff --git a/polichombr/controllers/analysis.py b/polichombr/controllers/analysis.py index 4d01418..d3533ee 100644 --- a/polichombr/controllers/analysis.py +++ b/polichombr/controllers/analysis.py @@ -40,7 +40,7 @@ def load_tasks(self): os.listdir(app.config['TASKS_PATH']))) def form_module(fp): return os.path.splitext(fp)[0] - tasks_modules = list(map(form_module, tasks_files)) + tasks_modules = sorted(list(map(form_module, tasks_files))) #task_analyzeit must be first for task_filename in tasks_modules: if not task_filename.startswith('__'): try: diff --git a/polichombr/controllers/api.py b/polichombr/controllers/api.py index 24779e5..e04fc3a 100644 --- a/polichombr/controllers/api.py +++ b/polichombr/controllers/api.py @@ -25,6 +25,7 @@ from polichombr.controllers.family import FamilyController from polichombr.controllers.user import UserController from polichombr.controllers.idaactions import IDAActionsController +from polichombr.controllers.callCFG import callCFGController, offset_callCFGController from polichombr.models.sample import FunctionInfo @@ -50,6 +51,8 @@ class APIControl(object): analysiscontrol = AnalysisController( app.config['ANALYSIS_PROCESS_POOL_SIZE']) idacontrol = IDAActionsController() + callcfgcontrol = callCFGController() + offset_callcfgcontrol = offset_callCFGController() def __init__(self): """ @@ -63,7 +66,8 @@ def dispatch_sample_creation(self, user=None, tlp=TLPLevel.TLPWHITE, family=None, - zipflag=True): + zipflag=True, + offset_callCFG=None): """ If the sample is a ZipFile, we unpack it and return the last sample,otherwise we return a single sample. @@ -71,17 +75,18 @@ def dispatch_sample_creation(self, file_data = file_stream.read(4) file_stream.seek(0) if file_data.startswith(b"PK") and zipflag: - samples = self.create_from_zip(file_stream, user, tlp, family) + samples = self.create_from_zip(file_stream, user, tlp, family, offset_callCFG) else: sample = self.create_sample_and_run_analysis(file_stream, filename, user, tlp, - family) + family, + offset_callCFG) samples = [sample] return samples - def create_from_zip(self, file_stream, user, tlp, family): + def create_from_zip(self, file_stream, user, tlp, family, offset_callCFG): """ Iterates over the samples in the zip """ @@ -94,7 +99,8 @@ def create_from_zip(self, file_stream, user, tlp, family): name, user, tlp, - family) + family, + offset_callCFG) output_samples.append(sample) zcl.close() return output_samples @@ -105,7 +111,8 @@ def create_sample_and_run_analysis( originate_filename="", user=None, tlp_level=TLPLevel.TLPWHITE, - family=None): + family=None, + offset_callCFG=None): """ Creates a new sample and a schedule an analysis. We also check the file header for ZIP pattern: if a ZIP pattern is found, any file @@ -116,7 +123,7 @@ def create_sample_and_run_analysis( """ file_data = file_data_stream.read() sample = self.samplecontrol.create_sample_from_file( - file_data, originate_filename, user, tlp_level) + file_data, originate_filename, user, tlp_level, offset_callCFG) if sample.analysis_status == AnalysisStatus.TOSTART: self.analysiscontrol.schedule_sample_analysis(sample.id) if family is not None: diff --git a/polichombr/controllers/callCFG.py b/polichombr/controllers/callCFG.py new file mode 100644 index 0000000..bcf8aed --- /dev/null +++ b/polichombr/controllers/callCFG.py @@ -0,0 +1,139 @@ +""" + This file is part of Polichombr. + + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description: Managers for all the actions about call-CFG, associated with callCFG models + Date : 08/2018 +""" +from polichombr import app +from polichombr import db +from polichombr.models.callCFG import callCFG, offset_callCFG + + + +class callCFGController(object): + + """ + Wrapper to the callCFG model. + """ + + def __init__(self): + pass + + + @staticmethod + def add_callCFG(sample_id, func_tuples, entrypoint_offset): + """ + Adds a callCFG + """ + model_callCFG = callCFG() + model_callCFG.sample_id = sample_id + model_callCFG.func_tuples = func_tuples + model_callCFG.offset_entrypoint = entrypoint_offset + db.session.add(model_callCFG) + db.session.commit() + return True + + @staticmethod + def get_all(sid = None): + """ + Get all callcfg + """ + if sid != None: + return callCFG.query.filter(callCFG.sample_id != sid).all() + else: + return callCFG.query.all() + + @staticmethod + def get_by_id(sample_id): + """ + Get callCFG by its sample id. + """ + result = callCFG.query.filter_by(sample_id=sample_id).all() + return result[0] if len(result) > 0 else None + + @staticmethod + def delete(callCFG): + """ + Removes callCFG from database. + """ + db.session.delete(callCFG) + db.session.commit() + return + +class offset_callCFGController(object): + + """ + Wrapper to the offset_callCFG model. + """ + + def __init__(self): + pass + + @staticmethod + def add_offset_callCFG( sample_id, element, do_commit=True): + """ + Adds an offset_callCFG + """ + + offset_func, func_tuples, func_name = element + + model_offset_callCFG = offset_callCFG() + model_offset_callCFG.id = '{0},{1}'.format(sample_id, func_tuples) + model_offset_callCFG.sample_id = sample_id + model_offset_callCFG.offset_func = offset_func + model_offset_callCFG.func_name = func_name + + db.session.add(model_offset_callCFG) + + if do_commit: + db.session.commit() + + + + def add_multiple_offset_callCFG(self, sample_id, tuples): + """ + Adds multiple offset_callCFG + """ + for element in tuples: + self.add_offset_callCFG(sample_id, element, do_commit = False) + db.session.commit() + return True + + + @staticmethod + def get_by_sample_id(sample_id): + """ + Get offset_callCFG by its sample id. + """ + result = offset_callCFG.query.filter_by(sample_id=sample_id).all() + return result + + @staticmethod + def get_by_id(id): + """ + Get offset_callCFG by its sample id. + """ + result = offset_callCFG.query.filter_by(id=id).all() + return result[0] + + + @staticmethod + def delete(offset_callCFG, do_commit=True): + """ + Removes offset_callCFG from database. + """ + db.session.delete(offset_callCFG) + if do_commit: + db.session.commit() + return + + def delete_multiple_offset_callCFG(self, all_offset_callCFG): + """ + Delete multiple offset_callCFG + """ + for element in all_offset_callCFG: + self.delete(element, do_commit = False) + db.session.commit() + return True diff --git a/polichombr/controllers/sample.py b/polichombr/controllers/sample.py index e4fc10c..4b61079 100644 --- a/polichombr/controllers/sample.py +++ b/polichombr/controllers/sample.py @@ -45,7 +45,7 @@ def __init__(self): pass def create_sample_from_file(self, file_data, orig_filename="", user=None, - tlp_level=TLPLevel.TLPWHITE): + tlp_level=TLPLevel.TLPWHITE, offset_callCFG=None): """ Creates a sample from file data. Updates metadata, etc. """ @@ -84,6 +84,8 @@ def create_sample_from_file(self, file_data, orig_filename="", user=None, sample.sha1 = sha1(file_data).hexdigest() sample.sha256 = sha_256 sample.size = len(file_data) + sample.offset_callCFG = offset_callCFG + # Specific metadata, resulting from Tasks sample.import_hash = "" sample.machoc_hash = "" @@ -125,6 +127,12 @@ def delete(cls, sample): if os.path.exists(sample.storage_file): os.remove(sample.storage_file) + if os.path.exists(sample.storage_file.replace('.bin','.dot')): + os.remove(sample.storage_file.replace('.bin','.dot')) + + if os.path.exists(sample.storage_file.replace('.bin','.png')): + os.remove(sample.storage_file.replace('.bin','.png')) + strings = StringsItem.query.filter_by(sample_id=sample.id).all() attributes = [sample.filenames, diff --git a/polichombr/controllers/tasks/task_callCFG.py b/polichombr/controllers/tasks/task_callCFG.py new file mode 100644 index 0000000..b5d45dd --- /dev/null +++ b/polichombr/controllers/tasks/task_callCFG.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" + This file is part of Polichombr. + + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description: CallCFG task implementation. + Date : 08/2018 +""" + +import os +import time + +from polichombr import app +from polichombr.controllers.task import Task +from polichombr.controllers.callCFG import callCFGController, offset_callCFGController + +from polichombr.analysis_tools.lib_callCFG.C_CFG import call_CFG + + +class task_callCFG(Task): + + """ + Generate callCFG form file. + """ + + def __init__(self, sample): + super(task_callCFG, self).__init__() + self.tmessage = "CALLCFG TASK %d :: " % (sample.id) + self.sid = sample.id + self.tstart = None + self.storage_file = sample.storage_file + self.offset_callCFG = sample.offset_callCFG + + def execute(self): + self.tstart = int(time.time()) + app.logger.info(self.tmessage + "EXECUTE") + self.fname = self.storage_file + '.sign' + while not os.path.exists(self.fname): # Waiting Creation of Machoc file SHA256(file).bin.sign + time.sleep(1) + if int(time.time() - self.tstart) > 120: + app.logger.info(self.tmessage + " Machoc file not found") + return False + + self.process_call_CFG() #Generate callCFG + return True + + + def process_call_CFG(self): + app.logger.info(self.tmessage + 'Process call CFG') + + inst_ccfg = call_CFG(self.storage_file, self.offset_callCFG, app, self.tmessage) + self.offset, self.tuples, self.offset_tuples = inst_ccfg.process_cCFG() + + + def apply_result(self): + s_controller = callCFGController() + s_controller_offset = offset_callCFGController() + with app.app_context(): + app.logger.debug(self.tmessage + "APPLY_RESULT") + s_controller.add_callCFG(self.sid, self.tuples, self.offset) + s_controller_offset.add_multiple_offset_callCFG(self.sid, self.offset_tuples) + + + app.logger.debug(self.tmessage + "END - TIME %i" % + (int(time.time()) - self.tstart)) + return True \ No newline at end of file diff --git a/polichombr/controllers/tasks/task_peinfo.py b/polichombr/controllers/tasks/task_peinfo.py index 19814a4..eacb31c 100644 --- a/polichombr/controllers/tasks/task_peinfo.py +++ b/polichombr/controllers/tasks/task_peinfo.py @@ -18,6 +18,7 @@ from polichombr.controllers.sample import SampleController + class task_peinfo(Task): """ @@ -50,16 +51,174 @@ def execute(self): self.compile_timestamp = datetime.datetime.fromtimestamp( pe.FILE_HEADER.TimeDateStamp) self.import_hash = pe.get_imphash() - - metadata = self.generate_metadata(pe) - self.metadata_extracted.append(( SampleMetadataType.PE_import_hash, self.import_hash)) - - for item in metadata.items: - self.metadata_extracted.append(item) - + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_magic, + pe.DOS_HEADER.e_magic)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_cblp, + pe.DOS_HEADER.e_cblp)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_cp, + pe.DOS_HEADER.e_cp)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_crlc, + pe.DOS_HEADER.e_crlc)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_cparhdr, + pe.DOS_HEADER.e_cparhdr)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_minalloc, + pe.DOS_HEADER.e_minalloc)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_maxalloc, + pe.DOS_HEADER.e_maxalloc)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_ss, + pe.DOS_HEADER.e_ss)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_sp, + pe.DOS_HEADER.e_sp)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_csum, + pe.DOS_HEADER.e_csum)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_ip, + pe.DOS_HEADER.e_ip)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_cs, + pe.DOS_HEADER.e_cs)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_lfarlc, + pe.DOS_HEADER.e_lfarlc)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_ovno, + pe.DOS_HEADER.e_ovno)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_res, + pe.DOS_HEADER.e_res)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_oemid, + pe.DOS_HEADER.e_oemid)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_oeminfo, + pe.DOS_HEADER.e_oeminfo)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_res2, + pe.DOS_HEADER.e_res2)) + self.metadata_extracted.append(( + SampleMetadataType.PE_DOS_HEADER_e_lfanew, + pe.DOS_HEADER.e_lfanew)) + self.metadata_extracted.append(( + SampleMetadataType.PE_FILE_HEADER_Machine, + pe.FILE_HEADER.Machine)) + self.metadata_extracted.append(( + SampleMetadataType.PE_FILE_HEADER_NumberOfSections, + pe.FILE_HEADER.NumberOfSections)) + self.metadata_extracted.append(( + SampleMetadataType.PE_FILE_HEADER_TimeDateStamp, + pe.FILE_HEADER.TimeDateStamp)) + self.metadata_extracted.append(( + SampleMetadataType.PE_FILE_HEADER_PointerToSymbolTable, + pe.FILE_HEADER.PointerToSymbolTable)) + self.metadata_extracted.append(( + SampleMetadataType.PE_FILE_HEADER_NumberOfSymbols, + pe.FILE_HEADER.NumberOfSymbols)) + self.metadata_extracted.append(( + SampleMetadataType.PE_FILE_HEADER_SizeOfOptionalHeader, + pe.FILE_HEADER.SizeOfOptionalHeader)) + self.metadata_extracted.append(( + SampleMetadataType.PE_FILE_HEADER_Characteristics, + pe.FILE_HEADER.Characteristics)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_Magic, + pe.OPTIONAL_HEADER.Magic)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MajorLinkerVersion, + pe.OPTIONAL_HEADER.MajorLinkerVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MinorLinkerVersion, + pe.OPTIONAL_HEADER.MinorLinkerVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfCode, + pe.OPTIONAL_HEADER.SizeOfCode)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfInitializedData, + pe.OPTIONAL_HEADER.SizeOfInitializedData)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfUninitializedData, + pe.OPTIONAL_HEADER.SizeOfUninitializedData)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_AddressOfEntryPoint, + pe.OPTIONAL_HEADER.AddressOfEntryPoint)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_BaseOfCode, + pe.OPTIONAL_HEADER.BaseOfCode)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_ImageBase, + pe.OPTIONAL_HEADER.ImageBase)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SectionAlignment, + pe.OPTIONAL_HEADER.SectionAlignment)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_FileAlignment, + pe.OPTIONAL_HEADER.FileAlignment)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MajorOperatingSystemVersion, + pe.OPTIONAL_HEADER.MajorOperatingSystemVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MinorOperatingSystemVersion, + pe.OPTIONAL_HEADER.MinorOperatingSystemVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MajorImageVersion, + pe.OPTIONAL_HEADER.MajorImageVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MinorImageVersion, + pe.OPTIONAL_HEADER.MinorImageVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MajorSubsystemVersion, + pe.OPTIONAL_HEADER.MajorSubsystemVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_MinorSubsystemVersion, + pe.OPTIONAL_HEADER.MinorSubsystemVersion)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_Reserved1, + pe.OPTIONAL_HEADER.Reserved1)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfImage, + pe.OPTIONAL_HEADER.SizeOfImage)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfHeaders, + pe.OPTIONAL_HEADER.SizeOfHeaders)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_CheckSum, + pe.OPTIONAL_HEADER.CheckSum)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_Subsystem, + pe.OPTIONAL_HEADER.Subsystem)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_DllCharacteristics, + pe.OPTIONAL_HEADER.DllCharacteristics)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfStackReserve, + pe.OPTIONAL_HEADER.SizeOfStackReserve)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfStackCommit, + pe.OPTIONAL_HEADER.SizeOfStackCommit)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfHeapReserve, + pe.OPTIONAL_HEADER.SizeOfHeapReserve)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfHeapCommit, + pe.OPTIONAL_HEADER.SizeOfHeapCommit)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_LoaderFlags, + pe.OPTIONAL_HEADER.LoaderFlags)) + self.metadata_extracted.append(( + SampleMetadataType.PE_OPTIONAL_HEADER_NumberOfRvaAndSizes, + pe.OPTIONAL_HEADER.NumberOfRvaAndSizes)) return True def apply_result(self): @@ -67,72 +226,10 @@ def apply_result(self): with app.app_context(): sample = s_controller.get_by_id(self.sid) app.logger.debug(self.tmessage + "APPLY_RESULT") + # Compilation timestamp (even when faked) IS a file date, so update it. s_controller.add_multiple_metadata(sample, self.metadata_extracted) - - # Compilation timestamp IS a file date, so update it. s_controller.set_file_date(sample, self.compile_timestamp) s_controller.set_import_hash(sample, self.import_hash) app.logger.debug(self.tmessage + "END - TIME %i" % (int(time.time()) - self.tstart)) - return True - - @staticmethod - def generate_metadata(pe): - pe_metadata = { - SampleMetadataType.PE_DOS_HEADER_e_magic: pe.DOS_HEADER.e_magic, - SampleMetadataType.PE_DOS_HEADER_e_cblp: pe.DOS_HEADER.e_cblp, - SampleMetadataType.PE_DOS_HEADER_e_cp: pe.DOS_HEADER.e_cp, - SampleMetadataType.PE_DOS_HEADER_e_crlc: pe.DOS_HEADER.e_crlc, - SampleMetadataType.PE_DOS_HEADER_e_cparhdr: pe.DOS_HEADER.e_cparhdr, - SampleMetadataType.PE_DOS_HEADER_e_minalloc: pe.DOS_HEADER.e_minalloc, - SampleMetadataType.PE_DOS_HEADER_e_maxalloc: pe.DOS_HEADER.e_maxalloc, - SampleMetadataType.PE_DOS_HEADER_e_ss: pe.DOS_HEADER.e_ss, - SampleMetadataType.PE_DOS_HEADER_e_sp: pe.DOS_HEADER.e_sp, - SampleMetadataType.PE_DOS_HEADER_e_csum: pe.DOS_HEADER.e_csum, - SampleMetadataType.PE_DOS_HEADER_e_ip: pe.DOS_HEADER.e_ip, - SampleMetadataType.PE_DOS_HEADER_e_cs: pe.DOS_HEADER.e_cs, - SampleMetadataType.PE_DOS_HEADER_e_lfarlc: pe.DOS_HEADER.e_lfarlc, - SampleMetadataType.PE_DOS_HEADER_e_ovno: pe.DOS_HEADER.e_ovno, - SampleMetadataType.PE_DOS_HEADER_e_res: pe.DOS_HEADER.e_res, - SampleMetadataType.PE_DOS_HEADER_e_oemid: pe.DOS_HEADER.e_oemid, - SampleMetadataType.PE_DOS_HEADER_e_oeminfo: pe.DOS_HEADER.e_oeminfo, - SampleMetadataType.PE_DOS_HEADER_e_res2: pe.DOS_HEADER.e_res2, - SampleMetadataType.PE_DOS_HEADER_e_lfanew: pe.DOS_HEADER.e_lfanew, - SampleMetadataType.PE_FILE_HEADER_Machine: pe.FILE_HEADER.Machine, - SampleMetadataType.PE_FILE_HEADER_NumberOfSections: pe.FILE_HEADER.NumberOfSections, - SampleMetadataType.PE_FILE_HEADER_TimeDateStamp: pe.FILE_HEADER.TimeDateStamp, - SampleMetadataType.PE_FILE_HEADER_PointerToSymbolTable: pe.FILE_HEADER.PointerToSymbolTable, - SampleMetadataType.PE_FILE_HEADER_NumberOfSymbols: pe.FILE_HEADER.NumberOfSymbols, - SampleMetadataType.PE_FILE_HEADER_SizeOfOptionalHeader: pe.FILE_HEADER.SizeOfOptionalHeader, - SampleMetadataType.PE_FILE_HEADER_Characteristics: pe.FILE_HEADER.Characteristics, - SampleMetadataType.PE_OPTIONAL_HEADER_Magic: pe.OPTIONAL_HEADER.Magic, - SampleMetadataType.PE_OPTIONAL_HEADER_MajorLinkerVersion: pe.OPTIONAL_HEADER.MajorLinkerVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_MinorLinkerVersion: pe.OPTIONAL_HEADER.MinorLinkerVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfCode: pe.OPTIONAL_HEADER.SizeOfCode, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfInitializedData: pe.OPTIONAL_HEADER.SizeOfInitializedData, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfUninitializedData: pe.OPTIONAL_HEADER.SizeOfUninitializedData, - SampleMetadataType.PE_OPTIONAL_HEADER_AddressOfEntryPoint: pe.OPTIONAL_HEADER.AddressOfEntryPoint, - SampleMetadataType.PE_OPTIONAL_HEADER_BaseOfCode: pe.OPTIONAL_HEADER.BaseOfCode, - SampleMetadataType.PE_OPTIONAL_HEADER_ImageBase: pe.OPTIONAL_HEADER.ImageBase, - SampleMetadataType.PE_OPTIONAL_HEADER_SectionAlignment: pe.OPTIONAL_HEADER.SectionAlignment, - SampleMetadataType.PE_OPTIONAL_HEADER_FileAlignment: pe.OPTIONAL_HEADER.FileAlignment, - SampleMetadataType.PE_OPTIONAL_HEADER_MajorOperatingSystemVersion: pe.OPTIONAL_HEADER.MajorOperatingSystemVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_MinorOperatingSystemVersion: pe.OPTIONAL_HEADER.MinorOperatingSystemVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_MajorImageVersion: pe.OPTIONAL_HEADER.MajorImageVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_MinorImageVersion: pe.OPTIONAL_HEADER.MinorImageVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_MajorSubsystemVersion: pe.OPTIONAL_HEADER.MajorSubsystemVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_MinorSubsystemVersion: pe.OPTIONAL_HEADER.MinorSubsystemVersion, - SampleMetadataType.PE_OPTIONAL_HEADER_Reserved1: pe.OPTIONAL_HEADER.Reserved1, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfImage: pe.OPTIONAL_HEADER.SizeOfImage, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfHeaders: pe.OPTIONAL_HEADER.SizeOfHeaders, - SampleMetadataType.PE_OPTIONAL_HEADER_CheckSum: pe.OPTIONAL_HEADER.CheckSum, - SampleMetadataType.PE_OPTIONAL_HEADER_Subsystem: pe.OPTIONAL_HEADER.Subsystem, - SampleMetadataType.PE_OPTIONAL_HEADER_DllCharacteristics: pe.OPTIONAL_HEADER.DllCharacteristics, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfStackReserve: pe.OPTIONAL_HEADER.SizeOfStackReserve, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfStackCommit: pe.OPTIONAL_HEADER.SizeOfStackCommit, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfHeapReserve: pe.OPTIONAL_HEADER.SizeOfHeapReserve, - SampleMetadataType.PE_OPTIONAL_HEADER_SizeOfHeapCommit: pe.OPTIONAL_HEADER.SizeOfHeapCommit, - SampleMetadataType.PE_OPTIONAL_HEADER_LoaderFlags: pe.OPTIONAL_HEADER.LoaderFlags, - SampleMetadataType.PE_OPTIONAL_HEADER_NumberOfRvaAndSizes: pe.OPTIONAL_HEADER.NumberOfRvaAndSizes - } - return pe_metadata + return True \ No newline at end of file diff --git a/polichombr/models/callCFG.py b/polichombr/models/callCFG.py new file mode 100644 index 0000000..c19f953 --- /dev/null +++ b/polichombr/models/callCFG.py @@ -0,0 +1,68 @@ +""" + This file is part of Polichombr. + + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description: Models to implement callCFG and offset_callCFG objects + Date : 08/2018 +""" + +from datetime import datetime + +from polichombr import db, ma + + +class callCFG(db.Model): + + """ + callCFG DB Model + """ + __tablename__ = 'callCFG' + + id = db.Column(db.Integer(), primary_key=True) + sample_id = db.Column(db.Integer(), db.ForeignKey('sample.id')) + func_tuples = db.Column(db.String()) + offset_entrypoint = db.Column(db.String()) + creation_date = db.Column(db.DateTime()) + + def __init__(self): + self.creation_date = datetime.now() + +class callCFGSchema(ma.ModelSchema): + """ + Schema representation. + """ + class Meta(object): + fields = ('id', + 'sample_id', + 'func_tuples', + 'offset_entrypoint', + 'creation_date') + + +class offset_callCFG(db.Model): + """ + offset calLCFF DB Model + """ + + __tablename__ = 'offset_callCFG' + + id = db.Column(db.String(), primary_key=True) + sample_id = db.Column(db.Integer(), db.ForeignKey('sample.id')) + offset_func = db.Column(db.String()) + func_name = db.Column(db.String()) + creation_date = db.Column(db.DateTime()) + + def __init__(self): + self.creation_date = datetime.now() + +class offset_callCFGSchema(ma.ModelSchema): + """ + Schema representation. + """ + class Meta(object): + fields = ('id', + 'sample_id', + 'offset_func', + 'func_name', + 'creation_date') diff --git a/polichombr/templates/sample.html b/polichombr/templates/sample.html index aa66039..b9aadc2 100644 --- a/polichombr/templates/sample.html +++ b/polichombr/templates/sample.html @@ -340,6 +340,78 @@


+ + + {% if callcfg.offset_entrypoint %} + +
+
+

Call-CFG compare

+
+
+
+ Start offset :   + {{callcfg.offset_entrypoint}} + +
Download Call-CFG +

+ + + + + + + + + + + + {% for reslt in compare_callcfg_results %} + + + + + + + + {% if reslt[3] or reslt[4] %} + + + {% endif %} + {% endfor %} + +
FilenameDiff
{{reslt[0]}}{{reslt[1]}} + {% if reslt[3] or reslt[4] %} + Collapse + {% endif %} + + + {% if reslt[3] or reslt[4] %} + + + + {% endif %} +
+
+ {% if reslt[3] %} + -› Elements IN '{{sample.filenames[0].name}}' and NOT IN '{{reslt[0]}}' +

+ {{reslt[3]|safe}} +

+ {% endif %} + {% if reslt[4] %} + -› Elements NOT IN '{{sample.filenames[0].name}}' and IN '{{reslt[0]}}' +

+ {{reslt[4]|safe}} + {% endif %} +
+
+
+ + {% endif %} + + +

Machoc compare

diff --git a/polichombr/views/api_sample.py b/polichombr/views/api_sample.py index d1ce506..f72dce0 100644 --- a/polichombr/views/api_sample.py +++ b/polichombr/views/api_sample.py @@ -17,6 +17,7 @@ from flask import jsonify, request, send_file, abort, current_app, g from flask_security import login_required +from polichombr.analysis_tools.lib_callCFG.compare_ccfg import compare_ccfg @apiview.route('/samples//') @@ -38,6 +39,43 @@ def api_get_sample_id_from_hash(shash): return jsonify({'sample_id': sample.id}) return jsonify({'sample_id': None}) +@apiview.route('/callcfg//download/') +@login_required +def api_get_callcfg_file(sid): + """ + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description : Return the callCFG png file + Date : 08/2018 + """ + sample = api.get_elem_by_type("sample", sid) + png_filename = sample.storage_file.replace('.bin','.png') + return send_file('../'+png_filename, + as_attachment=True, + attachment_filename=os.path.basename(png_filename)) + +@apiview.route('/callcfg///download_compare_callcfg/') +@login_required +def api_get_compare_callcfg_file(sid_1, sid_2): + """ + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description : Return the compare callCFG png file + Date : 08/2018 + """ + + sample_1 = api.get_elem_by_type("sample", sid_1) + sample_2 = api.get_elem_by_type("sample", sid_2) + + png_filename = "polichombr/storage/{0}_{1}.png".format(sample_1.sha256, sample_2.sha256) + + if not os.path.exists(png_filename): + compare_ccfg_inst = compare_ccfg(sid_1) + compare_ccfg_inst.get_png_comparaison(sid_2) + + return send_file('../'+png_filename, + as_attachment=True, + attachment_filename=os.path.basename(png_filename)) @apiview.route('/samples//download/') @login_required diff --git a/polichombr/views/forms.py b/polichombr/views/forms.py index 9fca698..869c47e 100644 --- a/polichombr/views/forms.py +++ b/polichombr/views/forms.py @@ -11,7 +11,7 @@ from flask_wtf import FlaskForm from flask_wtf.file import FileField from wtforms import StringField, SelectField -from wtforms import SubmitField, TextAreaField, BooleanField +from wtforms import SubmitField, TextAreaField, BooleanField, TextField from wtforms import PasswordField, HiddenField from wtforms import IntegerField from wtforms.validators import DataRequired, Length, EqualTo @@ -267,7 +267,8 @@ class UploadSampleForm(FlaskForm): render_kw={'multiple': True}) level = SelectField('Sensibility', choices=TLPLevelChoices, coerce=int, validators=[DataRequired()]) - family = SelectField('Associated Family', coerce=int) + family = SelectField('Associated Family', coerce=int) + offset_callCFG = TextField('Offset call CFG') zipflag = BooleanField('Sample Zip archive') uploadsample = SubmitField('Submit') diff --git a/polichombr/views/webui_sample.py b/polichombr/views/webui_sample.py index 0997b39..34335d0 100644 --- a/polichombr/views/webui_sample.py +++ b/polichombr/views/webui_sample.py @@ -25,7 +25,7 @@ from polichombr.views.forms import CompareMachocForm from polichombr.controllers.sample import disassemble_sample_get_svg - +from polichombr.analysis_tools.lib_callCFG.compare_ccfg import compare_ccfg @webuiview.route('/samples/', methods=['GET', 'POST']) @login_required @@ -41,6 +41,8 @@ def ui_sample_upload(): if upload_form.validate_on_submit(): family_id = upload_form.family.data zipflag = upload_form.zipflag.data + offset_callcfg = upload_form.offset_callCFG.data + family = None if family_id != 0: family = api.get_elem_by_type("family", family_id) @@ -55,7 +57,8 @@ def ui_sample_upload(): g.user, upload_form.level.data, family, - zipflag) + zipflag, + offset_callcfg) if not samples: flash("Error during sample creation", "error") else: @@ -78,6 +81,51 @@ def parse_machoc_form(sample, form): sample, comparison_level) return results +def format_machoc_print(machoc1, machoc2): + """ + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description : Format machoc print + """ + if machoc1: + return " | {0} -> {1}".format(machoc1, machoc2) + elif machoc2: + return " | ________ -> {0}".format(machoc2) + else: + return "" + + +def compare_call_cfg(sample_id): + """ + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description : Generate comparaison results with call-CFG + """ + ret = [] + inst_compare_ccfg = compare_ccfg(sample_id) + dict_results = inst_compare_ccfg.process_all_comparaison() + + if dict_results == None: + return ret + for sample_id_tmp, result in dict_results.iteritems(): + pourcent, a_inter_b, a_union_b, diff_details = result + if int(pourcent) >= 80: + + ret_plus = [] + ret_minus = [] + diff_plus, diff_minus = diff_details + for element in diff_plus: + ret_plus.append(' [+] {0} ({3}) -> call {4} ({6}){7}'.format(element["parent_func"], sample_id, element["offset_parent"].replace('0x',''), element["offset_parent"], element["child_func"], element["offset_child"].replace('0x',''), element["offset_child"], format_machoc_print(element["machoc1"],element["machoc2"]))) + for element in diff_minus: + ret_minus.append(' [-] {0} ({3}) -> call {4} ({6}){7}'.format(element["parent_func"], sample_id_tmp, element["offset_parent"].replace('0x',''), element["offset_parent"], element["child_func"], element["offset_child"].replace('0x',''), element["offset_child"], format_machoc_print(element["machoc1"],element["machoc2"]))) + + + sample = api.get_elem_by_type("sample", sample_id_tmp) + + ret.append([sample.filenames[0].name, "{0}% ({1}/{2})".format(str(round(pourcent,2)), str(int(a_inter_b)), str(int(a_union_b))), sample_id_tmp, "
".join(ret_plus), "
".join(ret_minus)]) + + + return ret def gen_sample_view(sample_id, graph=None, fctaddr=None): """ @@ -93,6 +141,14 @@ def gen_sample_view(sample_id, graph=None, fctaddr=None): change_tlp_level_form = ChangeTLPForm() machoc_form = CompareMachocForm() + callcfg = api.callcfgcontrol.get_by_id(sample_id) + try: + callcfg.offset_entrypoint = hex(int(callcfg.offset_entrypoint)) + except: + pass + + compare_callcfg_results = compare_call_cfg(sample_id) + if add_family_form.validate_on_submit(): family_id = add_family_form.parentfamily.data family = api.get_elem_by_type("family", family_id) @@ -113,6 +169,7 @@ def gen_sample_view(sample_id, graph=None, fctaddr=None): return render_template("sample.html", sample=sample, + callcfg=callcfg, abstractform=set_sample_abstract_form, checklists=api.samplecontrol.get_all_checklists(), changetlpform=change_tlp_level_form, @@ -120,7 +177,8 @@ def gen_sample_view(sample_id, graph=None, fctaddr=None): hresults=machoc_comparison_results, addfamilyform=add_family_form, graph=graph, - fctaddr=fctaddr) + fctaddr=fctaddr, + compare_callcfg_results=compare_callcfg_results) @webuiview.route('/sample//', methods=['GET', 'POST']) @@ -238,6 +296,15 @@ def delete_sample(sample_id): """ sample = api.get_elem_by_type("sample", sample_id) api.samplecontrol.delete(sample) + + callcfg = api.callcfgcontrol.get_by_id(sample_id) + if callcfg != None: + api.callcfgcontrol.delete(callcfg) + + offset_callcfg = api.offset_callcfgcontrol.get_by_sample_id(sample_id) + if offset_callcfg != None: + api.offset_callcfgcontrol.delete_multiple_offset_callCFG(offset_callcfg) + return redirect(url_for('webuiview.index')) @@ -248,3 +315,29 @@ def download_sample(sample_id): Download a sample's file. """ return redirect(url_for('apiview.api_get_sample_file', sid=sample_id)) + +@webuiview.route('/callcfg//download/') +@login_required +def download_sample_ccfg(sample_id): + """ + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description : Download a sample's file. + Date : 08/2018 + """ + + return redirect(url_for('apiview.api_get_callcfg_file', sid=sample_id)) + +@webuiview.route('/callcfg///download_compare_callcfg/') +@login_required +def download_compare_sample_ccfg(sample_id_1, sample_id_2): + """ + Organization : EDF-R&D-PERICLES-IRC + Author : JCO + Description : Download a sample's file. + Date : 08/2018 + """ + + print sample_id_1, sample_id_2 + return redirect(url_for('apiview.api_get_compare_callcfg_file', sid_1=sample_id_1, sid_2=sample_id_2)) + diff --git a/requirements.txt b/requirements.txt index eafa582..2f3a49b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ python-magic requests sqlalchemy-migrate yara-python +r2pipe