update hyprland and add screencopy permissions
This commit is contained in:
89
scripts/bin/patchInternalRobloxStudio.ts
Normal file
89
scripts/bin/patchInternalRobloxStudio.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
import { promises as fs } from "fs";
|
||||
import * as path from "path";
|
||||
import * as os from "os";
|
||||
|
||||
const SIGNATURE = Buffer.from([
|
||||
0x48, 0x81, 0xEC, 0x40, 0x03, 0x00, 0x00, 0x84, 0xD2, 0x74, 0x05, 0xE8
|
||||
]);
|
||||
|
||||
const PATCH = Buffer.from([
|
||||
0x48, 0x81, 0xEC, 0x40, 0x03, 0x00, 0x00, 0x84, 0xD2, 0x90, 0x90, 0xE8
|
||||
]);
|
||||
|
||||
const baseDir = path.join(
|
||||
os.homedir(),
|
||||
".var/app/org.vinegarhq.Vinegar/data/vinegar/versions"
|
||||
);
|
||||
|
||||
function findSignature(buffer: Buffer, signature: Buffer): number {
|
||||
const sigLen = signature.length;
|
||||
for (let i = 0; i <= buffer.length - sigLen; i++) {
|
||||
let match = true;
|
||||
for (let j = 0; j < sigLen; j++) {
|
||||
if (buffer[i + j] !== signature[j]) {
|
||||
match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (match) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
async function patchFile(folder: string) {
|
||||
const exePath = path.join(folder, "RobloxStudioBeta.exe");
|
||||
|
||||
let binary: Buffer;
|
||||
try {
|
||||
binary = await fs.readFile(exePath);
|
||||
} catch (err) {
|
||||
console.error(`[ERROR] Could not read ${exePath}/RobloxStudioBeta.exe:`, err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (findSignature(binary, PATCH)) {
|
||||
console.log(`[SKIP] ${folder}/RobloxStudioBeta.exe has already been patched`);
|
||||
return;
|
||||
}
|
||||
|
||||
const offset = findSignature(binary, SIGNATURE);
|
||||
if (offset === -1) {
|
||||
console.error(`[FAIL] Signature not found in ${exePath}/RobloxStudioBeta.exe`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Apply patch
|
||||
PATCH.copy(binary, offset);
|
||||
try {
|
||||
await fs.writeFile(exePath, binary);
|
||||
console.log(`[PATCHED] Patched ${exePath}/RobloxStudioBeta.exe`);
|
||||
} catch (err) {
|
||||
console.error(`[ERROR] Failed to write patched file:`, err);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const folders: string[] = [];
|
||||
|
||||
try {
|
||||
const entries = await fs.readdir(baseDir, { withFileTypes: true });
|
||||
for (const entry of entries) {
|
||||
if (entry.isDirectory()) {
|
||||
folders.push(path.join(baseDir, entry.name));
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`[ERROR] Failed to list folders in ${baseDir}:`, err);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`[INFO] Found ${folders.length} version folders.`);
|
||||
|
||||
const start = Date.now();
|
||||
await Promise.all(folders.map(patchFile));
|
||||
console.log(
|
||||
`[DONE] Patched internal Roblox Studio in ${Date.now() - start}ms`
|
||||
);
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in New Issue
Block a user