Compare commits

..

No commits in common. "master" and "fpsave" have entirely different histories.

40 changed files with 280 additions and 3956 deletions

5
.gitignore vendored
View File

@ -1,7 +1,3 @@
# project excludes
tests/
var/
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
__pycache__/ __pycache__/
*.py[cod] *.py[cod]
@ -20,6 +16,7 @@ lib/
lib64/ lib64/
parts/ parts/
sdist/ sdist/
var/
*.egg-info/ *.egg-info/
.installed.cfg .installed.cfg
*.egg *.egg

View File

@ -1,110 +0,0 @@
==============
DB Fingerprint
==============
-------------
INTRO
-------------
::
[D]ata[B]ase [F]inger[P]rint
dbfp is a tool that will scan a sqlite database and generate a fingerprint.
The fingerprint will uniquely identify the database.
The fingerprint consists of the database schema, the sql table create statements,
md5 calculations, and file meta-data.
The fingerprint is stored to disk in JSON format.
The fingerprint can be used to identify unknown databases from random paths or recovered from deleted space.
The fingerprint can be used for historical comparisons to see what has changed in a new version of an application.
-------------
FEATURES
-------------
* Generate a fingerprint in JSON format.
* Compare a sqlite database with a fingerprint.
* Rip all apps from an Android phone and create fingerprints for all SQLite databases
* Lightning fast fingerprint comparison
- creates an index of fingerprints
- query the index for quick fingerprint comparison
USAGE
-----
::
Create fingerprings from given path
find <db_files_path> -exec python dbfp.py -db {} \;
Attempt to fingerprint all files with *.db
find . -type f -name "*.db" -exec python dbfp.py -db {} \;
Attempt to fingerprint all files, recursively, from this path (no error if file not database)
find . -type f -exec python dbfp.py -db {} \;
***** ***** ***** *****
DB Fingerprint
***** ***** ***** *****
Create fingerprint:
dbfp.py -db <database_file>
Create fingerprint index:
dbfp.py -fd <fingerprint_dir> -idx
Add fingerprint to index:
dbfp.py -fp <fingerprint_file> -idx (-db <database_file> | -fp <fingerprint_file>)
Compare fingerprint to a database file:
dbfp.py -fp <fingerprint_file> -db <database_file>
Lookup fingerprint from index:
dbfp.py -fd <fingerprint_dir> -fp <fingerprint_file>)
Lookup database from index:
dbfp.py -fd <fingerprint_dir> -db <database_file>
Lookup MD5 hash from index:
dbfp.py -fd <fingerprint_dir> -md5 <md5_hash_string>
Android App pull and fingerprint:
dbfp.py -android_pull
***** ***** ***** *****
usage: dbfp.py [-h] [-db DATABASE] [-fd FPDIR] [-fp FINGERPRINT]
[-ad ANDROID_DIR] [-dd DATA_DIR] [-an APP_NAME]
[-av APP_VERSION] [-n NOTES] [-idx] [-md5 MD5] [-android_pull]
[-v] [-vv] [-l]
Fingerprint a sqlite database based on its schema
optional arguments:
-h, --help show this help message and exit
-db DATABASE, --database DATABASE
path to file to be fingerprinted
-fd FPDIR, --fpdir FPDIR
path to directory of fingerprint files, compare each
file
-fp FINGERPRINT, --fingerprint FINGERPRINT
fingerprint file to use in comparison
-ad ANDROID_DIR, --android_dir ANDROID_DIR
path to a directory with android folder structure
sqlite files
-dd DATA_DIR, --data_dir DATA_DIR
path to a directory to search for sqlite files
-an APP_NAME, --app_name APP_NAME
-av APP_VERSION, --app_version APP_VERSION
-n NOTES, --notes NOTES
-idx add a fingerprint to the index
-md5 MD5 md5 hash to query the index`
-android_pull automated pull of applications from a physical android
phone
-v, --verbose will set logging level to INFO
-vv, --vverbose will set logging level to DEBUG
-l, --logging will supercede the -v option and send all logging to a
file, logging.DEBUG

63
dbfp.py
View File

@ -60,19 +60,18 @@ def indexFingerprints(fp_dir):
print ex print ex
# #
def compareFPIndex(fp_dir, db_in, json_in): def compareFingerprintDir(file_in, fp_dir):
try: try:
db = FingerprintDB() db = FingerprintDB()
if (db_in): db.scanDBFile(file_in)
db.scanDBFile(db_in)
else: logging.info("MD5 DB == {}".format(db.getMD5DB()))
db.importJson(json_in) logging.info("MD5 TB == {}".format(db.getMD5Tables()))
fp = FingerprintIndex() fp = FingerprintIndex()
fp.openIndex(fp_dir) fp.openIndex(fp_dir)
# search for fingerprints with exact database match # search for fingerprints with exact database match
logging.info("Searching for MD5 DB: {}".format(db.getMD5DB()))
fp_ret = fp.findFP(db.getMD5DB()) fp_ret = fp.findFP(db.getMD5DB())
if (fp_ret): if (fp_ret):
print "Database matche(s) found" print "Database matche(s) found"
@ -82,16 +81,21 @@ def compareFPIndex(fp_dir, db_in, json_in):
print fp print fp
# search for fingerprints with similar tables # search for fingerprints with similar tables
else: else:
print "[ Table percent match: ]"
logging.info("Searching for md5 tables: {}".format(db.getMD5Tables())) logging.info("Searching for md5 tables: {}".format(db.getMD5Tables()))
fp_list = fp.findFPTables(db.getMD5Tables().values()) fp_list = fp.findFPTables(db.getMD5Tables())
results = []
for fp in fp_list: for fp in fp_list:
fq_fp = fp_dir + os.path.sep + fp[0] fq_fp = fp_dir + os.path.sep + fp
logging.info("Comparing fingerprint: {}".format(fq_fp)) print "[ OPEN fingerprint ] [ {} ]".format(fq_fp)
percent = db.compareDB(fq_fp) percent = db.compareDB(fq_fp)
print "{:2.2f}%: {}".format(percent, fp[0]) results.append(percent)
print "Table matche(s) found"
print "RESULTS: {}".format(results)
results.sort()
print "RESULTS: {}".format(results)
except Exception as ex: except Exception as ex:
print "ERROR: error occured while comparing fingerprint" print "Error comparing fingerprint"
print ex print ex
# #
@ -150,7 +154,7 @@ def queryMD5(fp_dir, md5_db):
try: try:
fp = FingerprintIndex() fp = FingerprintIndex()
fp.openIndex(fp_dir) fp.openIndex(fp_dir)
results = fp.queryAppDetails(md5_db) results = fp.queryMetadata(md5_db)
for row in results: for row in results:
print "[{}]\nDB: {}\nFP: {}\nDate: {}\n".format(row[0], row[2], row[3], row[4]) print "[{}]\nDB: {}\nFP: {}\nDate: {}\n".format(row[0], row[2], row[3], row[4])
except Exception as ex: except Exception as ex:
@ -225,12 +229,12 @@ def parseArgs():
parser.add_argument('-fp', '--fingerprint', required=False, help="fingerprint file to use in comparison") parser.add_argument('-fp', '--fingerprint', required=False, help="fingerprint file to use in comparison")
parser.add_argument('-ad', '--android_dir', required=False, help="path to a directory with android folder structure sqlite files") parser.add_argument('-ad', '--android_dir', required=False, help="path to a directory with android folder structure sqlite files")
parser.add_argument('-dd', '--data_dir', required=False, help="path to a directory to search for sqlite files") parser.add_argument('-dd', '--data_dir', required=False, help="path to a directory to search for sqlite files")
# parser.add_argument('-idx', '--index_fingerprints', required=False, help="path to a directory with sqlite files, index fingerprints if no other args given") parser.add_argument('-idx', '--index_fingerprints', required=False, help="path to a directory with sqlite files, index fingerprints if no other args given")
parser.add_argument('-md5', required=False, help="md5 hash to query the index`")
parser.add_argument('-an', '--app_name', required=False) parser.add_argument('-an', '--app_name', required=False)
parser.add_argument('-av', '--app_version', required=False) parser.add_argument('-av', '--app_version', required=False)
parser.add_argument('-n', '--notes', required=False) parser.add_argument('-n', '--notes', required=False)
parser.add_argument('-idx', action='store_true', help="add a fingerprint to the index") parser.add_argument('-idxf', action='store_true', help="add a fingerprint to the index")
parser.add_argument('-md5', required=False, help="md5 hash to query the index`")
parser.add_argument('-android_pull', action='store_true', help="automated pull of applications from a physical android phone") parser.add_argument('-android_pull', action='store_true', help="automated pull of applications from a physical android phone")
parser.add_argument('-v', '--verbose', action='store_true', help="will set logging level to INFO") parser.add_argument('-v', '--verbose', action='store_true', help="will set logging level to INFO")
parser.add_argument('-vv', '--vverbose', action='store_true', help="will set logging level to DEBUG") parser.add_argument('-vv', '--vverbose', action='store_true', help="will set logging level to DEBUG")
@ -248,40 +252,23 @@ def parseArgs():
else: else:
logging.basicConfig(level=logging.CRITICAL) logging.basicConfig(level=logging.CRITICAL)
if args.fpdir and args.idx and (args.database or args.fingerprint): if args.idxf and args.fpdir and (args.database or args.fingerprint):
insertFP(args.database, args.fingerprint, args.fpdir) insertFP(args.database, args.fingerprint, args.fpdir)
elif args.fpdir and args.idx:
indexFingerprints(args.fpdir)
elif (args.database and args.fingerprint): elif (args.database and args.fingerprint):
compareFingerprint(args.database, args.fingerprint) compareFingerprint(args.database, args.fingerprint)
elif (args.fpdir and (args.database or args.fingerprint)): elif (args.database and args.fpdir):
compareFPIndex(args.fpdir, args.database, args.fingerprint) compareFingerprintDir(args.database, args.fpdir)
elif (args.fpdir and args.md5): elif (args.fpdir and args.md5):
queryMD5(args.fpdir, args.md5) queryMD5(args.fpdir, args.md5)
elif (args.android_dir): elif (args.android_dir):
androidData(args.android_dir) androidData(args.android_dir)
elif (args.index_fingerprints):
indexFingerprints(args.index_fingerprints)
elif (args.android_pull): elif (args.android_pull):
androidPull() androidPull()
elif (args.database): elif (args.database):
createFingerprint(args.database, args.app_name, args.app_version, args.notes) createFingerprint(args.database, args.app_name, args.app_version, args.notes)
else: else:
print 'Create fingerprint:'
print ' dbfp.py -db <database_file>\n'
print 'Create fingerprint index:'
print ' dbfp.py -fd <fingerprint_dir> -idx\n'
print 'Add fingerprint to index:'
print ' dbfp.py -fp <fingerprint_file> -idx (-db <database_file> | -fp <fingerprint_file>)\n'
print 'Compare fingerprint to a database file:'
print ' dbfp.py -fp <fingerprint_file> -db <database_file>\n'
print 'Lookup fingerprint from index:'
print ' dbfp.py -fd <fingerprint_dir> -fp <fingerprint_file>)\n'
print 'Lookup database from index:'
print ' dbfp.py -fd <fingerprint_dir> -db <database_file>\n'
print 'Lookup MD5 hash from index:'
print ' dbfp.py -fd <fingerprint_dir> -md5 <md5_hash_string>\n'
print 'Android App pull and fingerprint:'
print ' dbfp.py -android_pull'
print '\n***** ***** ***** *****\n'
parser.print_help() parser.print_help()

18
docs/FINGERPRINT_FORMAT Normal file
View File

@ -0,0 +1,18 @@
JSON Fingerprint Format Design
Fingerprint Naming Convention
Fully Qualified Domain App Name + "__" + database name + "__" + "dbfp.json"
JSON File Format:
1. "_file-metadata": has information regarding how this fingerprint was created
2. "db-metadata": contains the sql create statements for each table in the database
3. "db-metadata-hashes": contains the md5 hashes of each create statement (for quicker comparisons of fingerprints)
4. "table": is the database schema in a hash format to be loaded into the fingerprint program

