Esempio n. 1
0
    def set_plugins(self, plugins_path):
        # 플러그인 경로를 저장한다.
        self.plugins_path = plugins_path

        # 공개키를 로딩한다.
        pu = k2rsa.read_key(plugins_path + os.sep + 'key.pkr')
        if not pu:
            return False

        # 우선순위를 알아낸다.
        ret = self.__get_kmd_list(plugins_path + os.sep + 'kicom.kmd', pu)
        if not ret:  # 로딩할 KMD 파일이 없다.
            return False

        if self.debug:
            print '[*] kicom.kmd :'
            print '   ', self.kmdfiles

        # 우선순위대로 KMD 파일을 로딩한다.
        for kmd_name in self.kmdfiles:
            kmd_path = plugins_path + os.sep + kmd_name
            try:
                k = k2kmdfile.KMD(kmd_path, pu)  # 모든 KMD 파일을 복호화한다.
                module = k2kmdfile.load(kmd_name.split('.')[0], k.body)
                if module:  # 메모리 로딩 성공
                    self.kmd_modules.append(module)
                    # 메모리 로딩에 성공한 KMD에서 플러그 엔진의 시간 값 읽기
                    # 최신 업데이트 날짜가 된다.
                    self.__get_last_kmd_build_time(k)
            except IOError:
                pass
            except k2kmdfile.KMDFormatError:  # 다른키로 암호호화 한 엔진은 무시
                pass

        # 악성코드 패턴에서 최신 시간 값을 얻는다.
        fl = glob.glob(plugins_path + os.sep + '*.n??')
        for fname in fl:
            try:
                buf = open(fname, 'rb').read(12)
                if buf[0:4] == 'KAVS':
                    sdate = k2timelib.convert_date(
                        struct.unpack('<H', buf[8:10])[0])
                    stime = k2timelib.convert_time(
                        struct.unpack('<H', buf[10:12])[0])

                    t_datetime = datetime.datetime(sdate[0], sdate[1],
                                                   sdate[2], stime[0],
                                                   stime[1], stime[2])

                    if self.max_datetime < t_datetime:
                        self.max_datetime = t_datetime
            except IOError:
                pass

        if self.debug:
            print '[*] kmd_modules :'
            print '   ', self.kmd_modules
            print '[*] Last updated %s UTC' % self.max_datetime.ctime()

        return True
Esempio n. 2
0
    def __decrypt(self, fname, debug=False):
        with open(fname, 'rb') as fp:
            if fp.read(4) == self.KMD_SIGNATURE:
                self.__kmd_data = self.KMD_SIGNATURE + fp.read()
            else:
                raise KMDFormatError('KMD Header magic not found.')

        tmp = self.__kmd_data[self.KMD_DATE_OFFSET:self.KMD_DATE_OFFSET +
                              self.KMD_DATE_LENGTH]
        self.date = k2timelib.convert_date(struct.unpack('<H', tmp)[0])

        tmp = self.__kmd_data[self.KMD_TIME_OFFSET:self.KMD_TIME_OFFSET +
                              self.KMD_TIME_LENGTH]
        self.time = k2timelib.convert_time(struct.unpack('<H', tmp)[0])

        e_md5hash = self.__get_md5()

        md5hash = ntimes_md5(self.__kmd_data[:self.KMD_MD5_OFFSET], 3)

        if e_md5hash == md5hash.decode('utf-8'):
            raise KMDFormatError('Invalid KMD MD5 hash.')

        self.__rc4_key = self.__get_rc4_key()

        e_kmd_data = self.__get_body()

        if debug:
            print("encrypted KMD Data Length:", len(e_kmd_data))

        self.body = zlib.decompress(e_kmd_data)  # python byte code

        if debug:
            print("decrypted KMD Data Length:", len(self.body))
