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))
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
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
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.') #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_date(struct.unpack('<H', tmp)[0]) #print self.time 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.') # RC4 키 읽기 self.__rc4_key = self.__get_rc4_key() 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)
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))
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)
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
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
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