Skip to content

Commit

Permalink
The code any_browser() has been optimized specifically for Octo Browser
Browse files Browse the repository at this point in the history
  • Loading branch information
Igor Anikin committed Nov 3, 2023
1 parent 02995bb commit 859f6d7
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 16 deletions.
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions .idea/rookie.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion rookie-rs/bin/main.rs
@@ -1,6 +1,10 @@
use rookie;

fn main() {
let cookies = rookie::brave(None).unwrap();
let cookies_path = "C:\\Users\\Igor\\AppData\\Roaming\\Octo Browser\\tmp\\adf0db8a\\Default\\Network\\Cookies";
let key_path = "C:\\Users\\Igor\\AppData\\Roaming\\Octo Browser\\tmp\\adf0db8a\\Local State";

let cookies = rookie::any_browser(cookies_path, None,
Some(key_path)).unwrap();
println!("{:?}", cookies);
}
34 changes: 19 additions & 15 deletions rookie-rs/src/chromium.rs
@@ -1,7 +1,6 @@
use std::{path::PathBuf, error::Error};
use crate::{enums::*, date};
use crate::sqlite;
use log::warn;

cfg_if::cfg_if! {
if #[cfg(target_os = "windows")] {
Expand Down Expand Up @@ -44,7 +43,7 @@ fn get_keys(config: &BrowserConfig) -> Result<Vec<Vec<u8>>, Box<dyn std::error::
let iterations = 1;

let mut keys: Vec<Vec<u8>> = vec![];


cfg_if::cfg_if! {
if #[cfg(target_os = "linux")] {
Expand Down Expand Up @@ -75,11 +74,11 @@ fn get_keys(config: &BrowserConfig) -> Result<Vec<Vec<u8>>, Box<dyn std::error::
let key = create_pbkdf2_key("", salt, iterations);
keys.push(key);


}
}
Ok(keys)

}


Expand Down Expand Up @@ -121,7 +120,7 @@ fn decrypt_encrypted_value(value: String, encrypted_value: &[u8], keys: Vec<Vec<
return Ok(value);
}
use aes::cipher::{block_padding::Pkcs7, BlockDecryptMut, KeyIvInit};

type Aes128CbcDec = cbc::Decryptor<aes::Aes128>;


Expand All @@ -137,16 +136,16 @@ fn decrypt_encrypted_value(value: String, encrypted_value: &[u8], keys: Vec<Vec<
key_array.copy_from_slice(&key[..16]);
let cipher = Aes128CbcDec::new(&key_array.into(), &iv.into());
let mut cloned_encrypted_value: Vec<u8> = encrypted_value.to_vec();

if let Ok(plaintext) = cipher.decrypt_padded_mut::<Pkcs7>(&mut cloned_encrypted_value) {

let decoded = String::from_utf8(plaintext.to_vec());
match decoded {
Ok(decoded) => {
return Ok(decoded);
}
Err(_) => {
warn!("Error in decode decrypt value with utf8");
eprintln!("[WARN] error in decode decrypt value with utf8");
return Ok("".into());
}
}
Expand All @@ -157,11 +156,11 @@ fn decrypt_encrypted_value(value: String, encrypted_value: &[u8], keys: Vec<Vec<
}


fn query_cookies(keys: Vec<Vec<u8>>, db_path: PathBuf, domains: Option<Vec<&str>>) -> Result<Vec<Cookie>, Box<dyn Error>> {
fn query_cookies(keys: Vec<Vec<u8>>, db_path: PathBuf, domains: Option<Vec<&str>>) -> Result<Vec<Cookie>, Box<dyn Error>> {
cfg_if::cfg_if! {
if #[cfg(target_os = "windows")] {
let db_path_str = db_path.to_str().ok_or("Cant convert db path to str")?;
warn!("Unlocking chrome database, it may take a while (sometimes up to minute)");
eprintln!("[WARN] Unlocking chrome database, it may take a while (sometimes up to minute)");
unsafe {winapi::release_file_lock(db_path_str);}
}
}
Expand All @@ -172,15 +171,15 @@ fn query_cookies(keys: Vec<Vec<u8>>, db_path: PathBuf, domains: Option<Vec<&str>
let domain_queries: Vec<String> = domains.iter()
.map(|domain| format!("host_key LIKE '%{}%'", domain))
.collect();

if !domain_queries.is_empty() {
let joined_queries = domain_queries.join(" OR ");
query += &format!("WHERE ({})", joined_queries);
}
}
query += ";";



let mut cookies: Vec<Cookie> = vec![];
let mut stmt = connection.prepare(query.as_str())?;
Expand All @@ -194,12 +193,13 @@ fn query_cookies(keys: Vec<Vec<u8>>, db_path: PathBuf, domains: Option<Vec<&str>
let expires: u64 = row.get(3)?;
let expires = date::chromium_timestamp(expires);
let name: String = row.get(4)?;

let value: String = row.get(5)?;
let encrypted_value: Vec<u8> = row.get(6)?;
let decrypted_value = decrypt_encrypted_value(value, &encrypted_value, keys.to_owned())?;
// let decrypted_value = decrypt_encrypted_value(value, &encrypted_value, keys.to_owned())?;
let decrypted_value = convert_to_string(&encrypted_value);
let http_only: bool = row.get(7)?;

let same_site: i64 = row.get(8)?;
let cookie = Cookie {
domain: host_key.to_string(),
Expand All @@ -217,6 +217,10 @@ fn query_cookies(keys: Vec<Vec<u8>>, db_path: PathBuf, domains: Option<Vec<&str>
}


fn convert_to_string(bytes: &[u8]) -> String {
String::from_utf8_lossy(bytes).to_string()
}


#[cfg(target_os = "windows")]
pub fn chromium_based(key: PathBuf, db_path: PathBuf, domains: Option<Vec<&str>>) -> Result<Vec<Cookie>, Box<dyn Error>> {
Expand Down

0 comments on commit 859f6d7

Please sign in to comment.