Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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