def __waiting__(scanObject): """[summary] 분석 대상 파일의 상태를 변경한다. * 변경 시점 : dispatch.Dispatch() 내 _get_metadata() 완료 시점 * 변경 위치 : 원본 파일 경로 -> <temp_path>\\<waiting>\\<uid>\\<fileName> Arguments: scanObject {instance} -- [description] ScanObject 인스턴스 """ try: # 분석 대상 파일의 현재 경로를 가져온다. # src : 원본 파일 경로 src = scanObject.get_file_name() # 분석 대상 파일의 변경할 경로를 가져온다. # 위치 : <temp_path>\\<waiting>\\<uid>\\<fileName> dstDir1 = os.path.join(config.temp_path, config.dir_q_monitor.get("waiting")) if not utils.is_exists(dstDir1): utils.makedirectory(dstDir1) dstDir2 = os.path.join(dstDir1, scanObject.get_uid()) if not os.path.exists(dstDir2): utils.makedirectory(dstDir2) dst = os.path.join(dstDir2, os.path.basename(src)) # 테스트 # - 파일명 내에 한글이고 띄어쓰기가 있는 경우 dst = dst.replace(" ", "_") dst = dst.replace("\\", "\\\\") # 파일을 복사한다. if not utils.copyfile(src, dst): raise QueueMonitorError( "Failed change status to wait. ({})".format( scanObject.get_uid())) Log.debug("[ORI -> WAIT] {}".format(os.path.basename(src))) # 복사에 성공하면 분석 대상 파일의 경로를 변경한다. scanObject.update_file_name(dst) except QueueMonitorError as e: Log.error(e.msg) except: _, msg, obj = sys.exc_info() msg = "{} ({}::{})".format(msg, obj.tb_lineno, obj.tb_frame.f_globals.get("__file__")) Log.error(msg) finally: pass
def extract(fileName): try: # OLE 파일 인스턴스를 생성한다. ole = get_ole_object(fileName) if not ole: raise OLEKernelError("Failed Get OLE Object.") units = [] for ori_stream in ole.listdir(): # ori_stream[0] : Storage # ori_stream[1:]: Stream new_stream = convert_entryname(ori_stream) # 저장할 파일 경로를 생성한다. # <temp_path>//<embedding>//<fileName> embedded_path = os.path.join(config.temp_path, config.dir_q_monitor.get("embedding")) basename = "{}_{}.{}".format(os.path.basename(fileName), config.extend_seperate.join(new_stream), config.extend) embedded_name = os.path.join(embedded_path, basename) # 파일을 저장한다. stream = ole.openstream(ori_stream) bytes_data = stream.read() # 파일 저장이 실패한 경우 if not utils.writefile_ex(embedded_name, bytes_data): Log.error("Failed write file for embedding. ({})".format(basename)) continue Log.debug(embedded_name) # 파일이 저장된 경우 unit = { "fileName" : embedded_name, "internal_path" : new_stream } units.append(unit) return units except OLEKernelError as e: Log.error(e.msg) return [] except: _, msg, obj = sys.exc_info() msg = "{} ({}::{})".format(msg, obj.tb_lineno, obj.tb_frame.f_globals.get("__file__")) Log.error(msg) return [] finally: pass
def __analyzing__(scanObject): """[summary] 분석 대상 파일의 상태를 변경한다. * 변경 시점 : _run_module() 실행시 Skeleton.EngineProcess.__run__() 시점 * 변경 위치 : <waiting> -> <temp_path>\\<analyzing>\\<uid>\\<fileName> Arguments: scanObject {instance} -- [description] ScanObject 인스턴스 KeyArgument: fileName {str} -- [description] 분석 대상 파일 (optional), 주로 분석 엔진에서 선분석시 요청됨. """ try: # 분석 대상 파일의 현재 경로를 가져온다. ori_fileName = scanObject.get_file_name() srcDir, fileName = os.path.split(ori_fileName) # 분석 대상 파일의 변경할 경로를 가져온다. dstDir = os.path.join(config.temp_path, config.dir_q_monitor.get("analyzing")) if not utils.is_exists(dstDir): utils.makedirectory(dstDir) # 원본 파일을 이동 시킨다. # srcDir : <temp_path>\\<waiting>\\<uid> 또는 <temp_path>\\<embedding> # dstDir : <temp_path>\\<analyzing> if not utils.movefile(srcDir, dstDir): raise QueueMonitorError( "Failed change status to analyzing. ({})".format( scanObject.get_uid())) Log.debug("[WAIT -> ANLZ] {}".format(fileName)) # 복사에 성공하면 분석 대상 파일의 경로를 변경한다. dst_fileName1 = os.path.join(dstDir, scanObject.get_uid()) dst_fileName = os.path.join(dst_fileName1, fileName) scanObject.update_file_name(dst_fileName) except QueueMonitorError as e: Log.error(e.msg) except: _, msg, obj = sys.exc_info() msg = "{} ({}::{})".format(msg, obj.tb_lineno, obj.tb_frame.f_globals.get("__file__")) Log.error(msg) finally: pass
def __complete__(scanObject): """[summary] 분석 대상 파일의 상태를 변경한다. * 변경 시점 : dispatch.Dispatch() 내 분석 완료 시점 * 변경 위치 : <analyzing> -> <temp_path>\\<complete>\\<uid>\\<fileName> Arguments: scanObject {instance} -- [description] ScanObject 인스턴스 """ try: # 분석 대상 파일의 현재 경로를 가져온다. ori_fileName = scanObject.get_file_name() srcDir, fileName = os.path.split(ori_fileName) # 분석 대상 파일의 변경할 경로를 가져온다. dstDir = os.path.join(config.temp_path, config.dir_q_monitor.get("complete")) if not utils.is_exists(dstDir): utils.makedirectory(dstDir) # 원본 파일을 이동 시킨다. # srcDir : <temp_path>\\<waiting>\\<uid> # dstDir : <temp_path>\\<analyzing> if not utils.movefile(srcDir, dstDir): raise QueueMonitorError( "Failed change status to complete. ({})".format( scanObject.get_uid())) Log.debug("[ANLZ -> CMPT] {}".format(fileName)) # 복사에 성공하면 분석 대상 파일의 경로를 변경한다. dst_fileName1 = os.path.join(dstDir, scanObject.get_uid()) dst_fileName = os.path.join(dst_fileName1, fileName) scanObject.update_file_name(dst_fileName) except QueueMonitorError as e: Log.error(e.msg) except: _, msg, obj = sys.exc_info() msg = "{} ({}::{})".format(msg, obj.tb_lineno, obj.tb_frame.f_globals.get("__file__")) Log.error(msg) finally: pass
def get_file_list_download(json_list): try: Log.info("try Download from malwares.com : {}".format(len(json_list))) mws_path = os.path.join(config.temp_path, config.mws_save_folder) if not utils.makedirectory(mws_path): raise MWSError("Failed MakeDirectory() for malwares.com") complete_list = [] # failed_list = [] for i, dict_data in enumerate(json_list): file_hash = dict_data["sha256"] zip_content = get_file_download(file_hash) if not zip_content: # failed_list.append(file_hash) Log.error("MWS Download Failed : [{}/{}] {}".format(i+1, len(json_list), file_hash)) continue fullName = os.path.join(mws_path, file_hash) if utils.unzip(mws_path, zip_content): complete_list.append(fullName) Log.debug("MWS Download Successed : [{}/{}] {}".format(i+1, len(json_list), file_hash)) else: Log.error("Failed to write or decompress(unzip). ({})".format(file_hash)) return complete_list except MWSError as e: Log.error(e.msg) return [] except: _, msg, obj = sys.exc_info() msg = "{} ({}::{})".format(msg, obj.tb_lineno, obj.tb_frame.f_globals.get("__file__")) Log.error(msg) return [] finally: pass