Esempio n. 3
0
    def set_plugins(self, plugins_path):
        # 플러그인 경로를 저장한다.
        self.plugins_path = plugins_path

        # 공개키를 로딩한다.
        pu = k2rsa.read_key(plugins_path + os.sep + 'key.pkr')
        if not pu:
            return False

        # 우선순위를 알아낸다.
        ret = self.__get_kmd_list(plugins_path + os.sep + 'kicom.kmd', pu)
        if not ret:  # 로딩할 KMD 파일이 없다.
            return False

        if self.debug:
            print '[*] kicom.kmd :'
            print '   ', self.kmdfiles

        # 우선순위대로 KMD 파일을 로딩한다.
        for kmd_name in self.kmdfiles:
            kmd_path = plugins_path + os.sep + kmd_name
            try:
                k = k2kmdfile.KMD(kmd_path, pu)  # 모든 KMD 파일을 복호화한다.
                module = k2kmdfile.load(kmd_name.split('.')[0], k.body)
                if module:  # 메모리 로딩 성공
                    self.kmd_modules.append(module)
                    # 메모리 로딩에 성공한 KMD에서 플러그 엔진의 시간 값 읽기
                    # 최신 업데이트 날짜가 된다.
                    self.__get_last_kmd_build_time(k)
            except IOError:
                pass
            except k2kmdfile.KMDFormatError:  # 다른키로 암호호화 한 엔진은 무시
                pass

        # 악성코드 패턴에서 최신 시간 값을 얻는다.
        fl = glob.glob(plugins_path + os.sep + '*.n??')
        for fname in fl:
            try:
                buf = open(fname, 'rb').read(12)
                if buf[0:4] == 'KAVS':
                    sdate = k2timelib.convert_date(struct.unpack('<H', buf[8:10])[0])
                    stime = k2timelib.convert_time(struct.unpack('<H', buf[10:12])[0])

                    t_datetime = datetime.datetime(sdate[0], sdate[1], sdate[2], stime[0], stime[1], stime[2])

                    if self.max_datetime < t_datetime:
                        self.max_datetime = t_datetime
            except IOError:
                pass

        if self.debug:
            print '[*] kmd_modules :'
            print '   ', self.kmd_modules
            print '[*] Last updated %s UTC' % self.max_datetime.ctime()

        return True
Esempio n. 4
0
 def __decrypt(self, fname, debug=False):
     #KMD 파일 열고 시그니처 체크
     with open(fname, 'rb') as fp:
         if fp.read(4) == self.KMD_SIGNATURE:    # 책은 KAVM 이므로 4 값 우리는 KSAIV 이므로 5값
             self.__kmd_data = self.KMD_SIGNATURE + fp.read()
             
         else:
             raise KMDFormatError("KMD Header magic not found.")
     
     #KMD 파일 날짜 읽기
     tmp = self.__kmd_data[self.KMD_DATE_OFFSET:
                           self.KMD_DATE_OFFSET + self.KMD_DATE_LENGTH]
     self.date = k2timelib.convert_date(struct.unpack('<H', tmp)[0])
     # print(self.date)
     
     #KMD 파일 시간 읽기
     tmp = self.__kmd_data[self.KMD_TIME_OFFSET:
                           self.KMD_TIME_OFFSET + self.KMD_TIME_LENGTH]
     self.time = k2timelib.convert_time(struct.unpack('<H', tmp)[0])
     #print(self.time)
     
     #KMD 파일에서 MD5읽기
     e_md5hash = self.__get_md5()
     
     #무결성 체크
     md5hash = ntimes_md5(self.__kmd_data[:self.KMD_MD5_OFFSET], 3)
     if e_md5hash != md5hash.decode('hex'):
         raise KMDFormatError('Invalid KMD MD5 hash.')
         
     #KMD 파일에서 RC4 키 읽기
     self.__rc4_key = self.__get_rc4_key()
     
     #KMD 파일에서 본문 읽기
     e_kmd_data = self.__get_body()
     if debug:
         print(len(e_kmd_data))
     
     #압축 해제
     self.body = zlib.decompress(e_kmd_data)
     if debug:
         print(len(self.body))
Esempio n. 5
0
    def __decrypt(self, fname, debug=False):
        # KMD 파일을 열고 시그너처를 체크한다.
        with open(fname, 'rb') as fp:
            if fp.read(4) == self.KMD_SIGNATURE:  # KMD 파일이 맞는지 체크 함
                self.__kmd_data = self.KMD_SIGNATURE + fp.read()  # 파일을 읽어 들임
            else:
                raise KMDFormatError('KMD Header magic not found.')

        # KMD 파일 날짜 읽기
        tmp = self.__kmd_data[self.KMD_DATE_OFFSET:
                              self.KMD_DATE_OFFSET + self.KMD_DATE_LENGTH]
        self.date = k2timelib.convert_date(struct.unpack('<H', tmp)[0])
        # print self.date

        # KMD 파일 시간 읽기
        tmp = self.__kmd_data[self.KMD_TIME_OFFSET:
                              self.KMD_TIME_OFFSET + self.KMD_TIME_LENGTH]
        self.time = k2timelib.convert_time(struct.unpack('<H', tmp)[0])
        # print self.time

        # KMD 파일에서 MD5 읽기
        e_md5hash = self.__get_md5()

        # 무결성 체크
        md5hash = ntimes_md5(self.__kmd_data[:self.KMD_MD5_OFFSET], 3)
        if e_md5hash != md5hash.decode('hex'):
            raise KMDFormatError('Invalid KMD MD5 hash.')

        # KMD 파일에서 RC4 키 읽기
        self.__rc4_key = self.__get_rc4_key()

        # KMD 파일에서 본문 읽기
        e_kmd_data = self.__get_body()
        if debug:
            print len(e_kmd_data)

        # 압축 해제하기
        self.body = zlib.decompress(e_kmd_data)
        if debug:
            print len(self.body)
