Skip to content

Commit 9bef7e5

Browse files
committed
fix: add support for log file using split state format
1 parent 2c5b76b commit 9bef7e5

File tree

4 files changed

+115
-65
lines changed

4 files changed

+115
-65
lines changed

app/lib.js

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -116,27 +116,52 @@ function extractVaultFromFile (data) {
116116
}
117117
}
118118

119-
// attempt 6: chromium 000005.ldb on windows
120-
const matchRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/gu
121-
const captureRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/u
122-
const ivRegex = /\\"iv.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,40}=*)/u
123-
const dataRegex = /\\"[^":,is]*\\":\\"([A-Za-z0-9+\/]*=*)/u
124-
const saltRegex = /,\\"salt.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,100}=*)/u
125-
const vaults = dedupe(data.match(matchRegex)?.map(m => m.match(captureRegex)[1])
126-
.map(s => [dataRegex, ivRegex, saltRegex].map(r => s.match(r)))
127-
.filter(([d,i,s]) => d&&d.length>1 && i&&i.length>1 && s&&s.length>1)
128-
.map(([d,i,s]) => ({
129-
data: d[1],
130-
iv: i[1],
131-
salt: s[1],
132-
})))
133-
if (!vaults.length) {
134-
return null
119+
{
120+
// attempt 6: chromium 000005.ldb on windows
121+
const matchRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/gu
122+
const captureRegex = /Keyring[0-9][^\}]*(\{[^\{\}]*\\"\})/u
123+
const ivRegex = /\\"iv.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,40}=*)/u
124+
const dataRegex = /\\"[^":,is]*\\":\\"([A-Za-z0-9+\/]*=*)/u
125+
const saltRegex = /,\\"salt.{1,4}[^A-Za-z0-9+\/]{1,10}([A-Za-z0-9+\/]{10,100}=*)/u
126+
const vaults = dedupe(data.match(matchRegex)?.map(m => m.match(captureRegex)[1])
127+
.map(s => [dataRegex, ivRegex, saltRegex].map(r => s.match(r)))
128+
.filter(([d,i,s]) => d&&d.length>1 && i&&i.length>1 && s&&s.length>1)
129+
.map(([d,i,s]) => ({
130+
data: d[1],
131+
iv: i[1],
132+
salt: s[1],
133+
})))
134+
if (vaults.length) {
135+
if (vaults.length > 1) {
136+
console.log('Found multiple vaults!', vaults)
137+
}
138+
return vaults[0]
139+
}
135140
}
136-
if (vaults.length > 1) {
137-
console.log('Found multiple vaults!', vaults)
141+
{
142+
// attempt 7: log file using split state format, chromium 000004.log on windows-2
143+
const vaultRegex = /KeyringController[\s\S]*?"vault":"((?:[^"\\]|\\.)*)"/g
144+
const vaults = []
145+
let match
146+
147+
while ((match = vaultRegex.exec(data)) !== null) {
148+
try {
149+
const vaultString = JSON.parse(`"${match[1]}"`)
150+
vaults.push(JSON.parse(vaultString))
151+
} catch (err) {
152+
// Not valid JSON: continue
153+
}
154+
}
155+
156+
const dedupedVaults = dedupe(vaults)
157+
if (dedupedVaults.length) {
158+
if (dedupedVaults.length > 1) {
159+
console.log('Found multiple vaults!', dedupedVaults)
160+
}
161+
return dedupedVaults[0]
162+
}
138163
}
139-
return vaults[0]
164+
return null
140165
}
141166

142167

@@ -176,5 +201,3 @@ module.exports = {
176201
extractVaultFromFile,
177202
isVaultValid,
178203
}
179-
180-

app/lib.test.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ const FIXTURES = [
5050
'live pupil slab senior boy release lyrics shaft lazy renew potato simple',
5151
passphrase: 'correct horse battery staple',
5252
},
53+
{
54+
path: 'chrome-windows-2/000004.log',
55+
mnemonic: 'please injury labor shift much city general enemy vivid bench pottery picture',
56+
passphrase: 'correct horse battery staple',
57+
},
5358
]
5459

