data/opt/Grimoire/resources/app.asar!dist/main/index.js
UNKNOWN
Verdict: BENIGN
Local reference
Suspicious dependency
Inferred
| 7:11 |
…uire$$1$2, { homedir, availableParallelism, tmpdir } from "os"; |
|
| 8 |
import require$$0$1, { execFileSync, spawn } from "child_process"; |
|
| 9 |
import require$$0$5, { createHash, randomBytes, randomUUID } from "crypto"; |
|
| 10 |
import require$$14, { gzipSync, gunzipSync, constants as constants$7 } from "zlib"; |
|
| 11 |
import { Worker } from "worker_threads"; |
|
| 12 |
import Database from "better-sqlite3"; |
|
| 13 |
import require$$2$1 from "util"; |
|
| 14 |
import require$$0$2, { EventEmitter } from "events"; |
|
| 15 |
i… |
|
| 56:8 |
…s = { |
|
| 57 |
dev: !app.isPackaged |
|
| 58 |
}; |
|
| 59 |
const platform = { |
|
| 60 |
isWindows: process.platform === "win32", |
|
| 61 |
isMacOS: process.platform === "darwin", |
|
| 62 |
isLinux: process.platform === "linux" |
|
| 63 |
}; |
|
| 64 |
const electronApp = { |
|
| 65 |
setAppUserModelId(id) { |
|
| 66 |
if (platform.isWindows) |
|
| 67 |
app.setAppUserModelId(is.dev ? process.exe… |
|
| 181:13 |
…dout = execFileSync("reg", ["query", key, "/v", value], { |
|
| 182 |
stdio: ["ignore", "pipe", "ignore"], |
|
| 183 |
timeout: 2e3 |
|
| 184 |
}).toString(); |
|
| 185 |
const match = stdout.match(/REG_SZ\s+(.+?)\s*$/m); |
|
| 186 |
return match ? match[1].trim… |
|
| 2066:35 |
… |
|
| 2067 |
if (!/^\d+$/.test(entry)) continue; |
|
| 2068 |
const configPath = join(root, entry, "config", "localconfig.vdf"); |
Steam localconfig/config.vdf file access |
| 2069 |
if (!existsSync(configPath)) continue; |
|
| 2070 |
try { |
|
| 2071 |
const stat2 = await promises.stat(configPath); |
|
| 2072 |
candidates.push({ accountId: entry, configPath, mtime: stat2.mtimeMs … |
|
| 39434:12 |
…rs = []; |
|
| 39435 |
for (const configPath of configPaths) { |
|
| 39436 |
const loginUsersPath = join(configPath, "loginusers.vdf"); |
Steam account config targeting |
| 39437 |
if (!existsSync(loginUsersPath)) { |
|
| 39438 |
continue; |
|
| 39439 |
} |
|
| 39440 |
try { |
|
| 39441 |
const content = readFileSync(loginUsersPath, "utf-8"); |
|
| 39442 |
const data = parseVDF(content); |
|
| 39443 |
const usersD… |
|
Well-known
| 17074:13 |
…ERTICAL_LINE = 124; |
|
| 17075 |
var CHAR_RIGHT_CURLY_BRACKET = 125; |
|
| 17076 |
var ESCAPE_SEQUENCES = {}; |
|
| 17077 |
ESCAPE_SEQUENCES[0] = "\\0"; |
|
| 17078 |
ESCAPE_SEQUENCES[7] = "\\a"; |
|
| 17079 |
ESCAPE_SEQUENCES[8] = "\\b"; |
|
| 17080 |
ESCAPE_SEQUENCES[9] = "\\t… |
|
Objectives
| 2066:35 |
… |
|
| 2067 |
if (!/^\d+$/.test(entry)) continue; |
|
| 2068 |
const configPath = join(root, entry, "config", "localconfig.vdf"); |
|
| 2069 |
if (!existsSync(configPath)) continue; |
|
| 2070 |
try { |
|
| 2071 |
const stat2 = await promises.stat(configPath); |
|
| 2072 |
candidates.push({ accountId: entry, configPath, mtime: stat2.mtimeMs … |
|
| 39434:12 |
…rs = []; |
|
| 39435 |
for (const configPath of configPaths) { |
|
| 39436 |
const loginUsersPath = join(configPath, "loginusers.vdf"); |
|
| 39437 |
if (!existsSync(loginUsersPath)) { |
|
| 39438 |
continue; |
|
| 39439 |
} |
|
| 39440 |
try { |
|
| 39441 |
const content = readFileSync(loginUsersPath, "utf-8"); |
|
| 39442 |
const data = parseVDF(content); |
|
| 39443 |
const usersD… |
|
| 34241:12 |
…s.offset >= this.buffer.length) throw new NeedMoreArchiveBytes("7z metadata is truncated"); |
|
| 34242 |
return this.buffer[this.offset++]; |
|
| 34243 |
} |
|
| 34244 |
readBytes(length) { |
|
| 34245 |
if (length < 0 || this.offset + length > t… |
|
| 2324:37 |
… content) { |
|
| 2325 |
const backupPath = `${path}.grimoire.bak`; |
|
| 2326 |
if (!existsSync(backupPath)) { |
|
| 2327 |
try { |
|
| 2328 |
await promises.copyFile(path, backupPath); |
|
| 2329 |
} catch (err) { |
|
| 2330 |
console.warn("[launchOptions] Backup copy failed (continuing):", err); |
|
| 2331 |
} |
|
| 2332 |
} |
|
| 2333 |
const tmpPath = `${path}.grimoire.tmp`; |
|
| 2334 |
await promises.writeFile(tmpPath, content, "utf-8"); |
|
| 2335 |
await promises.rename(tmpPath, path); |
|
| 2336 |
} |
|
| 2337 |
async function writeLaunchOptions(options, appId = DEADLOCK… |
|
| 21461:25 |
…yaml_1.load)(await this.httpRequest(url, this.configureHeaders("application/octet-stream"), cancellationToken)); |
|
| 21462 |
} catch (e) { |
|
| 21463 |
if (e instanceof builder_util_runtime_1.HttpError && e.statusCode === 404) … |
|
| 23828:3 |
… response2.writeHead(200, { |
|
| 23829 |
"Content-Type": "application/zip", |
|
| 23830 |
"Content-Length": updateFileSize |
|
| 23831 |
}); |
|
| 23832 |
readStream.pipe(response2); |
|
| 23833 |
}); |
|
| 23834 |
this.deb… |
|
| 18681:5 |
… const memoKey = memoOpts + ":" + range2; |
|
| 18682 |
const cached = cache2.get(memoKey); |
|
| 18683 |
if (cached) { |
|
| 18684 |
return cached; |
|
| 18685 |
} |
|
| 18686 |
const loose = this.options.loose; |
|
| 18687 |
const hr = loose… |
|
| 23768:32 |
…"string") { |
|
| 23769 |
return address; |
|
| 23770 |
} |
|
| 23771 |
return `http://127.0.0.1:${address === null || address === void 0 ? void 0 : address.port}`; |
|
| 23772 |
}; |
|
| 23773 |
return await new Promise((resolve2, reject) … |
|
Micro-behaviors
| 72703:32 |
…th("/")) { |
|
| 72704 |
path = `/${path}`; |
|
| 72705 |
} |
|
| 72706 |
url = new URL(util2.parseOrigin(url).origin + path); |
|
| 72707 |
} else { |
|
| 72708 |
if (!opts) { |
|
| 72709 |
opts = typeof url === "object" ? url : {}; |
|
| 72710 |
} |
|
| 72711 |
url = util2… |
|
| 377:16 |
…{ |
|
| 378 |
start: match.index, |
|
| 379 |
end: i + 1, |
|
| 380 |
body: content.slice(braceStart + 1, i) |
|
| 381 |
}; |
|
| 382 |
} |
|
| 383 |
} |
|
| 384 |
} |
|
| 385 |
return null; |
|
| 386 |
} |
|
| 387 |
function hasActivePath(searchPathsBody, relPath) { |
|
| 388 |
con… |
|
| 52362:95 |
…rl.hostname; |
|
| 52363 |
opts.headers = { |
|
| 52364 |
...opts.headers, |
|
| 52365 |
"Sec-WebSocket-Version": opts.protocolVersion, |
|
| 52366 |
"Sec-WebSocket-Key": key, |
|
| 52367 |
Connection: "Upgrade", |
|
| 52368 |
Upgrade: "websocket" |
|
| 52369 |
}; |
|
| 52370 |
opts.path = parsedUrl.pathname + parsedUrl.search; |
|
| 52371 |
opts.timeout = opts.handshakeTimeout; |
|
| 52372 |
if (opts.perMessag… |
|
| 77305:50 |
…url}`)); |
|
| 77306 |
return; |
|
| 77307 |
} |
|
| 77308 |
const chunks = []; |
|
| 77309 |
res.on("data", (c) => chunks.push(c)); |
|
| 77310 |
res.on("end", () => { |
|
| 77311 |
try { |
|
| 77312 |
resolve2(JSON.parse(Buffer.concat(chunks).toString("utf-8"))); |
|
| 77313 |
} catch (e) { |
|
| 77314 |
… |
|
| 53161:65 |
…st("base64"); |
|
| 53162 |
const headers2 = [ |
|
| 53163 |
"HTTP/1.1 101 Switching Protocols", |
|
| 53164 |
"Upgrade: websocket", |
|
| 53165 |
"Connection: Upgrade", |
|
| 53166 |
`Sec-WebSocket-Accept: ${digest}` |
|
| 53167 |
]; |
|
| 53168 |
const ws2 = new this.options.WebSocket(null, void 0, this.options); |
|
| 23768:32 |
…"string") { |
|
| 23769 |
return address; |
|
| 23770 |
} |
|
| 23771 |
return `http://127.0.0.1:${address === null || address === void 0 ? void 0 : address.port}`; |
|
| 23772 |
}; |
|
| 23773 |
return await new Promise((resolve2, reject) … |
|
| 59609:40 |
…archParams) { |
|
| 59610 |
source = object2.toString(); |
|
| 59611 |
type2 = "application/x-www-form-urlencoded;charset=UTF-8"; |
|
| 59612 |
} else if (isArrayBuffer(object2)) { |
|
| 59613 |
source = new Uint8Array(object2.slice()); |
|
| 59614 |
} else if (ArrayBu… |
|
| 8810:17 |
…tFn({ serverUrl, requestOptions, body: body2 }) { |
|
| 8811 |
const httpTransport = serverUrl.startsWith("https:") ? https$1 : http$1; |
|
| 8812 |
const request2 = httpTransport.request(serverUrl, { |
|
| 8813 |
method: "POST", |
|
| 8814 |
...requestOptions, |
|
| 8815 |
headers: { |
|
| 8816 |
"Content-Type": "application/json", |
|
| 8817 |
"Content-Length": body2.length, |
|
| 8818 |
...requestOptions.headers |
|
| 8819 |
} |
|
| 8820 |
}); |
|
| 8821 |
request2.write(body2); |
|
| 8822 |
request2.end… |
|
| 4083:5 |
… (search && search.trim()) { |
|
| 4084 |
const params = new URLSearchParams(); |
|
| 4085 |
params.set("_sSearchString", search); |
|
| 4086 |
params.set("_idGameRow", String(DEADLOCK_GAME_ID)); |
|
| 4087 |
params.set("_sModelName", model); |
|
| 4088 |
par… |
|
| 58229:24 |
…L(location, responseURL(response2)); |
|
| 58230 |
} |
|
| 58231 |
if (location && !location.hash) { |
|
| 58232 |
location.hash = requestFragment; |
|
| 58233 |
} |
|
| 58234 |
return location; |
|
| 58235 |
} |
|
| 58236 |
function isValidEncodedURL(url) { |
|
| 58237 |
for (let i = 0… |
|
| 4405:36 |
…& url.protocol !== "http:") return void 0; |
|
| 4406 |
const hostname = url.hostname.toLowerCase(); |
|
| 4407 |
if (hostname !== "ko-fi.com" && hostname !== "www.ko-fi.com") return void 0; |
|
| 4408 |
return url.toString(); |
|
| 4409 |
} … |
|
| 12929:4 |
… } |
|
| 12930 |
if (options.region === "us-east-1") { |
|
| 12931 |
url = `https://s3.amazonaws.com/${options.bucket}`; |
|
| 12932 |
} else { |
|
| 12933 |
url = `https://s3-${options.region}.amazonaws.com/${options.bucket}`; |
|
| 12934 |
} |
|
| 12935 |
} e… |
|
| 12958:2 |
… return appendPath(`https://${options.name}.${options.region}.digitaloceanspaces.com`, options.path); |
|
| 12959 |
} |
|
| 12960 |
return publishOptions; |
|
| 12961 |
} |
|
| 12962 |
var retry$1 = {}; |
|
| 12963 |
var hasRequiredRetry$1; |
|
| 12964 |
function requireRetry$1() { |
|
| 12965 |
if (has… |
|
| 58477:18 |
…:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { |
|
| 58478 |
return true; |
|
| 58479 |
}… |
|
| 23834:43 |
…e Squirrel.Mac is starting to listen (${logContext})`); |
|
| 23835 |
this.server.listen(0, "127.0.0.1", () => { |
|
| 23836 |
this.debug(`Proxy server for native Squirrel.Mac is listening (address=${getServerUrl(this.server)}, ${logCo… |
|
| 49389:9 |
… (typeof path === "string") |
|
| 49390 |
socket = node_net_1.default.createConnection(path); |
|
| 49391 |
else |
|
| 49392 |
socket = node_net_1.default.createConnection(path[0], path[1]); |
|
| 49393 |
socket.once("connect", onConnect… |
|
| 53182:32 |
…sions; |
|
| 53183 |
} |
|
| 53184 |
this.emit("headers", headers2, req); |
|
| 53185 |
socket.write(headers2.concat("\r\n").join("\r\n")); |
|
| 53186 |
socket.removeListener("error", socketOnError); |
|
| 53187 |
ws2.setSocket(socket, head, { |
|
| 53320:107 |
…ed to connect to Discord's local RPC WebSocket")); |
|
| 53321 |
this.ws.onmessage = (event) => { |
|
| 53322 |
this.emit("message", JSON.parse(event.data.toString())); |
|
| 53323 |
}; |
|
| 53324 |
this.ws.onclose = (event) =>… |
|
| 3474:9 |
…__default.mkdirSync(dir, { recursive: true }); |
|
| 3475 |
} |
|
| 3476 |
db$2 = new Database(dbPath2); |
|
| 3477 |
db$2.pragma("journal_mode = WAL"); |
|
| 3478 |
db$2.pragma("foreign_keys = ON"); |
|
| 3479 |
db$2.exec(` |
|
| 3480 |
-- Core mod d… |
|
| 3788:60 |
…es: ${names.join(", ")}`); |
|
| 3789 |
database.exec(names.map((name) => `DROP TABLE IF EXISTS ${name};`).join("\n")); |
|
| 3790 |
} |
|
| 3791 |
function getTableColumns(database, tableName) { |
|
| 3792 |
return database.prepare(`PRAGMA table_inf… |
|
| 77274:50 |
… |
|
| 77275 |
const MAX_VPK_BYTES = 4 * 1024 * 1024 * 1024; |
|
| 77276 |
const A2S_INFO = Buffer.from("FFFFFFFF54536F7572636520456E67696E6520517565727900", "hex"); |
|
| 77277 |
function validateFilename(name) { |
|
| 77278 |
if (!name || name.length > 128) throw new Error(`invalid content filename: ${name}`); |
|
| 77279 |
if… |
|
| 23788:53 |
…rs.authorization.split(" ")[1]; |
|
| 23789 |
const credentials = Buffer.from(base64Credentials, "base64").toString("ascii"); |
|
| 23790 |
const [username, password] = credentials.split(":"); |
|
| 23791 |
if (username !== "autoupdater" || passwor… |
|
| 15684:57 |
… BASE64_MAP; |
|
| 15685 |
for (idx = 0; idx < max; idx++) { |
|
| 15686 |
code = map2.indexOf(data.charAt(idx)); |
|
| 15687 |
if (code > 64) continue; |
|
| 15688 |
if (code < 0) return false; |
|
| 15689 |
bitlen += 6; |
|
| 15690 |
} |
|
| 15691 |
return bitlen % 8 === 0; |
|
| 15692 |
} |
|
| 15693 |
f… |
|
| 57705:17 |
… = input.length; |
|
| 57706 |
if ((2 << 15) - 1 > length) { |
|
| 57707 |
return String.fromCharCode.apply(null, input); |
|
| 57708 |
} |
|
| 57709 |
let result = ""; |
|
| 57710 |
let i = 0; |
|
| 57711 |
let addition = (2 << 15) - 1; |
|
| 57712 |
while (i < length) { |
|
| 57713 |
if (i + addition > … |
|
| 4479:26 |
…_GAME_ID$1 = 20948; |
|
| 4480 |
function base64UrlEncode(buf) { |
|
| 4481 |
return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); |
|
| 4482 |
} |
|
| 4483 |
function base64UrlDecode(s) { |
|
| 4484 |
const padded = s.replace(/-/g, "+").replace(/_/g, "/"); |
|
| 4485 |
const pad = padded.length % 4; |
|
| 4486 |
return Buffer.from(pad ? padded + "=".repeat(4 - pad) : padded, "base64"); |
|
| 4487 |
} |
|
| 4488 |
function encodeShareCode(json2) { |
|
| 4489 |
const compressed = gzipSync(Buffer.from(json2, "utf8")); |
|
| 4490 |
return PORTABLE_PROFILE_SHARE… |
|
| 33416:43 |
… |
|
| 33417 |
let diff = 0; |
|
| 33418 |
for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i); |
|
| 33419 |
return diff === 0; |
|
| 33420 |
} |
|
| 33421 |
function defaultExpiry() { |
|
| 33422 |
return Math.floor(Date.now() / 1e3) + 30 * 24 * 60 * 60; |
|
| 33423 |
}… |
|
| 49940:9 |
…}); |
|
| 49941 |
}); |
|
| 49942 |
return configurations; |
|
| 49943 |
} |
|
| 49944 |
/** |
|
| 49945 |
* Decompress data. Concurrency limited. |
|
| 49946 |
* |
|
| 49947 |
* @param {Buffer} data Compressed data |
|
| 49948 |
* @param {Boolean} fin Specifies whether or n… |
|
| 4479:26 |
…_GAME_ID$1 = 20948; |
|
| 4480 |
function base64UrlEncode(buf) { |
|
| 4481 |
return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); |
|
| 4482 |
} |
|
| 4483 |
function base64UrlDecode(s) { |
|
| 4484 |
const padded = s.replace(/-/g, "+").replace(/_/g, "/"); |
|
| 4485 |
const pad = padded.length % 4; |
|
| 4486 |
return Buffer.from(pad ? padded + "=".repeat(4 - pad) : padded, "base64"); |
|
| 4487 |
} |
|
| 4488 |
function encodeShareCode(json2) { |
|
| 4489 |
const compressed = gzipSync(Buffer.from(json2, "utf8")); |
|
| 4490 |
return PORTABLE_PROFILE_SHARE… |
|
| 7302:53 |
…n Support"); |
|
| 7303 |
} |
|
| 7304 |
case "win32": { |
|
| 7305 |
return process.env.APPDATA || path.join(home, "AppData/Roaming"); |
|
| 7306 |
} |
|
| 7307 |
default: { |
|
| 7308 |
return process.env.XDG_CONFIG_HOME || path.join(h… |
|
| 21542:32 |
…ata; |
|
| 21543 |
const token = (githubOptions.private ? process.env["GH_TOKEN"] || process.env["GITHUB_TOKEN"] : null) || githubOptions.token; |
|
| 21544 |
if (token == null) { |
|
| 21545 |
return new GitHubProvider_1.GitHubProvider(githubOption… |
|
| 65187:32 |
… |
|
| 65188 |
inspectOptions: { |
|
| 65189 |
colors: !disableColors && !process.env.CI |
|
| 65190 |
} |
|
| 65191 |
}); |
|
| 65192 |
} |
|
| 65193 |
format(pendingInterceptors) { |
|
| 65194 |
const withPrettyHeaders = pendingInterceptors.map( |
|
| 65195 |
({… |
|
| 12112:2 |
… } |
|
| 12113 |
return 1; |
|
| 12114 |
} |
|
| 12115 |
if ("CI" in env) { |
|
| 12116 |
if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((sign) => sign in env) || env.CI_NAME === "codeship") { |
|
| 12117 |
return 1; |
|
| 12118 |
} |
|
| 12119 |
return min; |
|
| 12120 |
} |
|
| 12121 |
if ("TEAMCITY_VERSION" in env) { |
|
| 12122 |
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(en… |
|
| 7321:3 |
… electron: void 0, |
|
| 7322 |
os: this.getOsVersion() |
|
| 7323 |
}; |
|
| 7324 |
} |
|
| 7325 |
isDev() { |
|
| 7326 |
return process.env.NODE_ENV === "development" || process.env.ELECTRON_IS_DEV === "1"; |
|
| 7327 |
} |
|
| 7328 |
isElectron() { |
|
| 7329 |
return Boolean(process.versions.electron); |
|
| 7330 |
} |
|
| 7331 |
onAppEvent(_eventName, _handler) { |
|
| 7332 |
} |
|
| 7333 |
onAppReady(handler) { |
|
| 7334 |
handler(); |
|
| 7335 |
} |
|
| 7336 |
onEveryWebContentsEvent(eventName, handler) { |
|
| 7337 |
} |
|
| 7338 |
/** |
|
| 7339 |
* Listen to async messages sent … |
|
| 56:8 |
…s = { |
|
| 57 |
dev: !app.isPackaged |
|
| 58 |
}; |
|
| 59 |
const platform = { |
|
| 60 |
isWindows: process.platform === "win32", |
|
| 61 |
isMacOS: process.platform === "darwin", |
|
| 62 |
isLinux: process.platform === "linux" |
|
| 63 |
}; |
|
| 64 |
const electronApp = { |
|
| 65 |
setAppUserModelId(id) { |
|
| 66 |
if (platform.isWindows) |
|
| 67 |
app.setAppUserModelId(is.dev ? process.exe… |
|
| 24680:49 |
…{ |
|
| 24681 |
return new Promise((resolve2, reject) => { |
|
| 24682 |
const proc = spawn(cmd, args, { stdio: "pipe" }); |
|
| 24683 |
let stderr = ""; |
|
| 24684 |
let killed = false; |
|
| 24685 |
const timeoutId = setTimeout(() => { |
|
| 24686 |
killed = … |
|
| 1399:2 |
… for (let i = 0; i < concurrency; i++) { |
|
| 1400 |
const worker = new Worker(FINGERPRINT_WORKER_SCRIPT, { eval: true }); |
|
| 1401 |
workers.push(worker); |
|
| 1402 |
worker.on("message", (result) => { |
|
| 1403 |
const index = inFlight.get(worker); |
|
| 1404 |
in… |
|
| 23123:36 |
…rocess_1.spawnSync)(cmd, args, { |
|
| 23124 |
env: { ...process.env, ...env }, |
|
| 23125 |
encoding: "utf-8", |
|
| 23126 |
shell: true |
|
| 23127 |
}); |
|
| 23128 |
const { error: error2, status: status2, stdout, stderr } = response2; |
|
| 23129 |
if (error2 != null) { |
|
| 23130 |
this.… |
|
| 181:13 |
…dout = execFileSync("reg", ["query", key, "/v", value], { |
|
| 182 |
stdio: ["ignore", "pipe", "ignore"], |
|
| 183 |
timeout: 2e3 |
|
| 184 |
}).toString(); |
|
| 185 |
const match = stdout.match(/REG_SZ\s+(.+?)\s*$/m); |
|
| 186 |
return match ? match[1].trim… |
|
| 7:11 |
…uire$$1$2, { homedir, availableParallelism, tmpdir } from "os"; |
|
| 8 |
import require$$0$1, { execFileSync, spawn } from "child_process"; |
|
| 9 |
import require$$0$5, { createHash, randomBytes, randomUUID } from "crypto"; |
|
| 10 |
import require$$14, { gzipSync, gunzipSync, constants as constants$7 } from "zlib"; |
|
| 11 |
import { Worker } from "worker_threads"; |
|
| 12 |
import Database from "better-sqlite3"; |
|
| 13 |
import require$$2$1 from "util"; |
|
| 14 |
import require$$0$2, { EventEmitter } from "events"; |
|
| 15 |
i… |
|
| 2085:30 |
…klist.exe", ["/FI", "IMAGENAME eq steam.exe", "/NH"], { |
|
| 2086 |
windowsHide: true |
|
| 2087 |
}); |
|
| 2088 |
let stdout = ""; |
|
| 2089 |
proc.stdout?.on("data", (chunk) => { |
|
| 2090 |
stdout += chunk.toString(); |
|
| 2091 |
}); |
|
| 2092 |
proc.on("close", () => resolve2(/steam\.exe/i.test(stdout))); |
|
| 2093 |
proc.on("error", () => resolve2(false)); |
|
| 2094 |
} else if (process.platfor… |
|
| 7:11 |
…uire$$1$2, { homedir, availableParallelism, tmpdir } from "os"; |
|
| 8 |
import require$$0$1, { execFileSync, spawn } from "child_process"; |
|
| 9 |
import require$$0$5, { createHash, randomBytes, randomUUID } from "crypto"; |
|
| 10 |
import require$$14, { gzipSync, gunzipSync, constants as constants$7 } from "zlib"; |
|
| 11 |
import { Worker } from "worker_threads"; |
|
| 12 |
import Database from "better-sqlite3"; |
|
| 13 |
import require$$2$1 from "util"; |
|
| 14 |
import require$$0$2, { EventEmitter } from "events"; |
|
| 15 |
i… |
|
| 23889 |
const executable = `set "PSModulePath=" & chcp 65001 >NUL & powershell.exe`; |
|
| 23890 |
const args = ["-NoProfile", "-NonInteractive", "-InputFormat", "None", "-Command", command]; |
|
| 23891 |
const options = { |
|
| 23892 |
… |
|
| 23358:30 |
…g(sudo[0], [...sudo.length > 1 ? sudo.slice(1) : [], `${wrapper}/bin/bash`, "-c", `'${commandWithArgs.join(" ")}'${wrapper}`]); |
|
| 23359 |
} |
|
| 23360 |
sudoWithArgs(installComment) { |
|
| 23361 |
const sudo = this.determin… |
|
| 4887:7 |
…row new Error( |
|
| 4888 |
`vpkmerge binary missing at ${full}. Run \`pnpm install\` (or \`pnpm fetch-vpkmerge\`) to fetch it.` |
|
| 4889 |
); |
|
| 4890 |
} |
|
| 4891 |
return full; |
|
| 4892 |
} |
|
| 4893 |
function runVpkmerge(args, timeoutMs = 3e5) { |
|
| 4894 |
return… |
|
| 23117:50 |
… quit"); |
|
| 23118 |
this.install(true, false); |
|
| 23119 |
}); |
|
| 23120 |
} |
|
| 23121 |
spawnSyncLog(cmd, args = [], env = {}) { |
|
| 23122 |
this._logger.info(`Executing: ${cmd} with args: ${args}`); |
|
| 23123 |
const response2 = (0, chi… |
|
Metadata
-
0
import require$$1$3, { app, session, ipcMain, BrowserWindow, shell, protocol, net, safeStorage, dialog, clipboard, nativeImage, nativeTheme } from "electro
20 of 47 traits shown
Identity
| SHA-256 |
82dd3a45dd1cbe3c38f8309468b22e2dab61047a67453d9918872246eea9d5e5 |
| Filename |
data/opt/Grimoire/resources/app.asar!dist/main/index.js |
Origin
| Source |
x |
| Feed |
aur.archlinux.org |
| Ecosystem |
arch |
Timeline
| First seen |
5 Aug 2026 18:28 UTC |
| First analyzed |
21 Jun 2026 23:56 UTC |
| Last analyzed |
5 Aug 2026 18:30 UTC |
| Last updated |
5 Aug 2026 18:28 UTC |