Esempio n. 6
0
    def set_plugins(self, plugins_path, callback_fn=None):
        self.plugins_path = plugins_path

        if k2const.K2DEBUG:
            pu = None
            ret = self.__get_kmd_list(os.path.join(plugins_path, 'kicom.lst'),
                                      pu)
        else:
            pu = k2rsa.read_key(os.path.join(plugins_path, 'key.pkr'))
            if not pu:
                return False

            ret = self.__get_kmd_list(os.path.join(plugins_path, 'kicom.kmd'),
                                      pu)

        if not ret:
            return False

        if self.verbose:
            print '[*] kicom.%s :' % ('lst' if k2const.K2DEBUG else 'kmd')
            print '   ', self.kmdfiles

        for kmd_name in self.kmdfiles:
            kmd_path = os.path.join(plugins_path, kmd_name)
            try:
                name = kmd_name.split('.')[0]
                if k2const.K2DEBUG:
                    k = None
                    module = imp.load_source(
                        name,
                        os.path.splitext(kmd_path)[0] + '.py')
                    try:
                        os.remove(os.path.splitext(kmd_path)[0] + '.pyc')
                    except OSError:
                        pass
                else:
                    k = k2kmdfile.KMD(kmd_path, pu)
                    data = k.body
                    module = k2kmdfile.load(name, data)

                if module:
                    self.kmd_modules.append(module)
                    self.__get_last_kmd_build_time(k)
                else:
                    if isinstance(callback_fn, types.FunctionType):
                        callback_fn(name)
            except IOError:
                pass
            except k2kmdfile.KMDFormatError:
                pass

        fl = glob.glob1(plugins_path, '*.n??')
        for fname in fl:
            try:
                fname = os.path.join(plugins_path, fname)
                buf = open(fname, 'rb').read(12)
                if buf[0:4] == 'KAVS':
                    sdate = k2timelib.convert_date(
                        struct.unpack('<H', buf[8:10])[0])
                    stime = k2timelib.convert_time(
                        struct.unpack('<H', buf[10:12])[0])

                    t_datetime = datetime.datetime(sdate[0], sdate[1],
                                                   sdate[2], stime[0],
                                                   stime[1], stime[2])

                    if self.max_datetime < t_datetime:
                        self.max_datetime = t_datetime
            except IOError:
                pass

        if self.verbose:
            print '[*] kmd_modules :'
            print '   ', self.kmd_modules
            print '[*] Last updated %s UTC' % self.max_datetime.ctime()

        return True