72
docs/README Normal file
View File

@ -0,0 +1,72 @@
==================
DB Fingerprint
==================
-------------
INTRO
-------------
[D]ata[B]ase [F]inger[P]rint
dbfp is a tool that will scan a sqlite database and generate a fingerprint.
The fingerprint will uniquely identify the database.
The fingerprint consists of the database schema, the sql table create statements,
md5 calculations, and file meta-data.
The fingerprint is stored to disk in JSON format.
The fingerprint can be used to identify unknown databases from random paths or recovered from deleted space.
The fingerprint can be used for historical comparisons to see what has changed in a new version of an application.
-------------
FEATURES
-------------
1. Generate a fingerprint in JSON format.
2. Compare a sqlite database with a fingerprint.
3. Rip all apps from an Android phone and create fingerprints for all SQLite databases
4. Lightning fast fingerprint comparison
a. creates an index of fingerprints
b. query the index for quick fingerprint comparison
-------------
USAGE
-------------
***** ***** ***** *****
DB Fingerprint
***** ***** ***** *****
usage: dbfp.py [-h] [-db DATABASE] [-fd FPDIR] [-fp FINGERPRINT]
[-ad ANDROID_DIR] [-dd DATA_DIR] [-idx INDEX_FINGERPRINTS]
[-md5 MD5] [-an APP_NAME] [-av APP_VERSION] [-n NOTES] [-idxf]
[-android_pull] [-v] [-vv] [-l]
Fingerprint a sqlite database based on its schema
optional arguments:
-h, --help show this help message and exit
-db DATABASE, --database DATABASE
path to file to be fingerprinted
-fd FPDIR, --fpdir FPDIR
path to directory of fingerprint files
-fp FINGERPRINT, --fingerprint FINGERPRINT
fingerprint file to use in comparison
-ad ANDROID_DIR, --android_dir ANDROID_DIR
path to a directory with android folder structure
sqlite files
-dd DATA_DIR, --data_dir DATA_DIR
path to a directory to search for sqlite files
-idx INDEX_FINGERPRINTS, --index_fingerprints INDEX_FINGERPRINTS
path to a directory with sqlite files
-md5 MD5 md5 hash to query the index`
-an APP_NAME, --app_name APP_NAME
-av APP_VERSION, --app_version APP_VERSION
-n NOTES, --notes NOTES
-idxf add a fingerprint to the index
-android_pull automated pull of applications from a physical android
phone
-v, --verbose will set logging level to INFO
-vv, --vverbose will set logging level to DEBUG
-l, --logging will supercede the -v option and send all logging to a
file, logging.DEBUG

30
docs/README_DEV_DB Normal file
View File

@ -0,0 +1,30 @@
=====================
Fingerprint Index
=====================
-------------
INTRO
-------------
Why:
The purpose of the database fingerprint index is for speed and quick statistics. The
current number of fingerprints that I have created is ~ 180. In the future it likely
that our fingerprints will be > 1000. The index is designed for the future.
Where:
A sqlite database (_index_dbfp.db) is populated with index data. The current design
expects the index file to be located in the same directory as all the fingerprints.
How:
To create the index each fingerprint is read and unique hash values are inserted
into the index database along with the fingerprint file name. The current design
expects all fingerprint files to be in one dirctory. The fingerprint names are
created uniquely and should never have a collision.
-------------------
INDEX DB SCHEMA
-------------------
The

View File

@ -1,110 +0,0 @@
=========================
Fingerprint Design Doc
==========================
-----------------------
FINGERPRINT DESIGN
-----------------------
Fingerprint Naming Convention
Fully Qualified Domain App Name + "__" + database name + "__" + "dbfp.json"
--------------------------
JSON FINGERPRINT FORMAT
--------------------------
[ _file-details ]
contains information regarding how and where this fingerprint was created:
"app-name": name of the application, usually reverse dns is best identifier
"app-ver": version of the application at the time of this scan
"db-name": name of the database
"format-ver": fingerprint format version, this is helpful for major revisions
"notes": any notes to be included with this fingerprint
"scan-date": time stamp of the database scan and fingerprint creation
"scanner-name": name of the fingerprint scanner tool (to be future proof)
"scanner-ver": version of the fingerprint scanner tool used to create this fingerprint
[ db-metadata ]
contains the exact create table strings, most create table strings are unique
[ db-metadata-hashes ]
contains hashing of the create table stings
[ tables ]
each table schema in a normalized (hash table) data type
-------------
EXAMPLE
-------------
{
"_file-details": {
"app-name": "cm.confide.android",
"app-ver": "",
"db-name": "confide.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-02-29_161058",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)",
"contacts": "CREATE TABLE contacts ( _id INTEGER PRIMARY KEY AUTOINCREMENT, userId INTEGER, firstName TEXT, lastName TEXT, signupDate DATETIME, verified BOOLEAN, email TEXT, phone TEXT )",
"sqlite_sequence": "CREATE TABLE sqlite_sequence(name,seq)"
},
"db-metadata-hashes": {
"android_metadata": "ba739eb03730e563915f2f76b26ced51",
"contacts": "3aaf8eb3bc00f3cf562b368341d4b84f",
"sqlite_sequence": "079355c84d8b3b1511a504e08aab7fd2"
},
"db-metadata-md5": "6ae62dd33c30775996db15fb90d2f99f",
"tables": {
"android_metadata": {
"locale": {
"datatype": "TEXT"
}
},
"contacts": {
"_id": {
"autoincrement": true,
"datatype": "INTEGER",
"primarykey": true
},
"email": {
"datatype": "TEXT"
},
"firstName": {
"datatype": "TEXT"
},
"lastName": {
"datatype": "TEXT"
},
"phone": {
"datatype": "TEXT"
},
"signupDate": {
"datatype": "DATETIME"
},
"userId": {
"datatype": "INTEGER"
},
"verified": {
"datatype": "BOOLEAN"
}
},
"sqlite_sequence": {
"name": {
"datatype": "INTEGER"
},
"seq": {
"datatype": "INTEGER"
}
}
}
}

View File

@ -1,60 +0,0 @@
=====================
Fingerprint Index
=====================
-------------
INTRO
-------------
Why:
The purpose of the database fingerprint index is for speed and quick statistics. The
current number of fingerprints that I have created is ~ 180. In the future it likely
that our fingerprints will be > 1000. The index is designed for the future.
Where:
A sqlite database (_index_dbfp.db) is populated with index data. The current design
expects the index file to be located in the same directory as all the fingerprints.
The fingerprint names are created uniquely and should never have a collision.
How:
To create the index each fingerprint is read and the unique hash values are inserted
into the index database along with the fingerprint file name. Each fingerprint has
an md5 hash that represent the entire database along with a md5 hash that represents
each table in the database. These md5 hashes are used as unique keys that can be
queried in the fingerprint index.
----------
DESIGN
----------
Each create statement can be unique because of the various styles allowed, syntax
The result from the create statements are the same...
The create statments are md5 hashed, those md5 hashes are hashed for db_md5
-------------
DB SCHEMA
-------------
[ Table: md5_all ]
md5_db TEXT PRIMARY KEY, (hash value of the database schema)
md5_list TEXT, (CSV list of md5 hash of tables within the database)
fp_list TEXT, (CSV list of fingerprint file names)
fp_count INTEGER); (count of the fingerprints)
[ Table: md5_table ]
md5_table TEXT PRIMARY KEY, (hash value of the table schema)
fp_list TEXT, (CVS list of fingerprint file names)
fp_count INTEGER); (count of the fingerprints)
*
* The md5_db is not a primary key, is not unique because it is for each app info
*
[ Table: metadata ]
md5_db TEXT, (hash value of the database schema)
app_name TEXT, (name of the app)
app_ver TEXT, (version of the app)
db_file TEXT, (file name of the database scanned)
fp_file TEXT, (file name of the fingerprint)
scan_date TEXT); (date the db was scanned)

View File

@ -9,16 +9,6 @@
History History
------------ ------------
version 1.00b
-NEW: added a new table in the index database that has app details (metadata)
-NEW: added documentation for the index database schema
-NEW: added documentation for the fingerprint format
-NEW: added new functions to query the metadata table
-MOD: improved the scanning of the database to be fingerprinted
-MOD: improved the compareFingerprintDir, split find fingerprint functions
-MOD: improved index creation with commit() and rollback()
-FIX: bug fix for the path parsing of the database file
version 0.98 version 0.98
-new feature: query for md5 hash -new feature: query for md5 hash
-command switch "-md5 <hash_string>" -command switch "-md5 <hash_string>"

View File

@ -3,28 +3,12 @@
Action Items from the code review: Action Items from the code review:
xx1) Change table name from "metadata" to "app_details"
xx1) Regression Testing of all Features
2) Unit Tests
a) create modified fingerprints for testing
b) select databases for testing
3) Documentation
4) Look at SQL statements parsing errors
xx5) Fingerprint compare feature
xx-Add function to query the index for a specific MD5 table (database schema) xx-Add function to query the index for a specific MD5 table (database schema)
xx-Add a feature to add a fingerprint to the existing index (it currently recreates an index) xx-Add a feature to add a fingerprint to the existing index (it currently recreates an index)
xx-Add a table to the Index to list all the applications that have a fingerprint (include the app version) -Add a table to the Index to list all the applications that have a fingerprint (include the app version)
xx-more functionality can result from this information in the index -more functionality can result from this information in the index
-Create a document describing the index file and include an example -Create a document describing the index file and include an example
-Create an example of the FingerprintDB class usage with a standalone tool -Create an example of the FingerprintDB class usage with a standalone tool
@ -34,6 +18,17 @@ Get App Version
http://stackoverflow.com/questions/11942762/get-application-version-name-using-adb http://stackoverflow.com/questions/11942762/get-application-version-name-using-adb
com.google.android.gms__node.db
0b48447805d645966439e1b4042d2625
"sqlite_sequence": "079355c84d8b3b1511a504e08aab7fd2"
more testing
[ Regression Testing ] [ Regression Testing ]
android pull, data dir, comparison android pull, data dir, comparison

View File

@ -1,91 +0,0 @@
import argparse
import os
import sqlite3
from libs.fingerprint import FingerprintDB
from libs.fingerprint_index import FingerprintIndex
class FingerPrintCompare:
def __init__(self, db=None, fingerprint=None, fingerprint_dir=None, fingerprint_index=None, percent_match=85.0):
self.db = db
self.fingerprint = fingerprint
self.fingerprint_dir = fingerprint_dir
self.fingerprint_index = fingerprint_index
self.percent_match = float(percent_match)
def do_comparison(self):
status = 'fail'
if self.fingerprint:
status = self.compare_fingerprint(self.fingerprint)
elif self.fingerprint_dir:
for subdir, dirs, finger_print_files in os.walk(self.fingerprint_dir):
for finger_print_file in finger_print_files:
fingerprint = subdir + os.sep + finger_print_file
if fingerprint.endswith('.json'):
status = self.compare_fingerprint(fingerprint)
if status == 'success':
return status
elif self.fingerprint_index:
status = self.check_fingerprint_index(self.fingerprint_index)
return status
def compare_fingerprint(self, fingerprint):
db = FingerprintDB()
db.scanDBFile(self.db)
percent = db.compareDB(fingerprint)
print "Percent match: {}".format(str(percent))
if percent >= self.percent_match:
return 'success'
else:
return 'fail'
def check_fingerprint_index(self, fingerprint_index):
"""
Check if the database is in the index if it is not compare it against all fingerprints in the index
"""
db = FingerprintDB()
db.scanDBFile(self.db)
md5_db = db.getMD5DB()
conn = sqlite3.connect(fingerprint_index)
c = conn.cursor()
status = c.execute('SELECT EXISTS(SELECT 1 FROM md5_all WHERE md5_db = ' + '"{}" '.format(md5_db) + 'LIMIT 1)').fetchone()
if status == (1,):
return 'success'
else:
return self.compare_finger_print_index(db, fingerprint_index)
@staticmethod
def compare_finger_print_index(db, fingerprint_index):
fp_index = FingerprintIndex()
fp_index.openIndex(fingerprint_index)
md5_db = db.getMD5DB()
md5_tables = db.getMD5Tables()
fp_list = fp_index.findFP(md5_db, md5_tables)
# for fp_index in fp_list:
# fq_fp = fp_dir + os.path.sep + fp_index
# print "[ OPEN fingerprint ] [ {} ]".format(fq_fp)
# percent = db.compareDB(fq_fp)
# print "Percent: {}".format(str(percent))
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Fingerprint a sqlite database based on its schema")
parser.add_argument('-db', '--database', default = None, help="path to file to be fingerprinted")
parser.add_argument('-fp', '--fingerprint', default = None, help="fingerprint file to use in comparison")
parser.add_argument('-fd', '--fpdir', default = None, help="path to directory of fingerprint files")
parser.add_argument('-idx', '--fingerprint_index', default = None, help="path to a fingerprint index")
parser.add_argument('-pm', '--percent_match', default = 85.0, help="acceptable percent match for passing condition")
args = parser.parse_args()
if not (args.database and (args.fingerprint or args.fpdir or args.fingerprint_index)):
parser.error("Please provide a database to compare and some form of fingerprint."
"This tool accepts a fingerprint file, a directory of fingerprint files, or"
"a fingerprint index file")
fpc = FingerPrintCompare(args.database, args.fingerprint, args.fpdir, args.fingerprint_index, float(args.percent_match))
result = fpc.do_comparison()
print result

View File

@ -36,7 +36,7 @@ class FingerprintDB:
sqlmaster = "SELECT name, sql FROM sqlite_master WHERE type='table'" sqlmaster = "SELECT name, sql FROM sqlite_master WHERE type='table'"
# version of the scanner used to create the fingerprint # version of the scanner used to create the fingerprint
scanner_ver = "1.00b" scanner_ver = "0.98"
# version of the json file format, this # is inserted in the json fingerprint file and can be used to determine what is supported at the time of that version # version of the json file format, this # is inserted in the json fingerprint file and can be used to determine what is supported at the time of that version
format_ver = "0.92" format_ver = "0.92"
@ -50,13 +50,18 @@ class FingerprintDB:
self.table_hashes = None self.table_hashes = None
self.filein = "" self.filein = ""
self.init = False self.init = False
# db file details # fingerprint metadata
self.file_details = {} self.metadata = {}
self.file_details['db-name'] = "" self.metadata['db-name'] = ""
self.file_details['app-name'] = "" self.metadata['app-name'] = ""
self.file_details['app-ver'] = "" self.metadata['app-ver'] = ""
self.file_details['notes'] = "" self.metadata['notes'] = ""
self.file_details['scan-date'] = "" self.metadata['scan-date'] = ""
# self.db_name = ""
# self.app_name = ""
# self.app_ver = ""
# self.notes = ""
# self.scan_date = ""
# #
def scanDBFile(self, filein): def scanDBFile(self, filein):
@ -64,20 +69,22 @@ class FingerprintDB:
try: try:
(self.conn, self.cur) = self.__openDB(filein) (self.conn, self.cur) = self.__openDB(filein)
except Exception, ex: except Exception, ex:
logging.info(ex)
raise raise
try: try:
# extract file name from path+filename # extract file name from path+filename
self.file_details['db-name'] = os.path.basename(filein) self.metadata['db-name'] = os.path.basename(filein)
except Exception as ex: except Exception as ex:
logging.warn(ex) logging.error(ex)
self.file_details['db-name'] = filein self.metadata['db-name'] = filein
try: try:
# read database schema, parse the schema # read database schema, parse the schema
self.__readDatabase() self.__readDatabase()
# concat all the table create statements, then md5 # concat all the table create statements, then md5
self.__createMD5DB() self.__createMD5DB()
except Exception as ex: except Exception as ex:
logging.error(ex)
raise raise
# create and index of table hashes # create and index of table hashes
@ -142,6 +149,7 @@ class FingerprintDB:
fp = FingerprintDB(); fp = FingerprintDB();
fp.__importJsonDBSchema(filejson) fp.__importJsonDBSchema(filejson)
result = self.__DBSchemaCompare(fp) result = self.__DBSchemaCompare(fp)
print "[ Percetage == %f]".format(result)
return result return result
# #
@ -163,7 +171,7 @@ class FingerprintDB:
dbmt = jsonData['db-metadata'] dbmt = jsonData['db-metadata']
dbht = jsonData['db-metadata-hashes'] dbht = jsonData['db-metadata-hashes']
dbmd5 = jsonData['db-metadata-md5'] dbmd5 = jsonData['db-metadata-md5']
metadata = jsonData['_file-details'] metadata = jsonData['_file-metadata']
all_tables = tb.keys() all_tables = tb.keys()
for table_name in all_tables: for table_name in all_tables:
@ -175,8 +183,7 @@ class FingerprintDB:
self.tables = tables self.tables = tables
self.db_hash = dbmd5 self.db_hash = dbmd5
self.table_hashes = dbht self.table_hashes = dbht
self.file_details = metadata self.metadata = metadata
self.init = True
except Exception as ex: except Exception as ex:
logging.error("ERROR: problem loading json file: \n{}\n{}".format(file_json, ex)) logging.error("ERROR: problem loading json file: \n{}\n{}".format(file_json, ex))
@ -191,35 +198,36 @@ class FingerprintDB:
# if exists, compare each field # if exists, compare each field
# else, add to unknown tables...or do a fuzzy compare (look at number of fields, field names) # else, add to unknown tables...or do a fuzzy compare (look at number of fields, field names)
diff_num = 0 diff_num = 0
diff_total = 0 # total number of different properties (from within a table) diff_total = 0
all_total = 0 # total number of properties (from the entire database comparison) all_total = 0
for tableName in fp.tables.keys(): for tableName in fp.tables.keys():
try: try:
logging.info("[[ Comparing Table: " + tableName + " ]]")
table = self.tables[tableName] table = self.tables[tableName]
if (table): if (table):
logging.info("__DBMD5Compare:: hash1=={}, hash2=={}".format(fp.tables[tableName].hash(), table.hash()))
if not (fp.tables[tableName].hash() == table.hash()): if not (fp.tables[tableName].hash() == table.hash()):
logging.info("*** Hash difference 1:{}!={}".format(fp.tables[tableName].hash(), table.hash()))
(total, diff_num) = self.__CompareTable(fp.tables[tableName], table) (total, diff_num) = self.__CompareTable(fp.tables[tableName], table)
all_total += total all_total += total
diff_total += diff_num diff_total += diff_num
else: else:
all_total += 10 # increment the total tables compared all_total += 10
logging.info("__DBMD5Compare:: tableName=={} IDENTICAL".format(tableName)) logging.info("Table {} is IDENTICAL (to json fingerprint)".format(tableName))
# table found in only one database (fingerprint) else:
self.__FuzzyTable()
except KeyError as ex: except KeyError as ex:
# get the number of fields from the other table to add to the diff_total # get the number of fields from the other table to add to the diff_total
logging.info("__DBMD5Compare:: tableName=={} NOT FOUND".format(tableName)) all_total += 10
diff_total += 10 # increment the total of different properties diff_total += 10
all_total += 10 # increment the total tables compared logging.info("Table {} not EXISTS (to json fingerprint)".format(tableName))
self.__FuzzyTable() # TODO: try to detect table name changes, look for same properties
logging.info("__DBMD5Compare:: all_total=={}, diff_total=={}".format(all_total, diff_total)) logging.info("diff_total=={}, all_total=={}".format(diff_total, all_total))
if (diff_total > 0): if (diff_total > 0):
if (diff_total == all_total): if (diff_total == all_total):
percentage = 0 percentage = 0
else: else:
percentage = 100 * float(all_total-diff_total) / float(all_total) percentage = float(diff_total / all_total)
else: else:
percentage = 100 percentage = 100
return percentage return percentage
@ -252,12 +260,10 @@ class FingerprintDB:
totals = prop_total_count + fields_total_count totals = prop_total_count + fields_total_count
diff_total = prop_error_count + fields_diff_count diff_total = prop_error_count + fields_diff_count
logging.info("__CompareTable:: prop_total_count=={}, fields_total_count=={}, totals=={}".format(prop_total_count, fields_total_count, totals))
logging.info("__CompareTable:: prop_error_count=={}, fields_diff_count=={}, diff_total=={}".format(prop_error_count, fields_diff_count, diff_total))
return (totals, diff_total) return (totals, diff_total)
# look at un-identified tables and try to match fields by their properties # look at un-identified tables and try to match fields by their properties
def __FuzzyTable(self): def __FuzzyTable():
return return
# #
@ -304,7 +310,7 @@ class FingerprintDB:
dmhash = {} dmhash = {}
shash = {} shash = {}
mhash = {} mhash = {}
ahash['_file-details'] = mhash ahash['_file-metadata'] = mhash
ahash['db-metadata'] = dmhash ahash['db-metadata'] = dmhash
ahash['db-metadata-hashes'] = shash ahash['db-metadata-hashes'] = shash
ahash['db-metadata-md5'] = None ahash['db-metadata-md5'] = None
@ -319,10 +325,10 @@ class FingerprintDB:
mhash['format-ver'] = self.format_ver mhash['format-ver'] = self.format_ver
mhash['scanner-ver'] = self.scanner_ver mhash['scanner-ver'] = self.scanner_ver
mhash['scanner-name'] = 'dbfp' mhash['scanner-name'] = 'dbfp'
mhash['db-name'] = self.file_details['db-name'] mhash['db-name'] = self.metadata['db-name']
mhash['app-name'] = self.file_details['app-name'] mhash['app-name'] = self.metadata['app-name']
mhash['app-ver'] = self.file_details['app-ver'] mhash['app-ver'] = self.metadata['app-ver']
mhash['notes'] = self.file_details['notes'] mhash['notes'] = self.metadata['notes']
# tables # tables
tables = self.tables.keys() tables = self.tables.keys()
@ -355,15 +361,15 @@ class FingerprintDB:
# #
def setAppName(self, name): def setAppName(self, name):
self.file_details['app-name'] = name self.metadata['app-name'] = name
# #
def setAppVer(self, version): def setAppVer(self, version):
self.file_details['app-ver'] = version self.metadata['app-ver'] = version
# #
def setNotes(self, notes): def setNotes(self, notes):
self.file_details['notes'] = notes self.metadata['notes'] = notes
# #
def getErrorString(self, errorCode): def getErrorString(self, errorCode):

View File

@ -8,7 +8,6 @@ import os
import sys import sys
import logging import logging
import sqlite3 as sql import sqlite3 as sql
from operator import itemgetter
from libs.exceptions import FingerprintIndexWrite from libs.exceptions import FingerprintIndexWrite
from libs.exceptions import FingerprintIndexOpen from libs.exceptions import FingerprintIndexOpen
from libs.fingerprint import FingerprintDB from libs.fingerprint import FingerprintDB
@ -81,25 +80,17 @@ class FingerprintIndex:
return rows return rows
return None return None
# return an a sort array with the most likely fingerprints ordered first # return an a list of json fingerprint files to open
def findFPTables(self, md5_tables): def findFPTables(self, md5_tables):
retval = {} retval = {}
for md5_table in md5_tables: for md5_table in md5_tables:
logging.debug("findFPTables::md5_table=={}".format(md5_table))
rows = self.__qTableMD5(md5_table) rows = self.__qTableMD5(md5_table)
for row in rows: for row in rows:
logging.debug("findFPTables::row=={}\n".format(row[0]))
fp_list = row[0] fp_list = row[0]
fps = fp_list.split(',') fps = fp_list.split(',')
for fp in fps: for fp in fps:
if (retval.has_key(fp)): retval[fp] = 1
retval[fp] = retval[fp] + 1 return retval.keys()
else:
retval[fp] = 1
# logging.debug("findFPTables::retval=={}\n".format(retval))
retval_sorted = sorted(retval.items(), key=itemgetter(1), reverse=True)
# logging.debug("findFPTables::retval_sorted=={}\n".format(retval_sorted))
return retval_sorted
# #
def findDB(self, md5_db): def findDB(self, md5_db):
@ -107,8 +98,8 @@ class FingerprintIndex:
return rows return rows
# #
def queryAppDetails(self, md5_db): def queryMetadata(self, md5_db):
rows = self.__qAppDetails(md5_db) rows = self.__qMetadata(md5_db)
return rows return rows
# #
@ -150,11 +141,11 @@ class FingerprintIndex:
logging.error(ex) logging.error(ex)
# #
def __qAppDetails(self, md5_db): def __qMetadata(self, md5_db):
try: try:
rows = self.cur.execute(''' rows = self.cur.execute('''
SELECT app_name, app_ver, db_file, fp_file, scan_date SELECT app_name, app_ver, db_file, fp_file, scan_date
FROM file_details FROM metadata
WHERE md5_db=? WHERE md5_db=?
''', [md5_db]) ''', [md5_db])
@ -184,7 +175,7 @@ class FingerprintIndex:
fp_count INTEGER); fp_count INTEGER);
''') ''')
self.db_conn.execute(''' self.db_conn.execute('''
CREATE TABLE file_details ( CREATE TABLE metadata (
md5_db TEXT, md5_db TEXT,
app_name TEXT, app_name TEXT,
app_ver TEXT, app_ver TEXT,
@ -216,7 +207,7 @@ class FingerprintIndex:
db.importJson(fq_file) db.importJson(fq_file)
self.__insertMod_md5_all(db.db_hash, db.table_hashes.values(), file) self.__insertMod_md5_all(db.db_hash, db.table_hashes.values(), file)
self.__insertMod_md5_tables(db.table_hashes.values(), file) self.__insertMod_md5_tables(db.table_hashes.values(), file)
self.__insertMod_file_details(db, file) self.__insertMod_metadata(db, file)
finCount = finCount+1 finCount = finCount+1
self.db_conn.commit() self.db_conn.commit()
except Exception as ex: except Exception as ex:
@ -233,6 +224,7 @@ class FingerprintIndex:
# #
def __insertMod_md5_all(self, md5_db, md5_list, filename): def __insertMod_md5_all(self, md5_db, md5_list, filename):
try: try:
#logging.info("INSERT INTO md5_all VALUES({}, {}, {}, 1)".format(md5_db, ','.join(md5_list), filename))
self.db_conn.execute( self.db_conn.execute(
''' '''
INSERT INTO md5_all VALUES(?, ?, ?, ?) INSERT INTO md5_all VALUES(?, ?, ?, ?)
@ -242,6 +234,7 @@ class FingerprintIndex:
(fp_list, fp_count) = self.__selectFileList(md5_db) (fp_list, fp_count) = self.__selectFileList(md5_db)
fp_list += ","+filename fp_list += ","+filename
fp_count += 1 fp_count += 1
#logging.info("fp_list=={}".format(fp_list))
self.db_conn.execute( self.db_conn.execute(
''' '''
UPDATE md5_all SET fp_list=?, fp_count=? WHERE md5_db=? UPDATE md5_all SET fp_list=?, fp_count=? WHERE md5_db=?
@ -275,12 +268,18 @@ class FingerprintIndex:
raise FingerprintIndexWrite("Error inserting a row\n{}".format(ex)) raise FingerprintIndexWrite("Error inserting a row\n{}".format(ex))
# #
def __insertMod_file_details(self, db, filename): def __insertMod_metadata(self, db, filename):
# insert the md5 of the table schemas
# print "*****"
# print "***** {}".format(db.metadata)
# print "***** {}".format(db.metadata['fart'])
# print "***** {}".format(db.metadata['app_name'])
try: try:
self.db_conn.execute( self.db_conn.execute(
''' '''
INSERT INTO file_details VALUES(?, ?, ?, ?, ?, ?) INSERT INTO metadata VALUES(?, ?, ?, ?, ?, ?)
''', [db.db_hash, db.file_details['app-name'], db.file_details['app-ver'], db.file_details['db-name'], filename, db.file_details['scan-date']]) ''', [db.db_hash, db.metadata['app-name'], db.metadata['app-ver'], db.metadata['db-name'], filename, db.metadata['scan-date']])
# ''', ["abc", "efg", "hij", "klm", "nop", "qrs"])
except Exception as ex: except Exception as ex:
print ex print ex
raise raise

View File

@ -1,306 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "cache4 4-15-2014 - Copy.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"chat_settings": "CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)",
"chats": "CREATE TABLE chats(uid INTEGER PRIMARY KEY, name TEXT, data BLOB)",
"contacts": "CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)",
"dialogs": "CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER)",
"enc_chats": "CREATE TABLE enc_chats(uid INTEGER PRIMARY KEY, user INTEGER, name TEXT, data BLOB, g BLOB, authkey BLOB, ttl INTEGER)",
"enc_tasks": "CREATE TABLE enc_tasks(date INTEGER, data BLOB)",
"media": "CREATE TABLE media(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, data BLOB)",
"media_counts": "CREATE TABLE media_counts(uid INTEGER PRIMARY KEY, count INTEGER)",
"messages": "CREATE TABLE messages(mid INTEGER PRIMARY KEY, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER)",
"params": "CREATE TABLE params(id INTEGER PRIMARY KEY, seq INTEGER, pts INTEGER, date INTEGER, qts INTEGER, lsv INTEGER, sg INTEGER, pbytes BLOB)",
"pending_read": "CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)",
"randoms": "CREATE TABLE randoms(random_id INTEGER PRIMARY KEY, mid INTEGER)",
"sent_files_v2": "CREATE TABLE sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))",
"user_contacts_v6": "CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)",
"user_phones_v6": "CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))",
"user_photos": "CREATE TABLE user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))",
"users": "CREATE TABLE users(uid INTEGER PRIMARY KEY, name TEXT, status INTEGER, data BLOB)",
"wallpapers": "CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)"
},
"db-metadata-hashes": {
"chat_settings": "7a06efa405c182ff1b91f7ecfa6baa3f",
"chats": "973a2d73d3395c4f5c9a44b8f80e6fd7",
"contacts": "dee7f55491f7743e6f735a28dd3d8d82",
"dialogs": "cd6d2749823e43f8e1dfd9766001ed8b",
"enc_chats": "3daf43bca94440242cc1450282a099e1",
"enc_tasks": "400f26f5657ba7d3e5b8ece14668e57c",
"media": "f272c955f894ac315b53f7ba2abd127a",
"media_counts": "4a641bddf7b412de06f78346afc3b653",
"messages": "e3741a72250b0f2bc46d1f7b43ec479b",
"params": "abeb45d4f4193387f0babb4e8940b349",
"pending_read": "80e89b8b3999d59635a89c6358b7e573",
"randoms": "0ed8162b27e007aafd66437c87df8ee5",
"sent_files_v2": "e6989e78283ba2fb0659c88303e5ee4d",
"user_contacts_v6": "69f0f40d3ad4cf6211009041d0a0c457",
"user_phones_v6": "c1bc50abb1a1bc27022049e7a6ea71b2",
"user_photos": "5cb1903635267a308a71fd8a0b5414cd",
"users": "15dbec1dd2c53c11805648ea1ce0c6dd",
"wallpapers": "b499f19fedc6c34322ed4e0cf8b72420"
},
"db-metadata-md5": "73163c2836d81855d7207e76093c1ba5",
"tables": {
"chat_settings": {
"participants": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"chats": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"contacts": {
"mutual": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"dialogs": {
"date": {
"datatype": "INTEGER"
},
"did": {
"datatype": "INTEGER",
"primarykey": true
},
"last_mid": {
"datatype": "INTEGER"
},
"unread_count": {
"datatype": "INTEGER"
}
},
"enc_chats": {
"authkey": {
"datatype": "BLOB"
},
"data": {
"datatype": "BLOB"
},
"g": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
},
"user": {
"datatype": "INTEGER"
}
},
"enc_tasks": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
}
},
"media": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER"
}
},
"media_counts": {
"count": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"messages": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"out": {
"datatype": "INTEGER"
},
"read_state": {
"datatype": "INTEGER"
},
"send_state": {
"datatype": "INTEGER"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER"
}
},
"params": {
"date": {
"datatype": "INTEGER"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"lsv": {
"datatype": "INTEGER"
},
"pbytes": {
"datatype": "BLOB"
},
"pts": {
"datatype": "INTEGER"
},
"qts": {
"datatype": "INTEGER"
},
"seq": {
"datatype": "INTEGER"
},
"sg": {
"datatype": "INTEGER"
}
},
"pending_read": {
"max_id": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"randoms": {
"mid": {
"datatype": "INTEGER"
},
"random_id": {
"datatype": "INTEGER",
"primarykey": true
}
},
"sent_files_v2": {
"data": {
"datatype": "BLOB"
},
"type": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "TEXT",
"primarykey": true
}
},
"user_contacts_v6": {
"fname": {
"datatype": "TEXT"
},
"sname": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_phones_v6": {
"deleted": {
"datatype": "INTEGER"
},
"phone": {
"datatype": "TEXT",
"primarykey": true
},
"sphone": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_photos": {
"data": {
"datatype": "BLOB"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"users": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"status": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"wallpapers": {
"data": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
}
}
}

View File

@ -1,306 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "cache4 4-15-2014.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"chat_settings": "CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)",
"chats": "CREATE TABLE chats(uid INTEGER PRIMARY KEY, name TEXT, data BLOB)",
"contacts": "CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)",
"dialogs": "CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER)",
"enc_chats": "CREATE TABLE enc_chats(uid INTEGER PRIMARY KEY, user INTEGER, name TEXT, data BLOB, g BLOB, authkey BLOB, ttl INTEGER)",
"enc_tasks": "CREATE TABLE enc_tasks(date INTEGER, data BLOB)",
"media": "CREATE TABLE media(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, data BLOB)",
"media_counts": "CREATE TABLE media_counts(uid INTEGER PRIMARY KEY, count INTEGER)",
"messages": "CREATE TABLE messages(mid INTEGER PRIMARY KEY, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER)",
"params": "CREATE TABLE params(id INTEGER PRIMARY KEY, seq INTEGER, pts INTEGER, date INTEGER, qts INTEGER, lsv INTEGER, sg INTEGER, pbytes BLOB)",
"pending_read": "CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)",
"randoms": "CREATE TABLE randoms(random_id INTEGER PRIMARY KEY, mid INTEGER)",
"sent_files_v2": "CREATE TABLE sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))",
"user_contacts_v6": "CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)",
"user_phones_v6": "CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))",
"user_photos": "CREATE TABLE user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))",
"users": "CREATE TABLE users(uid INTEGER PRIMARY KEY, name TEXT, status INTEGER, data BLOB)",
"wallpapers": "CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)"
},
"db-metadata-hashes": {
"chat_settings": "7a06efa405c182ff1b91f7ecfa6baa3f",
"chats": "973a2d73d3395c4f5c9a44b8f80e6fd7",
"contacts": "dee7f55491f7743e6f735a28dd3d8d82",
"dialogs": "cd6d2749823e43f8e1dfd9766001ed8b",
"enc_chats": "3daf43bca94440242cc1450282a099e1",
"enc_tasks": "400f26f5657ba7d3e5b8ece14668e57c",
"media": "f272c955f894ac315b53f7ba2abd127a",
"media_counts": "4a641bddf7b412de06f78346afc3b653",
"messages": "e3741a72250b0f2bc46d1f7b43ec479b",
"params": "abeb45d4f4193387f0babb4e8940b349",
"pending_read": "80e89b8b3999d59635a89c6358b7e573",
"randoms": "0ed8162b27e007aafd66437c87df8ee5",
"sent_files_v2": "e6989e78283ba2fb0659c88303e5ee4d",
"user_contacts_v6": "69f0f40d3ad4cf6211009041d0a0c457",
"user_phones_v6": "c1bc50abb1a1bc27022049e7a6ea71b2",
"user_photos": "5cb1903635267a308a71fd8a0b5414cd",
"users": "15dbec1dd2c53c11805648ea1ce0c6dd",
"wallpapers": "b499f19fedc6c34322ed4e0cf8b72420"
},
"db-metadata-md5": "73163c2836d81855d7207e76093c1ba5",
"tables": {
"chat_settings": {
"participants": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"chats": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"contacts": {
"mutual": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"dialogs": {
"date": {
"datatype": "INTEGER"
},
"did": {
"datatype": "INTEGER",
"primarykey": true
},
"last_mid": {
"datatype": "INTEGER"
},
"unread_count": {
"datatype": "INTEGER"
}
},
"enc_chats": {
"authkey": {
"datatype": "BLOB"
},
"data": {
"datatype": "BLOB"
},
"g": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
},
"user": {
"datatype": "INTEGER"
}
},
"enc_tasks": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
}
},
"media": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER"
}
},
"media_counts": {
"count": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"messages": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"out": {
"datatype": "INTEGER"
},
"read_state": {
"datatype": "INTEGER"
},
"send_state": {
"datatype": "INTEGER"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER"
}
},
"params": {
"date": {
"datatype": "INTEGER"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"lsv": {
"datatype": "INTEGER"
},
"pbytes": {
"datatype": "BLOB"
},
"pts": {
"datatype": "INTEGER"
},
"qts": {
"datatype": "INTEGER"
},
"seq": {
"datatype": "INTEGER"
},
"sg": {
"datatype": "INTEGER"
}
},
"pending_read": {
"max_id": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"randoms": {
"mid": {
"datatype": "INTEGER"
},
"random_id": {
"datatype": "INTEGER",
"primarykey": true
}
},
"sent_files_v2": {
"data": {
"datatype": "BLOB"
},
"type": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "TEXT",
"primarykey": true
}
},
"user_contacts_v6": {
"fname": {
"datatype": "TEXT"
},
"sname": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_phones_v6": {
"deleted": {
"datatype": "INTEGER"
},
"phone": {
"datatype": "TEXT",
"primarykey": true
},
"sphone": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_photos": {
"data": {
"datatype": "BLOB"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"users": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"status": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"wallpapers": {
"data": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
}
}
}

View File

@ -1,306 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "cache4 blue phone day 1.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"chat_settings": "CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)",
"chats": "CREATE TABLE chats(uid INTEGER PRIMARY KEY, name TEXT, data BLOB)",
"contacts": "CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)",
"dialogs": "CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER)",
"enc_chats": "CREATE TABLE enc_chats(uid INTEGER PRIMARY KEY, user INTEGER, name TEXT, data BLOB, g BLOB, authkey BLOB, ttl INTEGER)",
"enc_tasks": "CREATE TABLE enc_tasks(date INTEGER, data BLOB)",
"media": "CREATE TABLE media(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, data BLOB)",
"media_counts": "CREATE TABLE media_counts(uid INTEGER PRIMARY KEY, count INTEGER)",
"messages": "CREATE TABLE messages(mid INTEGER PRIMARY KEY, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER)",
"params": "CREATE TABLE params(id INTEGER PRIMARY KEY, seq INTEGER, pts INTEGER, date INTEGER, qts INTEGER, lsv INTEGER, sg INTEGER, pbytes BLOB)",
"pending_read": "CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)",
"randoms": "CREATE TABLE randoms(random_id INTEGER PRIMARY KEY, mid INTEGER)",
"sent_files_v2": "CREATE TABLE sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))",
"user_contacts_v6": "CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)",
"user_phones_v6": "CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))",
"user_photos": "CREATE TABLE user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))",
"users": "CREATE TABLE users(uid INTEGER PRIMARY KEY, name TEXT, status INTEGER, data BLOB)",
"wallpapers": "CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)"
},
"db-metadata-hashes": {
"chat_settings": "7a06efa405c182ff1b91f7ecfa6baa3f",
"chats": "973a2d73d3395c4f5c9a44b8f80e6fd7",
"contacts": "dee7f55491f7743e6f735a28dd3d8d82",
"dialogs": "cd6d2749823e43f8e1dfd9766001ed8b",
"enc_chats": "3daf43bca94440242cc1450282a099e1",
"enc_tasks": "400f26f5657ba7d3e5b8ece14668e57c",
"media": "f272c955f894ac315b53f7ba2abd127a",
"media_counts": "4a641bddf7b412de06f78346afc3b653",
"messages": "e3741a72250b0f2bc46d1f7b43ec479b",
"params": "abeb45d4f4193387f0babb4e8940b349",
"pending_read": "80e89b8b3999d59635a89c6358b7e573",
"randoms": "0ed8162b27e007aafd66437c87df8ee5",
"sent_files_v2": "e6989e78283ba2fb0659c88303e5ee4d",
"user_contacts_v6": "69f0f40d3ad4cf6211009041d0a0c457",
"user_phones_v6": "c1bc50abb1a1bc27022049e7a6ea71b2",
"user_photos": "5cb1903635267a308a71fd8a0b5414cd",
"users": "15dbec1dd2c53c11805648ea1ce0c6dd",
"wallpapers": "b499f19fedc6c34322ed4e0cf8b72420"
},
"db-metadata-md5": "73163c2836d81855d7207e76093c1ba5",
"tables": {
"chat_settings": {
"participants": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"chats": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"contacts": {
"mutual": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"dialogs": {
"date": {
"datatype": "INTEGER"
},
"did": {
"datatype": "INTEGER",
"primarykey": true
},
"last_mid": {
"datatype": "INTEGER"
},
"unread_count": {
"datatype": "INTEGER"
}
},
"enc_chats": {
"authkey": {
"datatype": "BLOB"
},
"data": {
"datatype": "BLOB"
},
"g": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
},
"user": {
"datatype": "INTEGER"
}
},
"enc_tasks": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
}
},
"media": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER"
}
},
"media_counts": {
"count": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"messages": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"out": {
"datatype": "INTEGER"
},
"read_state": {
"datatype": "INTEGER"
},
"send_state": {
"datatype": "INTEGER"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER"
}
},
"params": {
"date": {
"datatype": "INTEGER"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"lsv": {
"datatype": "INTEGER"
},
"pbytes": {
"datatype": "BLOB"
},
"pts": {
"datatype": "INTEGER"
},
"qts": {
"datatype": "INTEGER"
},
"seq": {
"datatype": "INTEGER"
},
"sg": {
"datatype": "INTEGER"
}
},
"pending_read": {
"max_id": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"randoms": {
"mid": {
"datatype": "INTEGER"
},
"random_id": {
"datatype": "INTEGER",
"primarykey": true
}
},
"sent_files_v2": {
"data": {
"datatype": "BLOB"
},
"type": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "TEXT",
"primarykey": true
}
},
"user_contacts_v6": {
"fname": {
"datatype": "TEXT"
},
"sname": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_phones_v6": {
"deleted": {
"datatype": "INTEGER"
},
"phone": {
"datatype": "TEXT",
"primarykey": true
},
"sphone": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_photos": {
"data": {
"datatype": "BLOB"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"users": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"status": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"wallpapers": {
"data": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
}
}
}

View File

@ -1,306 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "cache4.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"chat_settings": "CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)",
"chats": "CREATE TABLE chats(uid INTEGER PRIMARY KEY, name TEXT, data BLOB)",
"contacts": "CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)",
"dialogs": "CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER)",
"enc_chats": "CREATE TABLE enc_chats(uid INTEGER PRIMARY KEY, user INTEGER, name TEXT, data BLOB, g BLOB, authkey BLOB, ttl INTEGER)",
"enc_tasks": "CREATE TABLE enc_tasks(date INTEGER, data BLOB)",
"media": "CREATE TABLE media(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, data BLOB)",
"media_counts": "CREATE TABLE media_counts(uid INTEGER PRIMARY KEY, count INTEGER)",
"messages": "CREATE TABLE messages(mid INTEGER PRIMARY KEY, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER)",
"params": "CREATE TABLE params(id INTEGER PRIMARY KEY, seq INTEGER, pts INTEGER, date INTEGER, qts INTEGER, lsv INTEGER, sg INTEGER, pbytes BLOB)",
"pending_read": "CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)",
"randoms": "CREATE TABLE randoms(random_id INTEGER PRIMARY KEY, mid INTEGER)",
"sent_files_v2": "CREATE TABLE sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))",
"user_contacts_v6": "CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)",
"user_phones_v6": "CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))",
"user_photos": "CREATE TABLE user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))",
"users": "CREATE TABLE users(uid INTEGER PRIMARY KEY, name TEXT, status INTEGER, data BLOB)",
"wallpapers": "CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)"
},
"db-metadata-hashes": {
"chat_settings": "7a06efa405c182ff1b91f7ecfa6baa3f",
"chats": "973a2d73d3395c4f5c9a44b8f80e6fd7",
"contacts": "dee7f55491f7743e6f735a28dd3d8d82",
"dialogs": "cd6d2749823e43f8e1dfd9766001ed8b",
"enc_chats": "3daf43bca94440242cc1450282a099e1",
"enc_tasks": "400f26f5657ba7d3e5b8ece14668e57c",
"media": "f272c955f894ac315b53f7ba2abd127a",
"media_counts": "4a641bddf7b412de06f78346afc3b653",
"messages": "e3741a72250b0f2bc46d1f7b43ec479b",
"params": "abeb45d4f4193387f0babb4e8940b349",
"pending_read": "80e89b8b3999d59635a89c6358b7e573",
"randoms": "0ed8162b27e007aafd66437c87df8ee5",
"sent_files_v2": "e6989e78283ba2fb0659c88303e5ee4d",
"user_contacts_v6": "69f0f40d3ad4cf6211009041d0a0c457",
"user_phones_v6": "c1bc50abb1a1bc27022049e7a6ea71b2",
"user_photos": "5cb1903635267a308a71fd8a0b5414cd",
"users": "15dbec1dd2c53c11805648ea1ce0c6dd",
"wallpapers": "b499f19fedc6c34322ed4e0cf8b72420"
},
"db-metadata-md5": "73163c2836d81855d7207e76093c1ba5",
"tables": {
"chat_settings": {
"participants": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"chats": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"contacts": {
"mutual": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"dialogs": {
"date": {
"datatype": "INTEGER"
},
"did": {
"datatype": "INTEGER",
"primarykey": true
},
"last_mid": {
"datatype": "INTEGER"
},
"unread_count": {
"datatype": "INTEGER"
}
},
"enc_chats": {
"authkey": {
"datatype": "BLOB"
},
"data": {
"datatype": "BLOB"
},
"g": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
},
"user": {
"datatype": "INTEGER"
}
},
"enc_tasks": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
}
},
"media": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER"
}
},
"media_counts": {
"count": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"messages": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"out": {
"datatype": "INTEGER"
},
"read_state": {
"datatype": "INTEGER"
},
"send_state": {
"datatype": "INTEGER"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER"
}
},
"params": {
"date": {
"datatype": "INTEGER"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"lsv": {
"datatype": "INTEGER"
},
"pbytes": {
"datatype": "BLOB"
},
"pts": {
"datatype": "INTEGER"
},
"qts": {
"datatype": "INTEGER"
},
"seq": {
"datatype": "INTEGER"
},
"sg": {
"datatype": "INTEGER"
}
},
"pending_read": {
"max_id": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"randoms": {
"mid": {
"datatype": "INTEGER"
},
"random_id": {
"datatype": "INTEGER",
"primarykey": true
}
},
"sent_files_v2": {
"data": {
"datatype": "BLOB"
},
"type": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "TEXT",
"primarykey": true
}
},
"user_contacts_v6": {
"fname": {
"datatype": "TEXT"
},
"sname": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_phones_v6": {
"deleted": {
"datatype": "INTEGER"
},
"phone": {
"datatype": "TEXT",
"primarykey": true
},
"sphone": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_photos": {
"data": {
"datatype": "BLOB"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"users": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"status": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"wallpapers": {
"data": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
}
}
}

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.android.providers.contacts", "app-name": "com.android.providers.contacts",
"app-ver": "", "app-ver": "",
"db-name": "contacts2.db", "dn-name": "contacts2.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172209", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"_sync_state": "CREATE TABLE _sync_state (_id INTEGER PRIMARY KEY,account_name TEXT NOT NULL,account_type TEXT NOT NULL,data TEXT,UNIQUE(account_name, account_type))", "_sync_state": "CREATE TABLE _sync_state (_id INTEGER PRIMARY KEY,account_name TEXT NOT NULL,account_type TEXT NOT NULL,data TEXT,UNIQUE(account_name, account_type))",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.android.providers.contacts", "app-name": "com.android.providers.contacts",
"app-ver": "", "app-ver": "",
"db-name": "profile.db", "dn-name": "profile.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172209", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"_sync_state": "CREATE TABLE _sync_state (_id INTEGER PRIMARY KEY,account_name TEXT NOT NULL,account_type TEXT NOT NULL,data TEXT,UNIQUE(account_name, account_type))", "_sync_state": "CREATE TABLE _sync_state (_id INTEGER PRIMARY KEY,account_name TEXT NOT NULL,account_type TEXT NOT NULL,data TEXT,UNIQUE(account_name, account_type))",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.google.android.gms", "app-name": "com.google.android.gms",
"app-ver": "", "app-ver": "",
"db-name": "fitness.db.username_gmail.com", "dn-name": "fitness.db.username_gmail.com",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"Applications": "CREATE TABLE Applications(_id INTEGER PRIMARY KEY AUTOINCREMENT, package TEXT NOT NULL, version TEXT, details_url TEXT, name TEXT, console_ids TEXT)", "Applications": "CREATE TABLE Applications(_id INTEGER PRIMARY KEY AUTOINCREMENT, package TEXT NOT NULL, version TEXT, details_url TEXT, name TEXT, console_ids TEXT)",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.google.android.gms", "app-name": "com.google.android.gms",
"app-ver": "", "app-ver": "",
"db-name": "keys.db", "dn-name": "keys.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)", "android_metadata": "CREATE TABLE android_metadata (locale TEXT)",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.google.android.gms", "app-name": "com.google.android.gms",
"app-ver": "", "app-ver": "",
"db-name": "node.db", "dn-name": "node.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)", "android_metadata": "CREATE TABLE android_metadata (locale TEXT)",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.google.android.gms", "app-name": "com.google.android.gms",
"app-ver": "", "app-ver": "",
"db-name": "ns.db", "dn-name": "ns.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)", "android_metadata": "CREATE TABLE android_metadata (locale TEXT)",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.google.android.gms", "app-name": "com.google.android.gms",
"app-ver": "", "app-ver": "",
"db-name": "plus.db", "dn-name": "plus.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)", "android_metadata": "CREATE TABLE android_metadata (locale TEXT)",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.google.android.talk", "app-name": "com.google.android.talk",
"app-ver": "", "app-ver": "",
"db-name": "google_analytics_v4.db", "dn-name": "google_analytics_v4.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)", "android_metadata": "CREATE TABLE android_metadata (locale TEXT)",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.google.android.youtube", "app-name": "com.google.android.youtube",
"app-ver": "", "app-ver": "",
"db-name": "identity.db", "dn-name": "identity.db",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)", "android_metadata": "CREATE TABLE android_metadata (locale TEXT)",

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "com.viber.voip", "app-name": "com.viber.voip",
"app-ver": "", "app-ver": "",
"db-name": "viber_messages", "dn-name": "com.viber.voip/databases/viber_messages",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"adx": "CREATE TABLE adx ( _id INTEGER PRIMARY KEY NOT NULL, event_name TEXT, last_tracked INTEGER NOT NULL )", "adx": "CREATE TABLE adx ( _id INTEGER PRIMARY KEY NOT NULL, event_name TEXT, last_tracked INTEGER NOT NULL )",
@ -23,8 +23,7 @@
"messages_likes": "CREATE TABLE messages_likes (_id INTEGER PRIMARY KEY AUTOINCREMENT,message_token LONG NOT NULL,like_token LONG DEFAULT 0,seq INTEGER DEFAULT 0,participant_number TEXT NOT NULL,date LONG DEFAULT 0,read INTEGER DEFAULT 0,sync_read INTEGER DEFAULT 0,status INTEGER DEFAULT 0)", "messages_likes": "CREATE TABLE messages_likes (_id INTEGER PRIMARY KEY AUTOINCREMENT,message_token LONG NOT NULL,like_token LONG DEFAULT 0,seq INTEGER DEFAULT 0,participant_number TEXT NOT NULL,date LONG DEFAULT 0,read INTEGER DEFAULT 0,sync_read INTEGER DEFAULT 0,status INTEGER DEFAULT 0)",
"participants": "CREATE TABLE participants (_id INTEGER PRIMARY KEY autoincrement,conversation_id INTEGER DEFAULT 0,participant_info_id INTEGER DEFAULT 0,last_message_id INTEGER DEFAULT 0,active INTEGER DEFAULT TRUE, group_role INTEGER DEFAULT 1 )", "participants": "CREATE TABLE participants (_id INTEGER PRIMARY KEY autoincrement,conversation_id INTEGER DEFAULT 0,participant_info_id INTEGER DEFAULT 0,last_message_id INTEGER DEFAULT 0,active INTEGER DEFAULT TRUE, group_role INTEGER DEFAULT 1 )",
"participants_info": "CREATE TABLE participants_info (_id INTEGER PRIMARY KEY autoincrement,number TEXT,encrypted_number TEXT,display_name TEXT,contact_name TEXT,contact_id INTEGER DEFAULT 0,native_contact_id INTEGER DEFAULT 0,viber_name TEXT,viber_image TEXT,location_lat LONG DEFAULT 0,location_lng LONG DEFAULT 0,location_date LONG DEFAULT 0,participant_type INTEGER DEFAULT 1, has_contact_name INTEGER DEFAULT 0, native_photo_id LONG DEFAULT 0, has_photo INTEGER DEFAULT 0, sync_date INTEGER DEFAULT 0 )", "participants_info": "CREATE TABLE participants_info (_id INTEGER PRIMARY KEY autoincrement,number TEXT,encrypted_number TEXT,display_name TEXT,contact_name TEXT,contact_id INTEGER DEFAULT 0,native_contact_id INTEGER DEFAULT 0,viber_name TEXT,viber_image TEXT,location_lat LONG DEFAULT 0,location_lng LONG DEFAULT 0,location_date LONG DEFAULT 0,participant_type INTEGER DEFAULT 1, has_contact_name INTEGER DEFAULT 0, native_photo_id LONG DEFAULT 0, has_photo INTEGER DEFAULT 0, sync_date INTEGER DEFAULT 0 )",
"purchase": "CREATE TABLE purchase ( order_id TEXT PRIMARY KEY NOT NULL, category INTEGER, type TEXT, package_name TEXT, product_id TEXT, purchase_time LONG DEFAULT 0, purchase_state INTEGER DEFAULT 0, dev_payload TEXT, token TEXT, json TEXT, signature TEXT,verified INTEGER DEFAULT 0, consumed INTEGER DEFAULT 0, pending INTEGER DEFAULT 0, productjson TEXT)", "purchase": "CREATE TABLE purchase ( order_id TEXT PRIMARY KEY NOT NULL, category INTEGER, type TEXT, package_name TEXT, product_id TEXT, purchase_time LONG DEFAULT 0, purchase_state INTEGER DEFAULT 0, dev_payload TEXT, token TEXT, json TEXT, signature TEXT,verified INTEGER DEFAULT 0, consumed INTEGER DEFAULT 0, pending INTEGER DEFAULT 0)",
"remote_banners": "CREATE TABLE remote_banners (_id INTEGER PRIMARY KEY AUTOINCREMENT, token LONG NOT NULL, type TEXT NOT NULL, position TEXT, end_time LONG DEFAULT 0, meta TEXT, tag TEXT, location TEXT)",
"sqlite_sequence": "CREATE TABLE sqlite_sequence(name,seq)", "sqlite_sequence": "CREATE TABLE sqlite_sequence(name,seq)",
"stickers": "CREATE TABLE stickers ( _id INTEGER PRIMARY KEY NOT NULL, package_id INTEGER DEFAULT 0, generic_col_pos INTEGER DEFAULT 0, generic_row_pos INTEGER DEFAULT 0, column_span INTEGER DEFAULT 0, row_span INTEGER DEFAULT 0, flags INTEGER DEFAULT 0 )", "stickers": "CREATE TABLE stickers ( _id INTEGER PRIMARY KEY NOT NULL, package_id INTEGER DEFAULT 0, generic_col_pos INTEGER DEFAULT 0, generic_row_pos INTEGER DEFAULT 0, column_span INTEGER DEFAULT 0, row_span INTEGER DEFAULT 0, flags INTEGER DEFAULT 0 )",
"stickers_packages": "CREATE TABLE stickers_packages ( _id INTEGER PRIMARY KEY NOT NULL, package_name TEXT, flags INTEGER DEFAULT 0, thumb_axis_shrink_factor FLOAT DEFAULT 0, visibility INTEGER DEFAULT 0, menu_position INTEGER DEFAULT 0, version FLOAT DEFAULT 1.0)" "stickers_packages": "CREATE TABLE stickers_packages ( _id INTEGER PRIMARY KEY NOT NULL, package_name TEXT, flags INTEGER DEFAULT 0, thumb_axis_shrink_factor FLOAT DEFAULT 0, visibility INTEGER DEFAULT 0, menu_position INTEGER DEFAULT 0, version FLOAT DEFAULT 1.0)"
@ -43,13 +42,12 @@
"messages_likes": "a748d1fc1750add16eebf23f06c11345", "messages_likes": "a748d1fc1750add16eebf23f06c11345",
"participants": "ad08c9b89dbeefce73587a510408cece", "participants": "ad08c9b89dbeefce73587a510408cece",
"participants_info": "6e12a7afe73aeb45cc67e95c2ef678c4", "participants_info": "6e12a7afe73aeb45cc67e95c2ef678c4",
"purchase": "0f45d800764d4c423b02460c2e6849f7", "purchase": "f027c710c661e4cd5b813af6fb9017c1",
"remote_banners": "13201c72b6dc3cab93ea47da9308ec93",
"sqlite_sequence": "079355c84d8b3b1511a504e08aab7fd2", "sqlite_sequence": "079355c84d8b3b1511a504e08aab7fd2",
"stickers": "23df16b8e627fb62b45caf431d130b45", "stickers": "23df16b8e627fb62b45caf431d130b45",
"stickers_packages": "36f863f03838cb4dd1c2c98c30afde16" "stickers_packages": "36f863f03838cb4dd1c2c98c30afde16"
}, },
"db-metadata-md5": "17ddf92e37140f761769e34312600342", "db-metadata-md5": "2c32c000dfe232d9ec62b1fa8156c294",
"tables": { "tables": {
"adx": { "adx": {
"_id": { "_id": {
@ -691,9 +689,6 @@
"product_id": { "product_id": {
"datatype": "TEXT" "datatype": "TEXT"
}, },
"productjson": {
"datatype": "TEXT"
},
"purchase_state": { "purchase_state": {
"datatype": "INTEGER", "datatype": "INTEGER",
"default": "0" "default": "0"
@ -716,37 +711,6 @@
"default": "0" "default": "0"
} }
}, },
"remote_banners": {
"_id": {
"autoincrement": true,
"datatype": "INTEGER",
"primarykey": true
},
"end_time": {
"datatype": "LONG",
"default": "0"
},
"location": {
"datatype": "TEXT"
},
"meta": {
"datatype": "TEXT"
},
"position": {
"datatype": "TEXT"
},
"tag": {
"datatype": "TEXT"
},
"token": {
"datatype": "LONG",
"notnull": true
},
"type": {
"datatype": "TEXT",
"notnull": true
}
},
"sqlite_sequence": { "sqlite_sequence": {
"name": { "name": {
"datatype": "INTEGER" "datatype": "INTEGER"

File diff suppressed because it is too large Load Diff

View File

@ -1,52 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "database.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)",
"retained_secrets": "CREATE TABLE retained_secrets (_id integer PRIMARY KEY, number TEXT, zid TEXT, expires INTEGER, rs1 TEXT, rs2 TEXT, verified INTEGER)"
},
"db-metadata-hashes": {
"android_metadata": "ba739eb03730e563915f2f76b26ced51",
"retained_secrets": "36451fd02d349b100b7e6bbefbcc2939"
},
"db-metadata-md5": "0dfe91aa2db1b818f8089b89b66eca3c",
"tables": {
"android_metadata": {
"locale": {
"datatype": "TEXT"
}
},
"retained_secrets": {
"_id": {
"datatype": "integer",
"primarykey": true
},
"expires": {
"datatype": "INTEGER"
},
"number": {
"datatype": "TEXT"
},
"rs1": {
"datatype": "TEXT"
},
"rs2": {
"datatype": "TEXT"
},
"verified": {
"datatype": "INTEGER"
},
"zid": {
"datatype": "TEXT"
}
}
}
}

View File

@ -1,178 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "profilecache.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"profiles": "CREATE TABLE `profiles` (`key` TEXT PRIMARY KEY, `value` TEXT)",
"profiletable": "CREATE TABLE `profiletable` (`itemUserId` TEXT PRIMARY KEY, `itemFirstName` TEXT NOT NULL, `itemLastName` TEXT NOT NULL, `itemBirthday` TEXT NOT NULL, `itemGender` TEXT NOT NULL, `itemStatus` TEXT NOT NULL, `itemLongitude` DOUBLE NOT NULL, `itemLatitude` DOUBLE NOT NULL, `itemDistance` DOUBLE NOT NULL, `itemAvatarUrl` TEXT NOT NULL, `itemThumbnailUrl` TEXT NOT NULL, `itemVideoUrl` TEXT NOT NULL, `itemVideoThumbnailUrl` TEXT NOT NULL, `itemBackgroundUrl` TEXT NOT NULL, `itemPrivacy` INTEGER NOT NULL, `itemIsLocationOn` INTEGER NOT NULL, `itemIsFriend` INTEGER NOT NULL, `itemIsBlocked` INTEGER NOT NULL, `itemFriendRequestType` TEXT NOT NULL, `itemReverseRelationships` TEXT NOT NULL, `itemFeedCount` INTEGER NOT NULL, `itemRefereneCount` INTEGER NOT NULL, `itemLevel1DataSyncTime` BIGINT NOT NULL, `itemLevel2DataSyncTime` BIGINT NOT NULL, `itemLevel3DataSyncTime` BIGINT NOT NULL, `itemLevel4DataSyncTime` BIGINT NOT NULL, `itemLevel5DataSyncTime` BIGINT NOT NULL, `itemLastLocalAccessTime` BIGINT NOT NULL, `itemLastServerModifyTime` BIGINT NOT NULL, `itemLastLocationServerModifyTime` BIGINT NOT NULL, `itemLastStatusServerModifyTime` BIGINT NOT NULL, `itemFriendRequestId` TEXT NOT NULL, `itemFriendRequestMessage` TEXT NOT NULL, `itemFriendRequestTime` BIGINT NOT NULL, `itemIsNewFriendRequest` INTEGER NOT NULL, `itemFriendRequestTCMessageId` INTEGER NOT NULL)"
},
"db-metadata-hashes": {
"profiles": "f25cd242fb0d91d383afdf62ea361a40",
"profiletable": "f50355a48ba41e1ec127242589a34c28"
},
"db-metadata-md5": "76718e910b850406f3471b2cb61fea38",
"tables": {
"profiles": {
"key": {
"datatype": "TEXT",
"primarykey": true
},
"value": {
"datatype": "TEXT"
}
},
"profiletable": {
"itemAvatarUrl": {
"datatype": "TEXT",
"notnull": true
},
"itemBackgroundUrl": {
"datatype": "TEXT",
"notnull": true
},
"itemBirthday": {
"datatype": "TEXT",
"notnull": true
},
"itemDistance": {
"datatype": "DOUBLE",
"notnull": true
},
"itemFeedCount": {
"datatype": "INTEGER",
"notnull": true
},
"itemFirstName": {
"datatype": "TEXT",
"notnull": true
},
"itemFriendRequestId": {
"datatype": "TEXT",
"notnull": true
},
"itemFriendRequestMessage": {
"datatype": "TEXT",
"notnull": true
},
"itemFriendRequestTCMessageId": {
"datatype": "INTEGER",
"notnull": true
},
"itemFriendRequestTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemFriendRequestType": {
"datatype": "TEXT",
"notnull": true
},
"itemGender": {
"datatype": "TEXT",
"notnull": true
},
"itemIsBlocked": {
"datatype": "INTEGER",
"notnull": true
},
"itemIsFriend": {
"datatype": "INTEGER",
"notnull": true
},
"itemIsLocationOn": {
"datatype": "INTEGER",
"notnull": true
},
"itemIsNewFriendRequest": {
"datatype": "INTEGER",
"notnull": true
},
"itemLastLocalAccessTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLastLocationServerModifyTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLastName": {
"datatype": "TEXT",
"notnull": true
},
"itemLastServerModifyTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLastStatusServerModifyTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLatitude": {
"datatype": "DOUBLE",
"notnull": true
},
"itemLevel1DataSyncTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLevel2DataSyncTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLevel3DataSyncTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLevel4DataSyncTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLevel5DataSyncTime": {
"datatype": "BIGINT",
"notnull": true
},
"itemLongitude": {
"datatype": "DOUBLE",
"notnull": true
},
"itemPrivacy": {
"datatype": "INTEGER",
"notnull": true
},
"itemRefereneCount": {
"datatype": "INTEGER",
"notnull": true
},
"itemReverseRelationships": {
"datatype": "TEXT",
"notnull": true
},
"itemStatus": {
"datatype": "TEXT",
"notnull": true
},
"itemThumbnailUrl": {
"datatype": "TEXT",
"notnull": true
},
"itemUserId": {
"datatype": "TEXT",
"primarykey": true
},
"itemVideoThumbnailUrl": {
"datatype": "TEXT",
"notnull": true
},
"itemVideoUrl": {
"datatype": "TEXT",
"notnull": true
}
}
}
}

View File

@ -1,140 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "tc.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"conversations": "CREATE TABLE `conversations` (`conv_id` TEXT PRIMARY KEY, `payload` BLOB, `last_msg_id` INTEGER, `unread_count` INTEGER, `last_read_sent_msg_id` INTEGER, `conv_type` INTEGER DEFAULT 0, `conv_del_status` INTEGER DEFAULT 0, `deleting_ts` BIGINT DEFAULT 0)",
"messages": "CREATE TABLE `messages` (`msg_id` INTEGER PRIMARY KEY, `conv_id` TEXT, `type` INTEGER, `media_id` TEXT, `share_id` TEXT, `create_time` BIGINT, `send_time` BIGINT, `direction` INTEGER, `status` INTEGER, `payload` BLOB, `del_status` INTEGER)",
"profiles": "CREATE TABLE `profiles` (`key` TEXT PRIMARY KEY, `value` TEXT)",
"receipts": "CREATE TABLE `receipts` (`conv_id` TEXT PRIMARY KEY, `msg_id` INTEGER, `sender_msg_id` INTEGER, `type` INTEGER, `create_time` BIGINT, `status` INTEGER, `payload` BLOB)",
"sms": "CREATE TABLE `sms` (`msg_id` INTEGER PRIMARY KEY, `phonenumber` TEXT, `text` TEXT)"
},
"db-metadata-hashes": {
"conversations": "01e299a5222e6ebc1e6787ae01365abc",
"messages": "489c6ca8ce6c91e4e701ea105c3a67af",
"profiles": "f25cd242fb0d91d383afdf62ea361a40",
"receipts": "eb6abeb3cbfbed30f1a3efe1f9f6e00d",
"sms": "0b57e910a559a03aabe451f41a35e28b"
},
"db-metadata-md5": "ec6718bafca2cbe044c7de62ee53d7fa",
"tables": {
"conversations": {
"conv_del_status": {
"datatype": "INTEGER",
"default": "0"
},
"conv_id": {
"datatype": "TEXT",
"primarykey": true
},
"conv_type": {
"datatype": "INTEGER",
"default": "0"
},
"deleting_ts": {
"datatype": "BIGINT",
"default": "0"
},
"last_msg_id": {
"datatype": "INTEGER"
},
"last_read_sent_msg_id": {
"datatype": "INTEGER"
},
"payload": {
"datatype": "BLOB"
},
"unread_count": {
"datatype": "INTEGER"
}
},
"messages": {
"conv_id": {
"datatype": "TEXT"
},
"create_time": {
"datatype": "BIGINT"
},
"del_status": {
"datatype": "INTEGER"
},
"direction": {
"datatype": "INTEGER"
},
"media_id": {
"datatype": "TEXT"
},
"msg_id": {
"datatype": "INTEGER",
"primarykey": true
},
"payload": {
"datatype": "BLOB"
},
"send_time": {
"datatype": "BIGINT"
},
"share_id": {
"datatype": "TEXT"
},
"status": {
"datatype": "INTEGER"
},
"type": {
"datatype": "INTEGER"
}
},
"profiles": {
"key": {
"datatype": "TEXT",
"primarykey": true
},
"value": {
"datatype": "TEXT"
}
},
"receipts": {
"conv_id": {
"datatype": "TEXT",
"primarykey": true
},
"create_time": {
"datatype": "BIGINT"
},
"msg_id": {
"datatype": "INTEGER"
},
"payload": {
"datatype": "BLOB"
},
"sender_msg_id": {
"datatype": "INTEGER"
},
"status": {
"datatype": "INTEGER"
},
"type": {
"datatype": "INTEGER"
}
},
"sms": {
"msg_id": {
"datatype": "INTEGER",
"primarykey": true
},
"phonenumber": {
"datatype": "TEXT"
},
"text": {
"datatype": "TEXT"
}
}
}
}

View File

@ -1,306 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "test1.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"chat_settings": "CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)",
"chats": "CREATE TABLE chats(uid INTEGER PRIMARY KEY, name TEXT, data BLOB)",
"contacts": "CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)",
"dialogs": "CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER)",
"enc_chats": "CREATE TABLE enc_chats(uid INTEGER PRIMARY KEY, user INTEGER, name TEXT, data BLOB, g BLOB, authkey BLOB, ttl INTEGER)",
"enc_tasks": "CREATE TABLE enc_tasks(date INTEGER, data BLOB)",
"media": "CREATE TABLE media(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, data BLOB)",
"media_counts": "CREATE TABLE media_counts(uid INTEGER PRIMARY KEY, count INTEGER)",
"messages": "CREATE TABLE messages(mid INTEGER PRIMARY KEY, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER)",
"params": "CREATE TABLE params(id INTEGER PRIMARY KEY, seq INTEGER, pts INTEGER, date INTEGER, qts INTEGER, lsv INTEGER, sg INTEGER, pbytes BLOB)",
"pending_read": "CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)",
"randoms": "CREATE TABLE randoms(random_id INTEGER PRIMARY KEY, mid INTEGER)",
"sent_files_v2": "CREATE TABLE sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))",
"user_contacts_v6": "CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)",
"user_phones_v6": "CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))",
"user_photos": "CREATE TABLE user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))",
"users": "CREATE TABLE users(uid INTEGER PRIMARY KEY, name TEXT, status INTEGER, data BLOB)",
"wallpapers": "CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)"
},
"db-metadata-hashes": {
"chat_settings": "7a06efa405c182ff1b91f7ecfa6baa3f",
"chats": "973a2d73d3395c4f5c9a44b8f80e6fd7",
"contacts": "dee7f55491f7743e6f735a28dd3d8d82",
"dialogs": "cd6d2749823e43f8e1dfd9766001ed8b",
"enc_chats": "3daf43bca94440242cc1450282a099e1",
"enc_tasks": "400f26f5657ba7d3e5b8ece14668e57c",
"media": "f272c955f894ac315b53f7ba2abd127a",
"media_counts": "4a641bddf7b412de06f78346afc3b653",
"messages": "e3741a72250b0f2bc46d1f7b43ec479b",
"params": "abeb45d4f4193387f0babb4e8940b349",
"pending_read": "80e89b8b3999d59635a89c6358b7e573",
"randoms": "0ed8162b27e007aafd66437c87df8ee5",
"sent_files_v2": "e6989e78283ba2fb0659c88303e5ee4d",
"user_contacts_v6": "69f0f40d3ad4cf6211009041d0a0c457",
"user_phones_v6": "c1bc50abb1a1bc27022049e7a6ea71b2",
"user_photos": "5cb1903635267a308a71fd8a0b5414cd",
"users": "15dbec1dd2c53c11805648ea1ce0c6dd",
"wallpapers": "b499f19fedc6c34322ed4e0cf8b72420"
},
"db-metadata-md5": "73163c2836d81855d7207e76093c1ba5",
"tables": {
"chat_settings": {
"participants": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"chats": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"contacts": {
"mutual": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"dialogs": {
"date": {
"datatype": "INTEGER"
},
"did": {
"datatype": "INTEGER",
"primarykey": true
},
"last_mid": {
"datatype": "INTEGER"
},
"unread_count": {
"datatype": "INTEGER"
}
},
"enc_chats": {
"authkey": {
"datatype": "BLOB"
},
"data": {
"datatype": "BLOB"
},
"g": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
},
"user": {
"datatype": "INTEGER"
}
},
"enc_tasks": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
}
},
"media": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER"
}
},
"media_counts": {
"count": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"messages": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"out": {
"datatype": "INTEGER"
},
"read_state": {
"datatype": "INTEGER"
},
"send_state": {
"datatype": "INTEGER"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER"
}
},
"params": {
"date": {
"datatype": "INTEGER"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"lsv": {
"datatype": "INTEGER"
},
"pbytes": {
"datatype": "BLOB"
},
"pts": {
"datatype": "INTEGER"
},
"qts": {
"datatype": "INTEGER"
},
"seq": {
"datatype": "INTEGER"
},
"sg": {
"datatype": "INTEGER"
}
},
"pending_read": {
"max_id": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"randoms": {
"mid": {
"datatype": "INTEGER"
},
"random_id": {
"datatype": "INTEGER",
"primarykey": true
}
},
"sent_files_v2": {
"data": {
"datatype": "BLOB"
},
"type": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "TEXT",
"primarykey": true
}
},
"user_contacts_v6": {
"fname": {
"datatype": "TEXT"
},
"sname": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_phones_v6": {
"deleted": {
"datatype": "INTEGER"
},
"phone": {
"datatype": "TEXT",
"primarykey": true
},
"sphone": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_photos": {
"data": {
"datatype": "BLOB"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"users": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"status": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"wallpapers": {
"data": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
}
}
}

View File

@ -1,306 +0,0 @@
{
"_file-details": {
"app-name": "",
"app-ver": "",
"db-name": "test2.db",
"format-ver": "0.92",
"notes": "",
"scan-date": "2016-03-03_225317",
"scanner-name": "dbfp",
"scanner-ver": "1.00b"
},
"db-metadata": {
"chat_settings": "CREATE TABLE chat_settings(uid INTEGER PRIMARY KEY, participants BLOB)",
"chats": "CREATE TABLE chats(uid INTEGER PRIMARY KEY, name TEXT, data BLOB)",
"contacts": "CREATE TABLE contacts(uid INTEGER PRIMARY KEY, mutual INTEGER)",
"dialogs": "CREATE TABLE dialogs(did INTEGER PRIMARY KEY, date INTEGER, unread_count INTEGER, last_mid INTEGER)",
"enc_chats": "CREATE TABLE enc_chats(uid INTEGER PRIMARY KEY, user INTEGER, name TEXT, data BLOB, g BLOB, authkey BLOB, ttl INTEGER)",
"enc_tasks": "CREATE TABLE enc_tasks(date INTEGER, data BLOB)",
"media": "CREATE TABLE media(mid INTEGER PRIMARY KEY, uid INTEGER, date INTEGER, data BLOB)",
"media_counts": "CREATE TABLE media_counts(uid INTEGER PRIMARY KEY, count INTEGER)",
"messages": "CREATE TABLE messages(mid INTEGER PRIMARY KEY, uid INTEGER, read_state INTEGER, send_state INTEGER, date INTEGER, data BLOB, out INTEGER, ttl INTEGER)",
"params": "CREATE TABLE params(id INTEGER PRIMARY KEY, seq INTEGER, pts INTEGER, date INTEGER, qts INTEGER, lsv INTEGER, sg INTEGER, pbytes BLOB)",
"pending_read": "CREATE TABLE pending_read(uid INTEGER PRIMARY KEY, max_id INTEGER)",
"randoms": "CREATE TABLE randoms(random_id INTEGER PRIMARY KEY, mid INTEGER)",
"sent_files_v2": "CREATE TABLE sent_files_v2(uid TEXT, type INTEGER, data BLOB, PRIMARY KEY (uid, type))",
"user_contacts_v6": "CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)",
"user_phones_v6": "CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))",
"user_photos": "CREATE TABLE user_photos(uid INTEGER, id INTEGER, data BLOB, PRIMARY KEY (uid, id))",
"users": "CREATE TABLE users(uid INTEGER PRIMARY KEY, name TEXT, status INTEGER, data BLOB)",
"wallpapers": "CREATE TABLE wallpapers(uid INTEGER PRIMARY KEY, data BLOB)"
},
"db-metadata-hashes": {
"chat_settings": "7a06efa405c182ff1b91f7ecfa6baa3f",
"chats": "973a2d73d3395c4f5c9a44b8f80e6fd7",
"contacts": "dee7f55491f7743e6f735a28dd3d8d82",
"dialogs": "cd6d2749823e43f8e1dfd9766001ed8b",
"enc_chats": "3daf43bca94440242cc1450282a099e1",
"enc_tasks": "400f26f5657ba7d3e5b8ece14668e57c",
"media": "f272c955f894ac315b53f7ba2abd127a",
"media_counts": "4a641bddf7b412de06f78346afc3b653",
"messages": "e3741a72250b0f2bc46d1f7b43ec479b",
"params": "abeb45d4f4193387f0babb4e8940b349",
"pending_read": "80e89b8b3999d59635a89c6358b7e573",
"randoms": "0ed8162b27e007aafd66437c87df8ee5",
"sent_files_v2": "e6989e78283ba2fb0659c88303e5ee4d",
"user_contacts_v6": "69f0f40d3ad4cf6211009041d0a0c457",
"user_phones_v6": "c1bc50abb1a1bc27022049e7a6ea71b2",
"user_photos": "5cb1903635267a308a71fd8a0b5414cd",
"users": "15dbec1dd2c53c11805648ea1ce0c6dd",
"wallpapers": "b499f19fedc6c34322ed4e0cf8b72420"
},
"db-metadata-md5": "73163c2836d81855d7207e76093c1ba5",
"tables": {
"chat_settings": {
"participants": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"chats": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"contacts": {
"mutual": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"dialogs": {
"date": {
"datatype": "INTEGER"
},
"did": {
"datatype": "INTEGER",
"primarykey": true
},
"last_mid": {
"datatype": "INTEGER"
},
"unread_count": {
"datatype": "INTEGER"
}
},
"enc_chats": {
"authkey": {
"datatype": "BLOB"
},
"data": {
"datatype": "BLOB"
},
"g": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
},
"user": {
"datatype": "INTEGER"
}
},
"enc_tasks": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
}
},
"media": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER"
}
},
"media_counts": {
"count": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"messages": {
"data": {
"datatype": "BLOB"
},
"date": {
"datatype": "INTEGER"
},
"mid": {
"datatype": "INTEGER",
"primarykey": true
},
"out": {
"datatype": "INTEGER"
},
"read_state": {
"datatype": "INTEGER"
},
"send_state": {
"datatype": "INTEGER"
},
"ttl": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER"
}
},
"params": {
"date": {
"datatype": "INTEGER"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"lsv": {
"datatype": "INTEGER"
},
"pbytes": {
"datatype": "BLOB"
},
"pts": {
"datatype": "INTEGER"
},
"qts": {
"datatype": "INTEGER"
},
"seq": {
"datatype": "INTEGER"
},
"sg": {
"datatype": "INTEGER"
}
},
"pending_read": {
"max_id": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"randoms": {
"mid": {
"datatype": "INTEGER"
},
"random_id": {
"datatype": "INTEGER",
"primarykey": true
}
},
"sent_files_v2": {
"data": {
"datatype": "BLOB"
},
"type": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "TEXT",
"primarykey": true
}
},
"user_contacts_v6": {
"fname": {
"datatype": "TEXT"
},
"sname": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_phones_v6": {
"deleted": {
"datatype": "INTEGER"
},
"phone": {
"datatype": "TEXT",
"primarykey": true
},
"sphone": {
"datatype": "TEXT"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"user_photos": {
"data": {
"datatype": "BLOB"
},
"id": {
"datatype": "INTEGER",
"primarykey": true
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"users": {
"data": {
"datatype": "BLOB"
},
"name": {
"datatype": "TEXT"
},
"status": {
"datatype": "INTEGER"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
},
"wallpapers": {
"data": {
"datatype": "BLOB"
},
"uid": {
"datatype": "INTEGER",
"primarykey": true
}
}
}
}

View File

@ -1,13 +1,13 @@
{ {
"_file-details": { "_file-metadata": {
"app-name": "tv.periscope.android", "app-name": "tv.periscope.android",
"app-ver": "", "app-ver": "",
"db-name": "com.localytics.android.c685a165210ff465709ae8d359bef6c90f17a12f344206db16d6f2f7f129e34f.profile.sqlite", "dn-name": "com.localytics.android.c685a165210ff465709ae8d359bef6c90f17a12f344206db16d6f2f7f129e34f.profile.sqlite",
"format-ver": "0.92", "format-ver": "0.91",
"notes": "", "notes": "",
"scan-date": "2016-02-29_172210", "scan-date": "2016-01-08_110349",
"scanner-name": "dbfp", "scanner-name": "dbfp",
"scanner-ver": "1.00b" "scanner-ver": "0.95"
}, },
"db-metadata": { "db-metadata": {
"android_metadata": "CREATE TABLE android_metadata (locale TEXT)", "android_metadata": "CREATE TABLE android_metadata (locale TEXT)",

View File

@ -1,25 +0,0 @@
import unittest
from libs.fingerprint import FingerprintDB
class FingerprintTestCase(unittest.TestCase):
def setUp(self):
self.db = FingerprintDB()
def testOpenFingerprint(self, in_json):
self.assertTrue(self.db.scanDBFile(file_in))
#self.failUnless(True)
def testWriteFingerprint(self, filename):
self.failIf(True)
def testWriteFingerprintFile(self, filename):
self.failIf(True)
def main():
unittest.main()
if __name__ == '__main__':
main()

View File

@ -1,21 +0,0 @@
import unittest
from libs.fingerprint import FingerprintDB
class TestFingerprintCompare(unittest.TestCase):
def setUp(self):
# open fingerprint
pass
def testCompareFP(self, fp_dir):
self.failUnless(True)
def testCompareDB(self):
self.failIf(True)
def main():
unittest.main()
if __name__ == '__main__':
main()

View File

@ -1,23 +0,0 @@
import unittest
from libs.fingerprint import FingerprintDB
class TestFingerprintIndex(unittest.TestCase):
def setUp(self):
pass
def testOpenFPIndex(self, fp_dir):
self.failUnless(True)
def testCreateIndex(self):
self.failIf(True)
def testFindFP(self, md5_db):
self.failIf(True)
def main():
unittest.main()
if __name__ == '__main__':
main()

0
tests/unit_test1 Normal file
View File

0
tests/unti_test2 Normal file
View File

0
tests/unti_test3 Normal file
View File