def __get_kmd_list(self, kicom_kmd_file, pu): kmdfiles = [] # 우선순위 목록 k = k2kmdfile.KMD(kicom_kmd_file, pu) # kicom.kmd 파일을 복호화한다. if k.body: # kicom.kmd 읽혔는가? msg = StringIO.StringIO(k.body) while True: # 버퍼 한 줄을 읽어 엔터키 제거 line = msg.readline().strip() if not line: # 읽혀진 내용이 없으면 종료 break elif line.find('.kmd') != -1: # KMD 확장자가 존재한다면 kmdfiles.append(line) # KMD 우선순위 목록에 추가 else: # 확장자가 KMD가 아니면 다음 파일로... continue if len(kmdfiles): # 우선순위 목록에 하나라도 있다면 성공 self.kmdfiles = kmdfiles return True else: # 우선순위 목록에 아무것도 없으면 실패 return False
def __get_kmd_list(self, kicom_kmd_file, pu): kmdfiles = [] # 우선순위 목록 k = k2kmdfile.KMD(kicom_kmd_file, pu) # kicom.kmd 파일 복호화 if k.body: # kicom.kmd파일이 읽혔는가? msg = StringIO.StringIO(k.body) while True: # 한줄을 읽어 엔터키 제거 line = msg.readline().strip() if not line: break elif line.find('.kmd') != -1: # KMD 확장자가 존재한다면 kmdfiles.append(line) # KMD 우선순위 목록에 추가 else: continue if len(kmdfiles): # 우선순위 목록의 내용이 1줄이라도 있다면 self.kmdfiles = kmdfiles return True else: # 우선순위 목록의 내용이 없다면 return False
import k2rsa import k2kmdfile k2rsa.create_key('key.pkr', 'key.skr') ret = k2kmdfile.make('kicom.lst') if ret: pu = k2rsa.read_key('key.pkr') k = k2kmdfile.KMD('kicom.kmd', pu) print k.body
import k2rsa import k2kmdfile k2rsa.create_key('key.pkr', 'key.skr') ret = k2kmdfile.make('textfile.txt') if ret: pu = k2rsa.read_key('key.pkr') k = k2kmdfile.KMD('textfile.kmd', pu) print k.body
# -*- coding: utf-8 -*- """ Created on Mon May 25 07:48:18 2020 @author: ghdhf KMD 파일 생성 및 복호화 모듈 테스트 """ import k2rsa import k2kmdfile k2rsa.create_key('key.pkr', 'key.skr', True) #이부분이 에러.. ret = k2kmdfile.make('readme.txt') if ret: pu = k2rsa.read_key('key.pkr') k = k2kmdfile.KMD('readme.kmd', pu) print(k.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
# -*- coding:utf-8 -*- import k2rsa import k2kmdfile pu = k2rsa.read_key('key.pkr') k = k2kmdfile.KMD('dummy.kmd', pu) module = k2kmdfile.load('dummy', k.body) print dir(module) ''' case 1. kmdfile.load의 리턴값을 이용해 모듈 사용. ''' kav = module.KavMain() kav.init('.') print kav.getinfo() kav.uninit() ''' case 2. 모듈 동적로딩을 하면 import를 한 후의 사용도 가능하다. ''' import dummy kav2 = dummy.KavMain() kav2.init('.') print kav2.listvirus() kav2.uninit()