Esempio n. 7
0
    def set_plugins(self, plugins_path, callback_fn=None):
        # 플러그인 경로를 저장한다.
        self.plugins_path = plugins_path

        # 우선순위를 알아낸다.
        if k2const.K2DEBUG:
            pu = None
            ret = self.__get_kmd_list(os.path.join(plugins_path, 'kicom.lst'), pu)
        else:
            # 공개키를 로딩한다.
            pu = k2rsa.read_key(os.path.join(plugins_path, 'key.pkr'))
            if not pu:
                return False

            ret = self.__get_kmd_list(os.path.join(plugins_path, 'kicom.kmd'), pu)

        if not ret:  # 로딩할 KMD 파일이 없다.
            return False

        if self.verbose:
            print '[*] kicom.%s :' % ('lst' if k2const.K2DEBUG else 'kmd')
            print '   ', self.kmdfiles

        # 우선순위대로 KMD 파일을 로딩한다.
        for kmd_name in self.kmdfiles:
            kmd_path = os.path.join(plugins_path, kmd_name)
            try:
                name = kmd_name.split('.')[0]
                if k2const.K2DEBUG:
                    k = None
                    module = imp.load_source(name, os.path.splitext(kmd_path)[0] + '.py')
                    try:
                        os.remove(os.path.splitext(kmd_path)[0] + '.pyc')
                    except OSError:
                        pass
                else:
                    k = k2kmdfile.KMD(kmd_path, pu)  # 모든 KMD 파일을 복호화한다.
                    data = k.body
                    module = k2kmdfile.load(name, data)

                if module:  # 메모리 로딩 성공
                    self.kmd_modules.append(module)
                    # 메모리 로딩에 성공한 KMD에서 플러그 엔진의 시간 값 읽기
                    # 최신 업데이트 날짜가 된다.
                    self.__get_last_kmd_build_time(k)
                else:  # 메모리 로딩 실패
                    if isinstance(callback_fn, types.FunctionType):
                        callback_fn(name)
            except IOError:
                pass
            except k2kmdfile.KMDFormatError:  # 다른키로 암호호화 한 엔진은 무시
                pass

        # 악성코드 패턴에서 최신 시간 값을 얻는다.
        fl = glob.glob(os.path.join(plugins_path, '*.n??'))
        for fname in fl:
            try:
                buf = open(fname, 'rb').read(12)
                if buf[0:4] == 'KAVS':
                    sdate = k2timelib.convert_date(struct.unpack('<H', buf[8:10])[0])
                    stime = k2timelib.convert_time(struct.unpack('<H', buf[10:12])[0])

                    t_datetime = datetime.datetime(sdate[0], sdate[1], sdate[2], stime[0], stime[1], stime[2])

                    if self.max_datetime < t_datetime:
                        self.max_datetime = t_datetime
            except IOError:
                pass

        if self.verbose:
            print '[*] kmd_modules :'
            print '   ', self.kmd_modules
            print '[*] Last updated %s UTC' % self.max_datetime.ctime()

        return True
Esempio n. 8
0
    def set_plugins(self, plugins_path, callback_fn=None):
        # 플러그인 경로를 저장한다.
        self.plugins_path = plugins_path

        # 우선순위를 알아낸다.
        if k2const.K2DEBUG:
            pu = None
            ret = self.__get_kmd_list(os.path.join(plugins_path, 'kicom.lst'), pu)
        else:
            # 공개키를 로딩한다.
            pu = k2rsa.read_key(os.path.join(plugins_path, 'key.pkr'))
            if not pu:
                return False

            ret = self.__get_kmd_list(os.path.join(plugins_path, 'kicom.kmd'), pu)

        if not ret:  # 로딩할 KMD 파일이 없다.
            return False

        if self.verbose:
            print '[*] kicom.%s :' % ('lst' if k2const.K2DEBUG else 'kmd')
            print '   ', self.kmdfiles

        # 우선순위대로 KMD 파일을 로딩한다.
        for kmd_name in self.kmdfiles:
            kmd_path = os.path.join(plugins_path, kmd_name)
            try:
                name = kmd_name.split('.')[0]
                if k2const.K2DEBUG:
                    k = None
                    module = imp.load_source(name, os.path.splitext(kmd_path)[0] + '.py')
                    try:
                        os.remove(os.path.splitext(kmd_path)[0] + '.pyc')
                    except OSError:
                        pass
                else:
                    k = k2kmdfile.KMD(kmd_path, pu)  # 모든 KMD 파일을 복호화한다.
                    data = k.body
                    module = k2kmdfile.load(name, data)

                if module:  # 메모리 로딩 성공
                    self.kmd_modules.append(module)
                    # 메모리 로딩에 성공한 KMD에서 플러그 엔진의 시간 값 읽기
                    # 최신 업데이트 날짜가 된다.
                    self.__get_last_kmd_build_time(k)
                else:  # 메모리 로딩 실패
                    if isinstance(callback_fn, types.FunctionType):
                        callback_fn(name)
            except IOError:
                pass
            except k2kmdfile.KMDFormatError:  # 다른키로 암호호화 한 엔진은 무시
                pass

        # 악성코드 패턴에서 최신 시간 값을 얻는다.
        fl = glob.glob(os.path.join(plugins_path, '*.n??'))
        for fname in fl:
            try:
                buf = open(fname, 'rb').read(12)
                if buf[0:4] == 'KAVS':
                    sdate = k2timelib.convert_date(struct.unpack('<H', buf[8:10])[0])
                    stime = k2timelib.convert_time(struct.unpack('<H', buf[10:12])[0])

                    t_datetime = datetime.datetime(sdate[0], sdate[1], sdate[2], stime[0], stime[1], stime[2])

                    if self.max_datetime < t_datetime:
                        self.max_datetime = t_datetime
            except IOError:
                pass

        if self.verbose:
            print '[*] kmd_modules :'
            print '   ', self.kmd_modules
            print '[*] Last updated %s UTC' % self.max_datetime.ctime()

        return True