5560
const VAULTS = [

bundle.js

Lines changed: 66 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ function decodeMnemonic(mnemonic) {
3636
}
3737
}
3838
function extractVaultFromFile(data) {
39-
var _data$match;
4039
var vaultBody;
4140
try {
4241
// attempt 1: raw json
@@ -75,11 +74,11 @@ function extractVaultFromFile(data) {
7574
if (_matches2 && _matches2.length) {
7675
try {
7776
var keyringControllerStateFragment = _matches2[1];
78-
var _dataRegex = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/;
79-
var _ivRegex = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/;
80-
var _saltRegex = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/;
77+
var dataRegex = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/;
78+
var ivRegex = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/;
79+
var saltRegex = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/;
8180
var keyMetaRegex = /,\\"keyMetadata\\":(.*}})/;
82-
var vaultParts = [_dataRegex, _ivRegex, _saltRegex, keyMetaRegex].map(function (reg) {
81+
var vaultParts = [dataRegex, ivRegex, saltRegex, keyMetaRegex].map(function (reg) {
8382
return keyringControllerStateFragment.match(reg);
8483
}).map(function (match) {
8584
return match[1];
@@ -102,11 +101,11 @@ function extractVaultFromFile(data) {
102101
if (_matches3 && _matches3.length) {
103102
try {
104103
var _keyringControllerStateFragment = _matches3[1];
105-
var _dataRegex2 = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/;
106-
var _ivRegex2 = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/;
107-
var _saltRegex2 = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/;
104+
var _dataRegex = /\\"data\\":\\"([\+\/-9A-Za-z]*=*)/;
105+
var _ivRegex = /,\\"iv\\":\\"([\+\/-9A-Za-z]{10,40}=*)/;
106+
var _saltRegex = /,\\"salt\\":\\"([A-Za-z0-9+\/]{10,100}=*)\\"/;
108107
var _keyMetaRegex = /,\\"keyMetadata\\":(.*}})/;
109-
var _vaultParts = [_dataRegex2, _ivRegex2, _saltRegex2, _keyMetaRegex].map(function (reg) {
108+
var _vaultParts = [_dataRegex, _ivRegex, _saltRegex, _keyMetaRegex].map(function (reg) {
110109
return _keyringControllerStateFragment.match(reg);
111110
}).map(function (match) {
112111
return match[1];
@@ -122,43 +121,66 @@ function extractVaultFromFile(data) {
122121
}
123122
}
124123
}
125-
126-
// attempt 6: chromium 000005.ldb on windows
127-
var matchRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/g;
128-
var captureRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/;
129-
var ivRegex = /\\"iv(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,40}=*)/;
130-
var dataRegex = /\\"(?:[\0-!#-\+\x2D-9;-hj-rt-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\":\\"([\+\/-9A-Za-z]*=*)/;
131-
var saltRegex = /,\\"salt(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,100}=*)/;
132-
var vaults = dedupe((_data$match = data.match(matchRegex)) === null || _data$match === void 0 ? void 0 : _data$match.map(function (m) {
133-
return m.match(captureRegex)[1];
134-
}).map(function (s) {
135-
return [dataRegex, ivRegex, saltRegex].map(function (r) {
136-
return s.match(r);
137-
});
138-
}).filter(function (_ref3) {
139-
var _ref4 = _slicedToArray(_ref3, 3),
140-
d = _ref4[0],
141-
i = _ref4[1],
142-
s = _ref4[2];
143-
return d && d.length > 1 && i && i.length > 1 && s && s.length > 1;
144-
}).map(function (_ref5) {
145-
var _ref6 = _slicedToArray(_ref5, 3),
146-
d = _ref6[0],
147-
i = _ref6[1],
148-
s = _ref6[2];
149-
return {
150-
data: d[1],
151-
iv: i[1],
152-
salt: s[1]
153-
};
154-
}));
155-
if (!vaults.length) {
156-
return null;
124+
{
125+
var _data$match;
126+
// attempt 6: chromium 000005.ldb on windows
127+
var matchRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/g;
128+
var captureRegex = /Keyring[0-9](?:[\0-\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*(\{(?:[\0-z\|~-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\"\})/;
129+
var _ivRegex2 = /\\"iv(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,40}=*)/;
130+
var _dataRegex2 = /\\"(?:[\0-!#-\+\x2D-9;-hj-rt-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])*\\":\\"([\+\/-9A-Za-z]*=*)/;
131+
var _saltRegex2 = /,\\"salt(?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,4}(?:[\0-\*,-\.:-@\[-`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]){1,10}([\+\/-9A-Za-z]{10,100}=*)/;
132+
var vaults = dedupe((_data$match = data.match(matchRegex)) === null || _data$match === void 0 ? void 0 : _data$match.map(function (m) {
133+
return m.match(captureRegex)[1];
134+
}).map(function (s) {
135+
return [_dataRegex2, _ivRegex2, _saltRegex2].map(function (r) {
136+
return s.match(r);
137+
});
138+
}).filter(function (_ref3) {
139+
var _ref4 = _slicedToArray(_ref3, 3),
140+
d = _ref4[0],
141+
i = _ref4[1],
142+
s = _ref4[2];
143+
return d && d.length > 1 && i && i.length > 1 && s && s.length > 1;
144+
}).map(function (_ref5) {
145+
var _ref6 = _slicedToArray(_ref5, 3),
146+
d = _ref6[0],
147+
i = _ref6[1],
148+
s = _ref6[2];
149+
return {
150+
data: d[1],
151+
iv: i[1],
152+
salt: s[1]
153+
};
154+
}));
155+
if (vaults.length) {
156+
if (vaults.length > 1) {
157+
console.log('Found multiple vaults!', vaults);
158+
}
159+
return vaults[0];
160+
}
157161
}
158-
if (vaults.length > 1) {
159-
console.log('Found multiple vaults!', vaults);
162+
{
163+
// attempt 7: log file using split state format
164+
var vaultRegex = /KeyringController[\s\S]*?"vault":"((?:[^"\\]|\\.)*)"/g;
165+
var _vaults = [];
166+
var match;
167+
while ((match = vaultRegex.exec(data)) !== null) {
168+
try {
169+
var vaultString = JSON.parse("\"".concat(match[1], "\""));
170+
_vaults.push(JSON.parse(vaultString));
171+
} catch (err) {
172+
// Not valid JSON: continue
173+
}
174+
}
175+
var dedupedVaults = dedupe(_vaults);
176+
if (dedupedVaults.length) {
177+
if (dedupedVaults.length > 1) {
178+
console.log('Found multiple vaults!', dedupedVaults);
179+
}
180+
return dedupedVaults[0];
181+
}
160182
}
161-
return vaults[0];
183+
return null;
162184
}
163185
function isVaultValid(vault) {
164186
return _typeof(vault) === 'object' && ['data', 'iv', 'salt'].every(function (e) {
33.9 KB
Binary file not shown.

0 commit comments

Comments
 (0)