From 52978d0fa31509b66c1d1b2a4e1efe54a8721c20 Mon Sep 17 00:00:00 2001 From: alirouhani894 Date: Thu, 4 Jun 2026 17:22:56 +0330 Subject: [PATCH] feat(v7.1): Major UI upgrades to Tasks, Password manager, PDF tab + theme fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hey folks 👋 This is a pretty big one — v7.1 brings a lot of polish and new features to BlackInspect. Most of the changes come from the patch module we integrated, but here's what you'll actually notice: 🧩 Tasks & Notes tab – completely redone - Now has two separate sub-tabs: one for tasks (with due dates, priorities, labels) and another for sticky notes. - You can filter by due date (today, this week, overdue, none), priority (high/medium/low), and even custom labels. - Sorting works by creation date, due date, or priority. - The UI is card‑based and way cleaner. There's also a quick-add input plus an expanded form when you need more details. - Old data is migrated to new storage keys (`bi_tasks_v3`, `bi_notes_v3`), so nothing gets lost. 🔐 Password manager – now looks & feels like LastPass - Credentials are shown as nice cards with favicon emojis, copy buttons, and a show/hide toggle for passwords. - Add/edit form suggests your saved emails/usernames automatically. - Built‑in password generator with a strength meter and adjustable length/character sets. - Settings panel lets you set default password length, manage your autofill emails/usernames, and run auto‑detection on any page (fills password fields with a strong suggestion). - All passwords stored under `bi_creds_v3`. 📄 PDF tab – nicer interface - Drag & drop a PDF or enter a URL. - Four quick actions: extract text, extract tables, show metadata, check if password‑protected. - Shows a list of recent PDFs. - You can copy the extracted text or download it as a .txt file. 🛠️ Fake data section moved - The "Fake Data" (random name/email/phone) used to live in the Pass tab – it now lives in the Tools tab, because that makes more sense. 🎨 Theme bug fixed - The color themes (dark/light/red/green/purple/gold) used to break when you reopened the panel. That's gone now – `biFixColorTheme()` uses CSS custom properties and actually sticks. Everything else from the original BlackInspect is still there – spoofing, network tools, security scanners, etc. This is purely an upgrade for the UI and user experience. Cheers, Arad & team --- 📝 خلاصه برای برنامه‌نویسان فارسی‌زبان: - تب Tasks/Notes بازطراحی کامل (فیلتر، برچسب، اولویت، دو تب جداگانه). - تب Pass شبیه LastPass شده (پیشنهاد خودکار، تولید رمز با قدرت‌سنج، تنظیمات ذخیره ایمیل/یوزرنیم). - تب PDF بهبود (درگ اند دراپ، اکشن‌های متن/جدول/متادیتا/امنیت، فایل‌های اخیر). - Fake Data از Pass به Tools منتقل شد. - باگ تم رنگی با `biFixColorTheme` و CSS variables برطرف شد. - کلیدهای ذخیره‌سازی جدید: `bi_tasks_v3`, `bi_notes_v3`, `bi_creds_v3`. --- BlackInspector.js | 4123 ++++++++++----------------------------------- 1 file changed, 899 insertions(+), 3224 deletions(-) diff --git a/BlackInspector.js b/BlackInspector.js index 0da6914..78ed9b4 100644 --- a/BlackInspector.js +++ b/BlackInspector.js @@ -1,7 +1,7 @@ // ==UserScript== -// @name BlackInspect v7.0 +// @name BlackInspect v7.1 // @namespace http://tampermonkey.net/ -// @version 7.0.0 +// @version 7.1.0 // @description Full inspection & spoofing suite — redesigned UI, encrypted password vault, PDF popup, task manager, security scanner, font picker, and more. // @author AradPhpProgrammer // @match *://*/* @@ -19,3311 +19,986 @@ const D = document, W = unsafeWindow, N = navigator; - const BS = "bi_v7_panel"; + const BS = "bi_v8_panel"; let html2canvas = W.html2canvas; let pdfjsLib = null; let pdfCrackStop = false; const dk = (base) => `${base}_${location.hostname}`; const S = { - get ip() { - return GM_getValue("ip", ""); - }, - set ip(v) { - GM_setValue("ip", v); - }, - get ua() { - return GM_getValue("ua", ""); - }, - set ua(v) { - GM_setValue("ua", v); - }, - get platform() { - return GM_getValue("platform", ""); - }, - set platform(v) { - GM_setValue("platform", v); - }, - get language() { - return GM_getValue("lang", ""); - }, - set language(v) { - GM_setValue("lang", v); - }, - get spoofActive() { - return GM_getValue("spoofActive", false); - }, - set spoofActive(v) { - GM_setValue("spoofActive", v); - }, - get canvasSpoof() { - return GM_getValue("canvasSpoof", false); - }, - set canvasSpoof(v) { - GM_setValue("canvasSpoof", v); - }, - get breakOnStart() { - return GM_getValue(dk("bos"), false); - }, - set breakOnStart(v) { - GM_setValue(dk("bos"), v); - }, - get passwords() { - try { - return JSON.parse(GM_getValue("passwords", "[]")); - } catch (e) { - return []; - } - }, - set passwords(v) { - GM_setValue("passwords", JSON.stringify(v)); - }, - get todos() { - try { - return JSON.parse(GM_getValue("todos", "[]")); - } catch (e) { - return []; - } - }, - set todos(v) { - GM_setValue("todos", JSON.stringify(v)); - }, - get panelLeft() { - return GM_getValue("panelLeft", 10); - }, - set panelLeft(v) { - GM_setValue("panelLeft", v); - }, - get panelTop() { - return GM_getValue("panelTop", 10); - }, - set panelTop(v) { - GM_setValue("panelTop", v); - }, - get panelWidth() { - return GM_getValue("panelWidth", Math.min(W.innerWidth - 20, 940)); - }, - set panelWidth(v) { - GM_setValue("panelWidth", v); - }, - get panelHeight() { - return GM_getValue("panelHeight", Math.min(W.innerHeight - 20, 580)); - }, - set panelHeight(v) { - GM_setValue("panelHeight", v); - }, - get activeTab() { - return GM_getValue("activeTab", "Info"); - }, - set activeTab(v) { - GM_setValue("activeTab", v); - }, - get uiLang() { - return GM_getValue("langUI", "en"); - }, - set uiLang(v) { - GM_setValue("langUI", v); - }, - get kernelUrl() { - return GM_getValue("kernelUrl", "http://localhost:5000"); - }, - set kernelUrl(v) { - GM_setValue("kernelUrl", v); - }, - get panelOpacity() { - return parseFloat(GM_getValue("opacity", "1")); - }, - set panelOpacity(v) { - GM_setValue("opacity", String(v)); - }, - get fontSize() { - return parseInt(GM_getValue("fontSize", "13")); - }, - set fontSize(v) { - GM_setValue("fontSize", String(v)); - }, - get fontFamily() { - return GM_getValue("fontFamily", "IBM Plex Mono"); - }, - set fontFamily(v) { - GM_setValue("fontFamily", v); - }, - get tabVisSpoof() { - return GM_getValue("tabVisSpoof", false); - }, - set tabVisSpoof(v) { - GM_setValue("tabVisSpoof", v); - }, - get antiVM() { - return GM_getValue("antiVM", false); - }, - set antiVM(v) { - GM_setValue("antiVM", v); - }, - get hideExt() { - return GM_getValue("hideExt", false); - }, - set hideExt(v) { - GM_setValue("hideExt", v); - }, - get spoofBuildID() { - return GM_getValue("spoofBuildID", false); - }, - set spoofBuildID(v) { - GM_setValue("spoofBuildID", v); - }, - get authActive() { - return GM_getValue("authActive", false); - }, - set authActive(v) { - GM_setValue("authActive", v); - }, - get authHName() { - return GM_getValue("authHName", "Authorization"); - }, - set authHName(v) { - GM_setValue("authHName", v); - }, - get authHVal() { - return GM_getValue("authHVal", ""); - }, - set authHVal(v) { - GM_setValue("authHVal", v); - }, - get preventPre() { - return GM_getValue("preventPre", false); - }, - set preventPre(v) { - GM_setValue("preventPre", v); - }, - get customCtx() { - return GM_getValue("customCtx", false); - }, - set customCtx(v) { - GM_setValue("customCtx", v); - }, - get fillProfile() { - try { - return JSON.parse(GM_getValue("fillProfile", "{}")); - } catch (e) { - return {}; - } - }, - set fillProfile(v) { - GM_setValue("fillProfile", JSON.stringify(v)); - }, - get passFile() { - return GM_getValue("passFile", "passwords.json"); - }, - set passFile(v) { - GM_setValue("passFile", v); - }, - get profileFile() { - return GM_getValue("profileFile", "bi_profile.json"); - }, - set profileFile(v) { - GM_setValue("profileFile", v); - }, - get breakOptions() { - try { - return JSON.parse( - GM_getValue( - dk("brkOpts"), - '{"contextmenu":true,"copy":true,"paste":true,"selectstart":true,"dragstart":true,"mousedown":true}', - ), - ); - } catch (e) { - return { - contextmenu: true, - copy: true, - paste: true, - selectstart: true, - dragstart: true, - mousedown: true, - }; - } - }, - set breakOptions(v) { - GM_setValue(dk("brkOpts"), JSON.stringify(v)); - }, - get kernelOnline() { - return GM_getValue("kernelOnline", false); - }, - set kernelOnline(v) { - GM_setValue("kernelOnline", v); - }, + get ip() { return GM_getValue("ip", ""); }, + set ip(v) { GM_setValue("ip", v); }, + get ua() { return GM_getValue("ua", ""); }, + set ua(v) { GM_setValue("ua", v); }, + get platform() { return GM_getValue("platform", ""); }, + set platform(v) { GM_setValue("platform", v); }, + get language() { return GM_getValue("lang", ""); }, + set language(v) { GM_setValue("lang", v); }, + get spoofActive() { return GM_getValue("spoofActive", false); }, + set spoofActive(v) { GM_setValue("spoofActive", v); }, + get canvasSpoof() { return GM_getValue("canvasSpoof", false); }, + set canvasSpoof(v) { GM_setValue("canvasSpoof", v); }, + get breakOnStart() { return GM_getValue(dk("bos"), false); }, + set breakOnStart(v) { GM_setValue(dk("bos"), v); }, + get passwords() { try { return JSON.parse(GM_getValue("passwords", "[]")); } catch(e) { return []; } }, + set passwords(v) { GM_setValue("passwords", JSON.stringify(v)); }, + get todos() { try { return JSON.parse(GM_getValue("todos", "[]")); } catch(e) { return []; } }, + set todos(v) { GM_setValue("todos", JSON.stringify(v)); }, + get panelLeft() { return GM_getValue("panelLeft", 10); }, + set panelLeft(v) { GM_setValue("panelLeft", v); }, + get panelTop() { return GM_getValue("panelTop", 10); }, + set panelTop(v) { GM_setValue("panelTop", v); }, + get panelWidth() { return GM_getValue("panelWidth", Math.min(W.innerWidth - 20, 940)); }, + set panelWidth(v) { GM_setValue("panelWidth", v); }, + get panelHeight() { return GM_getValue("panelHeight", Math.min(W.innerHeight - 20, 580)); }, + set panelHeight(v) { GM_setValue("panelHeight", v); }, + get activeTab() { return GM_getValue("activeTab", "Info"); }, + set activeTab(v) { GM_setValue("activeTab", v); }, + get uiLang() { return GM_getValue("langUI", "en"); }, + set uiLang(v) { GM_setValue("langUI", v); }, + get kernelUrl() { return GM_getValue("kernelUrl", "http://localhost:5000"); }, + set kernelUrl(v) { GM_setValue("kernelUrl", v); }, + get panelOpacity() { return parseFloat(GM_getValue("opacity", "1")); }, + set panelOpacity(v) { GM_setValue("opacity", String(v)); }, + get fontSize() { return parseInt(GM_getValue("fontSize", "13")); }, + set fontSize(v) { GM_setValue("fontSize", String(v)); }, + get fontFamily() { return GM_getValue("fontFamily", "IBM Plex Mono"); }, + set fontFamily(v) { GM_setValue("fontFamily", v); }, + get tabVisSpoof() { return GM_getValue("tabVisSpoof", false); }, + set tabVisSpoof(v) { GM_setValue("tabVisSpoof", v); }, + get antiVM() { return GM_getValue("antiVM", false); }, + set antiVM(v) { GM_setValue("antiVM", v); }, + get hideExt() { return GM_getValue("hideExt", false); }, + set hideExt(v) { GM_setValue("hideExt", v); }, + get spoofBuildID() { return GM_getValue("spoofBuildID", false); }, + set spoofBuildID(v) { GM_setValue("spoofBuildID", v); }, + get authActive() { return GM_getValue("authActive", false); }, + set authActive(v) { GM_setValue("authActive", v); }, + get authHName() { return GM_getValue("authHName", "Authorization"); }, + set authHName(v) { GM_setValue("authHName", v); }, + get authHVal() { return GM_getValue("authHVal", ""); }, + set authHVal(v) { GM_setValue("authHVal", v); }, + get preventPre() { return GM_getValue("preventPre", false); }, + set preventPre(v) { GM_setValue("preventPre", v); }, + get customCtx() { return GM_getValue("customCtx", false); }, + set customCtx(v) { GM_setValue("customCtx", v); }, + get fillProfile() { try { return JSON.parse(GM_getValue("fillProfile", "{}")); } catch(e) { return {}; } }, + set fillProfile(v) { GM_setValue("fillProfile", JSON.stringify(v)); }, + get passFile() { return GM_getValue("passFile", "passwords.json"); }, + set passFile(v) { GM_setValue("passFile", v); }, + get profileFile() { return GM_getValue("profileFile", "bi_profile.json"); }, + set profileFile(v) { GM_setValue("profileFile", v); }, + get breakOptions() { try { return JSON.parse(GM_getValue(dk("brkOpts"), '{"contextmenu":true,"copy":true,"paste":true,"selectstart":true,"dragstart":true,"mousedown":true}')); } catch(e) { return { contextmenu: true, copy: true, paste: true, selectstart: true, dragstart: true, mousedown: true }; } }, + set breakOptions(v) { GM_setValue(dk("brkOpts"), JSON.stringify(v)); }, + get kernelOnline() { return GM_getValue("kernelOnline", false); }, + set kernelOnline(v) { GM_setValue("kernelOnline", v); }, }; const TRANS = { - Info: { en: "Info", fa: "اطلاعات" }, - Vars: { en: "Vars", fa: "متغیرها" }, - Inject: { en: "Inject", fa: "تزریق" }, - Spoof: { en: "Spoof", fa: "جعل" }, - Pass: { en: "Pass", fa: "رمزها" }, - Storage: { en: "Storage", fa: "ذخیره‌سازی" }, - Tools: { en: "Tools", fa: "ابزارها" }, - DOM: { en: "DOM", fa: "DOM" }, - Network: { en: "Network", fa: "شبکه" }, - Security: { en: "Security", fa: "امنیت" }, - PDF: { en: "PDF", fa: "PDF" }, - Tasks: { en: "Tasks", fa: "وظایف" }, - Settings: { en: "Settings", fa: "تنظیمات" }, - "Filter...": { en: "Filter...", fa: "فیلتر..." }, - Save: { en: "Save", fa: "ذخیره" }, - Delete: { en: "Delete", fa: "حذف" }, - Edit: { en: "Edit", fa: "ویرایش" }, - Cancel: { en: "Cancel", fa: "انصراف" }, - Add: { en: "Add", fa: "افزودن" }, - Export: { en: "Export", fa: "خروجی" }, - Import: { en: "Import", fa: "وارد کردن" }, - Generate: { en: "Generate", fa: "تولید" }, - Scan: { en: "Scan", fa: "اسکن" }, - Stop: { en: "Stop", fa: "توقف" }, - Start: { en: "Start", fa: "شروع" }, - Apply: { en: "Apply", fa: "اعمال" }, - Reset: { en: "Reset", fa: "بازنشانی" }, - Copy: { en: "Copy", fa: "کپی" }, - Open: { en: "Open", fa: "باز کردن" }, - Close: { en: "Close", fa: "بستن" }, - "Loading...": { en: "Loading...", fa: "در حال بارگذاری..." }, - Error: { en: "Error", fa: "خطا" }, - "No data": { en: "No data", fa: "داده‌ای نیست" }, - "Start Spoofing": { en: "Start Spoofing", fa: "شروع جعل" }, - "Stop Spoofing": { en: "Stop Spoofing", fa: "توقف جعل" }, - "Spoofing active": { en: "Spoofing active", fa: "جعل فعال است" }, - "Fake IP": { en: "Fake IP (X-Forwarded-For)", fa: "IP جعلی" }, - "User-Agent": { en: "User-Agent", fa: "User-Agent" }, - Platform: { en: "Platform", fa: "سیستم‌عامل" }, - Language: { en: "Language", fa: "زبان" }, - "Break on load": { - en: "Break on load", - fa: "شکستن محدودیت‌ها هنگام بارگذاری", - }, - "Canvas Spoof": { - en: "Canvas Fingerprint Spoof", - fa: "جعل اثر انگشت Canvas", - }, - "Tab Visibility": { en: "Tab Visibility Spoof", fa: "جعل نمایان بودن تب" }, - "Anti-VM": { en: "Anti-VM Detection", fa: "جلوگیری از تشخیص VM" }, - "Hide Extensions": { - en: "Hide Browser Extensions", - fa: "مخفی‌سازی افزونه‌ها", - }, - "Spoof BuildID": { - en: "Spoof Firefox BuildID", - fa: "جعل BuildID فایرفاکس", - }, - "Password Generator": { en: "Password Generator", fa: "تولید رمز عبور" }, - Length: { en: "Length", fa: "طول" }, - Numbers: { en: "Numbers", fa: "اعداد" }, - Uppercase: { en: "Uppercase", fa: "حروف بزرگ" }, - Lowercase: { en: "Lowercase", fa: "حروف کوچک" }, - Letters: { en: "Letters", fa: "حروف" }, - "Special Chars": { en: "Special Chars", fa: "کاراکترهای خاص" }, - "Generated password": { en: "Generated password", fa: "رمز تولیدشده" }, - "Use Password": { en: "Use Password", fa: "استفاده از رمز" }, - "Saved Passwords": { en: "Saved Passwords", fa: "رمزهای ذخیره‌شده" }, - Username: { en: "Username / Email", fa: "نام کاربری / ایمیل" }, - "No passwords saved": { - en: "No passwords saved yet.", - fa: "هنوز رمزی ذخیره نشده.", - }, - "Password saved": { en: "Password saved!", fa: "رمز ذخیره شد!" }, - "Save password?": { en: "Save password?", fa: "رمز ذخیره شود؟" }, - "Yes, Save": { en: "Yes, Save", fa: "بله، ذخیره کن" }, - "Load PDF": { en: "Load PDF File", fa: "بارگذاری فایل PDF" }, - "PDF URL": { en: "PDF URL", fa: "آدرس PDF" }, - "PDF Password": { en: "PDF Password (optional)", fa: "رمز PDF (اختیاری)" }, - "Crack Password": { en: "Crack Password", fa: "شکستن رمز PDF" }, - "Common Passwords": { en: "Common Passwords", fa: "رمزهای رایج" }, - "Custom Wordlist": { en: "Custom Wordlist", fa: "لیست کلمات دلخواه" }, - "Digit Range": { en: "Digit Range", fa: "محدوده عددی" }, - "Found! Password": { en: "Found! Password", fa: "یافت شد! رمز" }, - "Not found": { en: "Not found in list.", fa: "در لیست پیدا نشد." }, - Trying: { en: "Trying", fa: "در حال امتحان" }, - "Add Task": { en: "Add Task", fa: "وظیفه جدید" }, - "Add Note": { en: "Add Note", fa: "یادداشت جدید" }, - "Task desc": { en: "Description...", fa: "توضیحات..." }, - "Due date": { en: "Due date", fa: "موعد مقرر" }, - "Notify in mins": { en: "Notify in (minutes)", fa: "اعلان بعد از (دقیقه)" }, - Priority: { en: "Priority", fa: "اولویت" }, - Low: { en: "Low", fa: "پایین" }, - Medium: { en: "Medium", fa: "متوسط" }, - High: { en: "High", fa: "بالا" }, - "No priority": { en: "No priority", fa: "بدون اولویت" }, - "No tasks": { - en: "No tasks yet — add one above!", - fa: "هنوز وظیفه‌ای ثبت نشده!", - }, - "No notes": { - en: "No notes yet — write one above!", - fa: "هنوز یادداشتی نیست!", - }, - "Show done": { en: "Show completed", fa: "نمایش انجام‌شده‌ها" }, - "Clear done": { en: "Clear completed", fa: "حذف انجام‌شده‌ها" }, - "Delete all": { en: "Delete all", fa: "حذف همه" }, - "Search tasks": { en: "Search tasks...", fa: "جستجو در وظایف..." }, - "Search notes": { en: "Search notes...", fa: "جستجو در یادداشت‌ها..." }, - "Sort by": { en: "Sort by", fa: "مرتب‌سازی بر اساس" }, - Created: { en: "Created", fa: "تاریخ ساخت" }, - Due: { en: "Due date", fa: "موعد مقرر" }, - Title: { en: "Title", fa: "عنوان" }, - "XSS Scanner": { en: "XSS Scanner", fa: "اسکنر XSS" }, - "SQLi Scanner": { en: "SQLi Scanner", fa: "اسکنر SQLi" }, - Clickjacking: { en: "Clickjacking Check", fa: "بررسی Clickjacking" }, - "HTML Injection": { en: "HTML Injection", fa: "تزریق HTML" }, - "XXE Payloads": { en: "XXE Payloads", fa: "بارهای XXE" }, - "SSRF Payloads": { en: "SSRF Payloads", fa: "بارهای SSRF" }, - "Subdomain Takeover": { en: "Subdomain Takeover", fa: "تصاحب زیردامنه" }, - "Directory BF": { en: "Directory BruteForce", fa: "جستجوی مسیر" }, - "XSS Inject": { en: "XSS Inject (Debug)", fa: "تزریق XSS (دیباگ)" }, - Vulnerable: { en: "⚠ VULNERABLE", fa: "⚠ آسیب‌پذیر" }, - Protected: { en: "✅ PROTECTED", fa: "✅ محافظت شده" }, - "No params": { en: "No URL params found.", fa: "پارامتر URL یافت نشد." }, - "Auth Injection": { - en: "Auth Header Injection", - fa: "تزریق هدر احراز هویت", - }, - "Prevent Preflight": { - en: "Prevent Preflight", - fa: "جلوگیری از Preflight", - }, - "SSL Headers": { en: "SSL/TLS Security Headers", fa: "هدرهای امنیتی SSL" }, - "Header Name": { en: "Header Name", fa: "نام هدر" }, - "Token Value": { en: "Token / Value", fa: "توکن / مقدار" }, - Cookies: { en: "Cookies", fa: "کوکی‌ها" }, - LocalStorage: { en: "LocalStorage", fa: "LocalStorage" }, - SessionStorage: { en: "SessionStorage", fa: "SessionStorage" }, - "Set Cookie": { en: "Set Cookie", fa: "تنظیم کوکی" }, - "No cookies": { en: "No cookies", fa: "کوکی‌ای وجود ندارد" }, - "Break Restrictions": { en: "Break Restrictions", fa: "شکستن محدودیت‌ها" }, - "Restore Restrictions": { - en: "Restore Restrictions", - fa: "بازگرداندن محدودیت‌ها", - }, - "Download Page": { en: "Download Full Page", fa: "دانلود کامل صفحه" }, - "Copy Text": { en: "Copy All Text", fa: "کپی همه متن" }, - Screenshot: { en: "Full Page Screenshot", fa: "عکس کامل صفحه" }, - "Show Passwords": { en: "Reveal Password Fields", fa: "نمایش فیلدهای رمز" }, - "Split AI": { en: "Split View with AI", fa: "نمای دوگانه با هوش مصنوعی" }, - "UI Language": { en: "UI Language", fa: "زبان رابط" }, - "Font Size": { en: "Font Size", fa: "اندازه فونت" }, - "Font Family": { en: "Font Family", fa: "فونت" }, - "Panel Opacity": { en: "Panel Opacity", fa: "شفافیت پنل" }, - "Kernel URL": { en: "Kernel URL", fa: "آدرس Kernel" }, - "Test Kernel": { en: "Test Kernel", fa: "تست Kernel" }, - "Kernel online": { en: "✅ Kernel is online!", fa: "✅ Kernel فعال است!" }, - "Kernel offline": { - en: "❌ Kernel offline — passwords stored locally.", - fa: "❌ Kernel آفلاین — رمزها به‌صورت محلی ذخیره می‌شوند.", - }, - "Custom Right-Click": { - en: "Custom Right-Click Menu", - fa: "منوی کلیک راست سفارشی", - }, - "Reset Position": { - en: "Reset Panel Position (Ctrl+Z)", - fa: "بازنشانی موقعیت پنل (Ctrl+Z)", - }, - "Form Profile": { en: "Form Auto-Fill Profile", fa: "پروفایل پرکردن فرم" }, - "Full Name": { en: "Full Name", fa: "نام کامل" }, - Email: { en: "Email", fa: "ایمیل" }, - Phone: { en: "Phone", fa: "تلفن" }, - Address: { en: "Address", fa: "آدرس" }, - Birthday: { en: "Birthday", fa: "تاریخ تولد" }, - "Save Profile": { en: "Save Profile", fa: "ذخیره پروفایل" }, - "Fill Forms": { en: "Fill Page Forms", fa: "پر کردن فرم‌های صفحه" }, - "Profile saved": { en: "Profile saved.", fa: "پروفایل ذخیره شد." }, + Info: { en: "Info", fa: "اطلاعات" }, Vars: { en: "Vars", fa: "متغیرها" }, Inject: { en: "Inject", fa: "تزریق" }, + Spoof: { en: "Spoof", fa: "جعل" }, Pass: { en: "Pass", fa: "رمزها" }, Storage: { en: "Storage", fa: "ذخیره‌سازی" }, + Tools: { en: "Tools", fa: "ابزارها" }, DOM: { en: "DOM", fa: "DOM" }, Network: { en: "Network", fa: "شبکه" }, + Security: { en: "Security", fa: "امنیت" }, PDF: { en: "PDF", fa: "PDF" }, Tasks: { en: "Tasks", fa: "وظایف" }, + Settings: { en: "Settings", fa: "تنظیمات" }, "Filter...": { en: "Filter...", fa: "فیلتر..." }, Save: { en: "Save", fa: "ذخیره" }, + Delete: { en: "Delete", fa: "حذف" }, Edit: { en: "Edit", fa: "ویرایش" }, Cancel: { en: "Cancel", fa: "انصراف" }, + Add: { en: "Add", fa: "افزودن" }, Export: { en: "Export", fa: "خروجی" }, Import: { en: "Import", fa: "وارد کردن" }, + Generate: { en: "Generate", fa: "تولید" }, Scan: { en: "Scan", fa: "اسکن" }, Stop: { en: "Stop", fa: "توقف" }, + Start: { en: "Start", fa: "شروع" }, Apply: { en: "Apply", fa: "اعمال" }, Reset: { en: "Reset", fa: "بازنشانی" }, + Copy: { en: "Copy", fa: "کپی" }, Open: { en: "Open", fa: "باز کردن" }, Close: { en: "Close", fa: "بستن" }, + "Loading...": { en: "Loading...", fa: "در حال بارگذاری..." }, Error: { en: "Error", fa: "خطا" }, "No data": { en: "No data", fa: "داده‌ای نیست" }, + "Start Spoofing": { en: "Start Spoofing", fa: "شروع جعل" }, "Stop Spoofing": { en: "Stop Spoofing", fa: "توقف جعل" }, + "Spoofing active": { en: "Spoofing active", fa: "جعل فعال است" }, "Fake IP": { en: "Fake IP (X-Forwarded-For)", fa: "IP جعلی" }, + "User-Agent": { en: "User-Agent", fa: "User-Agent" }, Platform: { en: "Platform", fa: "سیستم‌عامل" }, Language: { en: "Language", fa: "زبان" }, + "Break on load": { en: "Break on load", fa: "شکستن محدودیت‌ها هنگام بارگذاری" }, "Canvas Spoof": { en: "Canvas Fingerprint Spoof", fa: "جعل اثر انگشت Canvas" }, + "Tab Visibility": { en: "Tab Visibility Spoof", fa: "جعل نمایان بودن تب" }, "Anti-VM": { en: "Anti-VM Detection", fa: "جلوگیری از تشخیص VM" }, + "Hide Extensions": { en: "Hide Browser Extensions", fa: "مخفی‌سازی افزونه‌ها" }, "Spoof BuildID": { en: "Spoof Firefox BuildID", fa: "جعل BuildID فایرفاکس" }, + "Password Generator": { en: "Password Generator", fa: "تولید رمز عبور" }, Length: { en: "Length", fa: "طول" }, + Numbers: { en: "Numbers", fa: "اعداد" }, Uppercase: { en: "Uppercase", fa: "حروف بزرگ" }, Lowercase: { en: "Lowercase", fa: "حروف کوچک" }, + Letters: { en: "Letters", fa: "حروف" }, "Special Chars": { en: "Special Chars", fa: "کاراکترهای خاص" }, "Generated password": { en: "Generated password", fa: "رمز تولیدشده" }, + "Use Password": { en: "Use Password", fa: "استفاده از رمز" }, "Saved Passwords": { en: "Saved Passwords", fa: "رمزهای ذخیره‌شده" }, + Username: { en: "Username / Email", fa: "نام کاربری / ایمیل" }, "No passwords saved": { en: "No passwords saved yet.", fa: "هنوز رمزی ذخیره نشده." }, + "Password saved": { en: "Password saved!", fa: "رمز ذخیره شد!" }, "Save password?": { en: "Save password?", fa: "رمز ذخیره شود؟" }, + "Yes, Save": { en: "Yes, Save", fa: "بله، ذخیره کن" }, "Load PDF": { en: "Load PDF File", fa: "بارگذاری فایل PDF" }, + "PDF URL": { en: "PDF URL", fa: "آدرس PDF" }, "PDF Password": { en: "PDF Password (optional)", fa: "رمز PDF (اختیاری)" }, + "Crack Password": { en: "Crack Password", fa: "شکستن رمز PDF" }, "Common Passwords": { en: "Common Passwords", fa: "رمزهای رایج" }, + "Custom Wordlist": { en: "Custom Wordlist", fa: "لیست کلمات دلخواه" }, "Digit Range": { en: "Digit Range", fa: "محدوده عددی" }, + "Found! Password": { en: "Found! Password", fa: "یافت شد! رمز" }, "Not found": { en: "Not found in list.", fa: "در لیست پیدا نشد." }, + Trying: { en: "Trying", fa: "در حال امتحان" }, "Add Task": { en: "Add Task", fa: "وظیفه جدید" }, "Add Note": { en: "Add Note", fa: "یادداشت جدید" }, + "Task desc": { en: "Description...", fa: "توضیحات..." }, "Due date": { en: "Due date", fa: "موعد مقرر" }, + "Notify in mins": { en: "Notify in (minutes)", fa: "اعلان بعد از (دقیقه)" }, Priority: { en: "Priority", fa: "اولویت" }, + Low: { en: "Low", fa: "پایین" }, Medium: { en: "Medium", fa: "متوسط" }, High: { en: "High", fa: "بالا" }, + "No priority": { en: "No priority", fa: "بدون اولویت" }, "No tasks": { en: "No tasks yet — add one above!", fa: "هنوز وظیفه‌ای ثبت نشده!" }, + "No notes": { en: "No notes yet — write one above!", fa: "هنوز یادداشتی نیست!" }, "Show done": { en: "Show completed", fa: "نمایش انجام‌شده‌ها" }, + "Clear done": { en: "Clear completed", fa: "حذف انجام‌شده‌ها" }, "Delete all": { en: "Delete all", fa: "حذف همه" }, + "Search tasks": { en: "Search tasks...", fa: "جستجو در وظایف..." }, "Search notes": { en: "Search notes...", fa: "جستجو در یادداشت‌ها..." }, + "Sort by": { en: "Sort by", fa: "مرتب‌سازی بر اساس" }, Created: { en: "Created", fa: "تاریخ ساخت" }, Due: { en: "Due date", fa: "موعد مقرر" }, + Title: { en: "Title", fa: "عنوان" }, "XSS Scanner": { en: "XSS Scanner", fa: "اسکنر XSS" }, "SQLi Scanner": { en: "SQLi Scanner", fa: "اسکنر SQLi" }, + Clickjacking: { en: "Clickjacking Check", fa: "بررسی Clickjacking" }, "HTML Injection": { en: "HTML Injection", fa: "تزریق HTML" }, + "XXE Payloads": { en: "XXE Payloads", fa: "بارهای XXE" }, "SSRF Payloads": { en: "SSRF Payloads", fa: "بارهای SSRF" }, + "Subdomain Takeover": { en: "Subdomain Takeover", fa: "تصاحب زیردامنه" }, "Directory BF": { en: "Directory BruteForce", fa: "جستجوی مسیر" }, + "XSS Inject": { en: "XSS Inject (Debug)", fa: "تزریق XSS (دیباگ)" }, Vulnerable: { en: "⚠ VULNERABLE", fa: "⚠ آسیب‌پذیر" }, + Protected: { en: "✅ PROTECTED", fa: "✅ محافظت شده" }, "No params": { en: "No URL params found.", fa: "پارامتر URL یافت نشد." }, + "Auth Injection": { en: "Auth Header Injection", fa: "تزریق هدر احراز هویت" }, "Prevent Preflight": { en: "Prevent Preflight", fa: "جلوگیری از Preflight" }, + "SSL Headers": { en: "SSL/TLS Security Headers", fa: "هدرهای امنیتی SSL" }, "Header Name": { en: "Header Name", fa: "نام هدر" }, + "Token Value": { en: "Token / Value", fa: "توکن / مقدار" }, Cookies: { en: "Cookies", fa: "کوکی‌ها" }, + LocalStorage: { en: "LocalStorage", fa: "LocalStorage" }, SessionStorage: { en: "SessionStorage", fa: "SessionStorage" }, + "Set Cookie": { en: "Set Cookie", fa: "تنظیم کوکی" }, "No cookies": { en: "No cookies", fa: "کوکی‌ای وجود ندارد" }, + "Break Restrictions": { en: "Break Restrictions", fa: "شکستن محدودیت‌ها" }, "Restore Restrictions": { en: "Restore Restrictions", fa: "بازگرداندن محدودیت‌ها" }, + "Download Page": { en: "Download Full Page", fa: "دانلود کامل صفحه" }, "Copy Text": { en: "Copy All Text", fa: "کپی همه متن" }, + Screenshot: { en: "Full Page Screenshot", fa: "عکس کامل صفحه" }, "Show Passwords": { en: "Reveal Password Fields", fa: "نمایش فیلدهای رمز" }, + "Split AI": { en: "Split View with AI", fa: "نمای دوگانه با هوش مصنوعی" }, "UI Language": { en: "UI Language", fa: "زبان رابط" }, + "Font Size": { en: "Font Size", fa: "اندازه فونت" }, "Font Family": { en: "Font Family", fa: "فونت" }, + "Panel Opacity": { en: "Panel Opacity", fa: "شفافیت پنل" }, "Kernel URL": { en: "Kernel URL", fa: "آدرس Kernel" }, + "Test Kernel": { en: "Test Kernel", fa: "تست Kernel" }, "Kernel online": { en: "✅ Kernel is online!", fa: "✅ Kernel فعال است!" }, + "Kernel offline": { en: "❌ Kernel offline — passwords stored locally.", fa: "❌ Kernel آفلاین — رمزها به‌صورت محلی ذخیره می‌شوند." }, + "Custom Right-Click": { en: "Custom Right-Click Menu", fa: "منوی کلیک راست سفارشی" }, "Reset Position": { en: "Reset Panel Position (Ctrl+Z)", fa: "بازنشانی موقعیت پنل (Ctrl+Z)" }, + "Form Profile": { en: "Form Auto-Fill Profile", fa: "پروفایل پرکردن فرم" }, "Full Name": { en: "Full Name", fa: "نام کامل" }, + Email: { en: "Email", fa: "ایمیل" }, Phone: { en: "Phone", fa: "تلفن" }, Address: { en: "Address", fa: "آدرس" }, + Birthday: { en: "Birthday", fa: "تاریخ تولد" }, "Save Profile": { en: "Save Profile", fa: "ذخیره پروفایل" }, + "Fill Forms": { en: "Fill Page Forms", fa: "پر کردن فرم‌های صفحه" }, "Profile saved": { en: "Profile saved.", fa: "پروفایل ذخیره شد." }, }; - const T = (key) => { - const e = TRANS[key]; - if (!e) return key; - return e[S.uiLang] || e["en"] || key; - }; + const T = (key) => { const e = TRANS[key]; if (!e) return key; return e[S.uiLang] || e["en"] || key; }; const FONTS = [ - { - name: "IBM Plex Mono", - url: "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap", - }, - { - name: "Vazirmatn", - url: "https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css", - }, - { - name: "Fira Code", - url: "https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;600&display=swap", - }, - { - name: "JetBrains Mono", - url: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap", - }, - { - name: "Space Mono", - url: "https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&display=swap", - }, - { - name: "Courier Prime", - url: "https://fonts.googleapis.com/css2?family=Courier+Prime:wght@400;700&display=swap", - }, + { name: "IBM Plex Mono", url: "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&display=swap" }, + { name: "Vazirmatn", url: "https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css" }, + { name: "Fira Code", url: "https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;600&display=swap" }, + { name: "JetBrains Mono", url: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap" }, + { name: "Space Mono", url: "https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&display=swap" }, + { name: "Courier Prime", url: "https://fonts.googleapis.com/css2?family=Courier+Prime:wght@400;700&display=swap" }, ]; - function loadFont(fontName) { - const f = FONTS.find((x) => x.name === fontName); - if (!f) return; - const id = "bi-font-" + fontName.replace(/\s/g, "_"); - if (!D.getElementById(id)) { - const lnk = D.createElement("link"); - lnk.id = id; - lnk.rel = "stylesheet"; - lnk.href = f.url; - D.head.appendChild(lnk); - } - } - - function applyFont() { - loadFont(S.fontFamily); - const st = D.getElementById("bi-font-style"); - if (st) - st.textContent = `#${BS},#${BS} *{font-family:'${S.fontFamily}',Consolas,monospace!important;font-size:${S.fontSize}px!important;}`; - } + function loadFont(fontName) { const f = FONTS.find(x=>x.name===fontName); if(!f)return; const id="bi-font-"+fontName.replace(/\s/g,"_"); if(!D.getElementById(id)){ const lnk=D.createElement("link"); lnk.id=id; lnk.rel="stylesheet"; lnk.href=f.url; D.head.appendChild(lnk); } } + function applyFont() { loadFont(S.fontFamily); const st=D.getElementById("bi-font-style"); if(st) st.textContent=`#${BS},#${BS} *{font-family:'${S.fontFamily}',Consolas,monospace!important;font-size:${S.fontSize}px!important;}`; } let panel = null; let restrictionsBroken = false; let dirScanStop = false; let saveDirectoryHandle = null; - let fpsRafId = null, - fpsCount = 0, - fpsLastTime = performance.now(), - currentFps = 0; + let fpsRafId = null, fpsCount = 0, fpsLastTime = performance.now(), currentFps = 0; (function earlyApply() { - if (S.spoofActive) applySpoofing(S.ip, S.ua, S.platform, S.language); - if (S.canvasSpoof) applyCanvasSpoof(); - if (S.tabVisSpoof) applyTabVisSpoof(); - if (S.hideExt) applyHideExt(); - if (S.spoofBuildID) applyBuildIDSpoof(); - if (S.antiVM) applyAntiVM(); - if (S.authActive) applyAuthInjection(); - if (S.preventPre) applyPreflightPrevention(); - if (S.breakOnStart) { - breakRestrictions(S.breakOptions); - restrictionsBroken = true; - } - FONTS.forEach((f) => loadFont(f.name)); + if(S.spoofActive) applySpoofing(S.ip, S.ua, S.platform, S.language); + if(S.canvasSpoof) applyCanvasSpoof(); + if(S.tabVisSpoof) applyTabVisSpoof(); + if(S.hideExt) applyHideExt(); + if(S.spoofBuildID) applyBuildIDSpoof(); + if(S.antiVM) applyAntiVM(); + if(S.authActive) applyAuthInjection(); + if(S.preventPre) applyPreflightPrevention(); + if(S.breakOnStart) { breakRestrictions(S.breakOptions); restrictionsBroken = true; } + FONTS.forEach(f=>loadFont(f.name)); startFPS(); checkKernelSilent(); })(); - function applySpoofing(ip, ua, plat, lang) { - const origFetch = W.fetch, - origXHR = W.XMLHttpRequest; - W.fetch = function (...args) { - let [resource, options = {}] = args; - const headers = new Headers( - options.headers || - (resource instanceof Request ? resource.headers : {}), - ); - if (ip) headers.set("X-Forwarded-For", ip); - if (ua) headers.set("User-Agent", ua); - if (resource instanceof Request) - resource = new Request(resource, { ...options, headers }); - else options = { ...options, headers }; - return origFetch.call(this, resource, options); - }; - W.XMLHttpRequest = class extends origXHR { - open(...a) { - this._bi_open = true; - return super.open(...a); - } - send(...a) { - if (this._bi_open) { - if (ip) this.setRequestHeader("X-Forwarded-For", ip); - if (ua) this.setRequestHeader("User-Agent", ua); - } - return super.send(...a); - } - }; - if (ua) - try { - Object.defineProperty(N, "userAgent", { - get: () => ua, - configurable: true, - }); - } catch (e) {} - if (plat) - try { - Object.defineProperty(N, "platform", { - get: () => plat, - configurable: true, - }); - } catch (e) {} - if (lang) - try { - Object.defineProperty(N, "language", { - get: () => lang, - configurable: true, - }); - } catch (e) {} - } - - function applyCanvasSpoof() { - try { - const orig = HTMLCanvasElement.prototype.getContext; - HTMLCanvasElement.prototype.getContext = function () { - const ctx = orig.apply(this, arguments); - if (ctx && arguments[0] === "2d") { - const origGID = ctx.getImageData.bind(ctx); - ctx.getImageData = function (x, y, w, h) { - const d = origGID(x, y, w, h); - const n = new Uint8Array(d.data.length); - crypto.getRandomValues(n); - for (let i = 0; i < d.data.length; i += 4) { - d.data[i] = Math.max( - 0, - Math.min(255, d.data[i] + ((n[i] % 3) - 1)), - ); - d.data[i + 1] = Math.max( - 0, - Math.min(255, d.data[i + 1] + ((n[i + 1] % 3) - 1)), - ); - d.data[i + 2] = Math.max( - 0, - Math.min(255, d.data[i + 2] + ((n[i + 2] % 3) - 1)), - ); - } - return d; - }; - } - return ctx; - }; - } catch (e) {} - } - - function applyTabVisSpoof() { - try { - Object.defineProperty(D, "hidden", { - get: () => false, - configurable: true, - }); - Object.defineProperty(D, "visibilityState", { - get: () => "visible", - configurable: true, - }); - D.addEventListener( - "visibilitychange", - (e) => { - e.stopImmediatePropagation(); - }, - true, - ); - W.addEventListener( - "blur", - (e) => { - e.stopImmediatePropagation(); - }, - true, - ); - } catch (e) {} + function applySpoofing(ip,ua,plat,lang) { + const origFetch=W.fetch, origXHR=W.XMLHttpRequest; + W.fetch = function(...args) { let [resource, options={}] = args; const headers=new Headers(options.headers||(resource instanceof Request?resource.headers:{})); if(ip) headers.set("X-Forwarded-For",ip); if(ua) headers.set("User-Agent",ua); if(resource instanceof Request) resource=new Request(resource,{...options,headers}); else options={...options,headers}; return origFetch.call(this,resource,options); }; + W.XMLHttpRequest = class extends origXHR { open(...a){ this._bi_open=true; return super.open(...a); } send(...a){ if(this._bi_open){ if(ip) this.setRequestHeader("X-Forwarded-For",ip); if(ua) this.setRequestHeader("User-Agent",ua); } return super.send(...a); } }; + if(ua) try{ Object.defineProperty(N,"userAgent",{get:()=>ua,configurable:true}); }catch(e){} + if(plat) try{ Object.defineProperty(N,"platform",{get:()=>plat,configurable:true}); }catch(e){} + if(lang) try{ Object.defineProperty(N,"language",{get:()=>lang,configurable:true}); }catch(e){} } + function applyCanvasSpoof() { try{ const orig=HTMLCanvasElement.prototype.getContext; HTMLCanvasElement.prototype.getContext=function(){ const ctx=orig.apply(this,arguments); if(ctx && arguments[0]==="2d"){ const origGID=ctx.getImageData.bind(ctx); ctx.getImageData=function(x,y,w,h){ const d=origGID(x,y,w,h); const n=new Uint8Array(d.data.length); crypto.getRandomValues(n); for(let i=0;ifalse,configurable:true}); Object.defineProperty(D,"visibilityState",{get:()=>"visible",configurable:true}); D.addEventListener("visibilitychange",(e)=>e.stopImmediatePropagation(),true); W.addEventListener("blur",(e)=>e.stopImmediatePropagation(),true); }catch(e){} } + function applyHideExt() { try{ const fp=[]; Object.defineProperty(fp,"item",{value:()=>null}); Object.defineProperty(fp,"namedItem",{value:()=>null}); Object.defineProperty(fp,"refresh",{value:()=>{}}); Object.defineProperty(N,"plugins",{get:()=>fp,configurable:true}); Object.defineProperty(N,"mimeTypes",{get:()=>[],configurable:true}); }catch(e){} } + function applyBuildIDSpoof() { try{ if("buildID" in N) Object.defineProperty(N,"buildID",{get:()=>"20181001000000",configurable:true}); }catch(e){} } + function applyAntiVM() { try{ Object.defineProperty(N,"hardwareConcurrency",{get:()=>8,configurable:true}); Object.defineProperty(N,"deviceMemory",{get:()=>8,configurable:true}); Object.defineProperty(screen,"width",{get:()=>1920,configurable:true}); Object.defineProperty(screen,"height",{get:()=>1080,configurable:true}); Object.defineProperty(screen,"availWidth",{get:()=>1920,configurable:true}); Object.defineProperty(screen,"availHeight",{get:()=>1040,configurable:true}); Object.defineProperty(screen,"colorDepth",{get:()=>24,configurable:true}); const origGP=WebGLRenderingContext.prototype.getParameter; WebGLRenderingContext.prototype.getParameter=function(p){ if(p===37445) return "Intel Inc."; if(p===37446) return "Intel Iris OpenGL Engine"; return origGP.call(this,p); }; }catch(e){} } + function applyAuthInjection() { if(!S.authActive||!S.authHVal) return; const hn=S.authHName||"Authorization", hv=S.authHVal; const oF=W.fetch; W.fetch=function(...args){ let [r,o={}]=args; const h=new Headers(o.headers||(r instanceof Request?r.headers:{})); h.set(hn,hv); if(r instanceof Request) r=new Request(r,{...o,headers:h}); else o={...o,headers:h}; return oF.call(this,r,o); }; const OX=W.XMLHttpRequest; W.XMLHttpRequest=class extends OX{ open(...a){ this._bio=true; return super.open(...a); } send(...a){ if(this._bio) this.setRequestHeader(hn,hv); return super.send(...a); } }; } + function applyPreflightPrevention() { if(!S.preventPre) return; const oF=W.fetch; W.fetch=function(r,o={}){ const h=new Headers(o.headers||{}); const ct=h.get("content-type")||""; if(!["application/x-www-form-urlencoded","multipart/form-data","text/plain"].some(t=>ct.startsWith(t))) h.set("content-type","text/plain"); for(const k of [...h.keys()]) if(!["accept","accept-language","content-language","content-type"].includes(k.toLowerCase())) h.delete(k); return oF.call(this,r,{...o,headers:h}); }; } + function breakRestrictions(opts) { const o=opts||S.breakOptions; if(o.contextmenu){ D.oncontextmenu=null; if(D.body) D.body.oncontextmenu=null; W.oncontextmenu=null; } if(o.selectstart||o.copy){ const s=D.createElement("style"); s.id="bi-break-style"; if(o.selectstart) s.textContent+="*,*::before,*::after{user-select:auto!important;-webkit-user-select:auto!important;pointer-events:auto!important}"; if(!D.getElementById("bi-break-style")) D.head && D.head.appendChild(s); D.querySelectorAll('[style*="pointer-events:none"]').forEach(el=>el.style.pointerEvents="auto"); } ["copy","cut","paste","selectstart","contextmenu","dragstart","mousedown"].forEach(ev=>{ if(o[ev]){ D.addEventListener(ev,(e)=>{ e.stopImmediatePropagation(); e.stopPropagation(); Object.defineProperty(e,"preventDefault",{value:()=>{}}); },true); W.addEventListener(ev,(e)=>{ e.stopImmediatePropagation(); e.stopPropagation(); Object.defineProperty(e,"preventDefault",{value:()=>{}}); },true); } }); if(o.copy){ D.addEventListener("copy",(e)=>{ e.stopImmediatePropagation(); const sel=getSelection().toString(); if(sel && e.clipboardData){ e.clipboardData.setData("text/plain",sel); e.preventDefault(); } },true); } D.querySelectorAll("[oncopy],[oncut],[onpaste],[oncontextmenu],[onselectstart]").forEach(el=>{ el.oncopy=el.oncut=el.onpaste=el.oncontextmenu=el.onselectstart=null; }); } + function startFPS() { fpsCount=0; fpsLastTime=performance.now(); function frame(){ fpsCount++; const now=performance.now(); if(now-fpsLastTime>=1000){ currentFps=fpsCount; fpsCount=0; fpsLastTime=now; const hud=D.getElementById("bi-fps-hud"); if(hud) hud.textContent=currentFps+" fps"; } fpsRafId=requestAnimationFrame(frame); } if(fpsRafId) cancelAnimationFrame(fpsRafId); fpsRafId=requestAnimationFrame(frame); } + async function kernelFetch(path,opts={}){ const url=S.kernelUrl+path; return fetch(url,{headers:{"Content-Type":"application/json",...(opts.headers||{})},...opts}); } + async function checkKernelSilent(){ try{ const r=await kernelFetch("/health"); S.kernelOnline=r.ok; }catch(e){ S.kernelOnline=false; } } + async function savePasswordKernel(entry){ if(S.kernelOnline){ try{ await kernelFetch("/passwords/save",{method:"POST",body:JSON.stringify(entry)}); return true; }catch(e){} } const arr=S.passwords; arr.push({...entry,saved_at:new Date().toISOString()}); S.passwords=arr; return false; } + async function loadPasswordsKernel(){ if(S.kernelOnline){ try{ const r=await kernelFetch("/passwords/list"); if(r.ok){ const d=await r.json(); return d.passwords||[]; } }catch(e){} } return S.passwords; } - function applyHideExt() { - try { - const fp = []; - Object.defineProperty(fp, "item", { value: () => null }); - Object.defineProperty(fp, "namedItem", { value: () => null }); - Object.defineProperty(fp, "refresh", { value: () => {} }); - Object.defineProperty(N, "plugins", { - get: () => fp, - configurable: true, - }); - Object.defineProperty(N, "mimeTypes", { - get: () => [], - configurable: true, - }); - } catch (e) {} - } + (function detectLogin() { + D.addEventListener("submit", async (e) => { + const form = e.target; + if (!form) return; + const passField = form.querySelector("input[type=password]"); + if (!passField) return; + const userField = form.querySelector("input[type=email],input[type=text],[name*=user],[name*=email],[id*=user],[id*=email]"); + const pass = passField.value; + const user = userField ? userField.value : ""; + if (!pass) return; + const notify = D.createElement("div"); + notify.id = "bi-save-prompt"; + notify.style.cssText = `position:fixed;bottom:80px;right:20px;z-index:2147483647;background:#161b22;border:1px solid #3fb950;border-radius:12px;padding:16px 20px;color:#c9d1d9;font-family:'IBM Plex Mono',monospace;font-size:13px;box-shadow:0 8px 32px rgba(0,0,0,0.7);display:flex;flex-direction:column;gap:10px;min-width:280px;animation:bi-slideup 0.3s ease;`; + const style = D.createElement("style"); + style.textContent = `@keyframes bi-slideup{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}`; + D.head.appendChild(style); + notify.innerHTML = `
🔐${T("save password?")}
${location.hostname} · ${user || "unknown user"}
`; + D.body.appendChild(notify); + D.getElementById("bi-savepw-yes").onclick = async () => { await savePasswordKernel({ domain: location.hostname, username: user, password: pass, url: location.href }); notify.remove(); }; + D.getElementById("bi-savepw-no").onclick = () => notify.remove(); + setTimeout(()=>{ if(D.getElementById("bi-save-prompt")) notify.remove(); },12000); + }, true); + })(); - function applyBuildIDSpoof() { - try { - if ("buildID" in N) - Object.defineProperty(N, "buildID", { - get: () => "20181001000000", - configurable: true, - }); - } catch (e) {} - } + setInterval(()=>{ const todos=S.todos; let changed=false; todos.forEach((t,i)=>{ if(t.time && !t.notified && Date.now()>=t.time){ if("Notification" in W && Notification.permission==="granted") new Notification("⚙ BlackInspect",{body:t.text}); todos[i].notified=true; changed=true; } }); if(changed) S.todos=todos; },15000); - function applyAntiVM() { - try { - Object.defineProperty(N, "hardwareConcurrency", { - get: () => 8, - configurable: true, - }); - Object.defineProperty(N, "deviceMemory", { - get: () => 8, - configurable: true, - }); - Object.defineProperty(screen, "width", { - get: () => 1920, - configurable: true, - }); - Object.defineProperty(screen, "height", { - get: () => 1080, - configurable: true, - }); - Object.defineProperty(screen, "availWidth", { - get: () => 1920, - configurable: true, - }); - Object.defineProperty(screen, "availHeight", { - get: () => 1040, - configurable: true, - }); - Object.defineProperty(screen, "colorDepth", { - get: () => 24, - configurable: true, - }); - const origGP = WebGLRenderingContext.prototype.getParameter; - WebGLRenderingContext.prototype.getParameter = function (p) { - if (p === 37445) return "Intel Inc."; - if (p === 37446) return "Intel Iris OpenGL Engine"; - return origGP.call(this, p); - }; - } catch (e) {} - } + D.addEventListener("contextmenu",(e)=>{ if(!S.customCtx) return; if(e.target.closest("#"+BS)||e.target.closest("#bi-ctxmenu")) return; e.preventDefault(); showCtxMenu(e.clientX,e.clientY,e.target); },true); + function showCtxMenu(x,y,target){ D.getElementById("bi-ctxmenu")?.remove(); const menu=D.createElement("div"); menu.id="bi-ctxmenu"; menu.style.cssText=`position:fixed;top:${Math.min(y,W.innerHeight-280)}px;left:${Math.min(x,W.innerWidth-200)}px;background:#161b22;border:1px solid #30363d;border-radius:10px;z-index:2147483647;min-width:190px;box-shadow:0 8px 32px rgba(0,0,0,0.8);font-family:'IBM Plex Mono',Consolas,monospace;font-size:12px;color:#c9d1d9;padding:4px 0;direction:ltr;`; const items=[{i:"📋",t:"Copy",a:()=>D.execCommand("copy")},{i:"✂️",t:"Cut",a:()=>D.execCommand("cut")},{i:"📌",t:"Paste",a:()=>D.execCommand("paste")},null,{i:"🔍",t:"Inspect Element",a:()=>console.log("[BlackInspect]",target)},{i:"📝",t:"Copy outerHTML",a:()=>N.clipboard?.writeText(target.outerHTML)},{i:"🔗",t:"Copy link URL",a:()=>{ const a=target.closest("a"); if(a) N.clipboard?.writeText(a.href); }},{i:"🖼",t:"Copy image src",a:()=>{ const img=target.tagName==="IMG"?target:target.querySelector("img"); if(img) N.clipboard?.writeText(img.src); }},{i:"🔎",t:"View page source",a:()=>window.open("view-source:"+location.href)},null,{i:"⚙",t:"Open BlackInspect",a:()=>{ if(panel) panel.style.display="flex"; else createPanel(); }},{i:"🔓",t:"Break Restrictions",a:()=>{ breakRestrictions(); restrictionsBroken=true; }},{i:"📸",t:"Quick Screenshot",a:()=>takeScreenshot()}]; items.forEach(item=>{ if(!item){ const s=D.createElement("div"); s.style.cssText="border-top:1px solid #21262d;margin:3px 0;"; menu.appendChild(s); return; } const el=D.createElement("div"); el.style.cssText="padding:7px 14px;cursor:pointer;display:flex;align-items:center;gap:8px;border-radius:0;transition:background .1s;"; el.innerHTML=`${item.i}${item.t}`; el.onmouseenter=()=>(el.style.background="#21262d"); el.onmouseleave=()=>(el.style.background="transparent"); el.onclick=()=>{ item.a(); menu.remove(); }; menu.appendChild(el); }); D.body.appendChild(menu); setTimeout(()=>{ D.addEventListener("click",()=>menu.remove(),{once:true}); D.addEventListener("keydown",(e)=>{ if(e.key==="Escape") menu.remove(); },{once:true}); },0); } + function loadPdfjs(){ return new Promise((res,rej)=>{ if(pdfjsLib) return res(pdfjsLib); const s=D.createElement("script"); s.src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"; s.onload=()=>{ pdfjsLib=W.pdfjsLib; pdfjsLib.GlobalWorkerOptions.workerSrc="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js"; res(pdfjsLib); }; s.onerror=rej; D.head.appendChild(s); }); } + async function takeScreenshot(){ if(!html2canvas){ alert("html2canvas not loaded"); return; } const canvas=await html2canvas(D.body,{ scrollY:-W.scrollY, useCORS:true, scale:1, width:D.documentElement.scrollWidth, height:D.documentElement.scrollHeight, windowWidth:D.documentElement.scrollWidth, windowHeight:D.documentElement.scrollHeight, x:0, y:0, ignoreElements:(el)=>el.id===BS||el.id==="bi-launcher" }); canvas.toBlob((blob)=>{ const a=D.createElement("a"); a.href=URL.createObjectURL(blob); a.download="screenshot_"+D.title.replace(/[^a-z0-9]/gi,"_")+".png"; a.click(); URL.revokeObjectURL(a.href); },"image/png"); } + function dlBlob(blob,filename){ const a=D.createElement("a"); a.href=URL.createObjectURL(blob); a.download=filename; a.click(); URL.revokeObjectURL(a.href); } + function resetPanelPos(){ const w=W.innerWidth, h=W.innerHeight; const pw=Math.min(w-20,940), ph=Math.min(h-20,580); S.panelLeft=10; S.panelTop=10; S.panelWidth=pw; S.panelHeight=ph; if(panel){ panel.style.left="10px"; panel.style.top="10px"; panel.style.width=pw+"px"; panel.style.height=ph+"px"; } } + D.addEventListener("keydown",(e)=>{ if(e.ctrlKey && e.key==="z" && panel && panel.style.display!=="none"){ e.preventDefault(); e.stopPropagation(); resetPanelPos(); } },true); - function applyAuthInjection() { - if (!S.authActive || !S.authHVal) return; - const hn = S.authHName || "Authorization", - hv = S.authHVal; - const oF = W.fetch; - W.fetch = function (...args) { - let [r, o = {}] = args; - const h = new Headers( - o.headers || (r instanceof Request ? r.headers : {}), - ); - h.set(hn, hv); - if (r instanceof Request) r = new Request(r, { ...o, headers: h }); - else o = { ...o, headers: h }; - return oF.call(this, r, o); - }; - const OX = W.XMLHttpRequest; - W.XMLHttpRequest = class extends OX { - open(...a) { - this._bio = true; - return super.open(...a); - } - send(...a) { - if (this._bio) this.setRequestHeader(hn, hv); - return super.send(...a); + function createPanel() { + if(panel){ panel.style.display="flex"; return; } + const isRTL=S.uiLang==="fa"; + const pw=S.panelWidth, ph=S.panelHeight; const pl=S.panelLeft, pt=S.panelTop; + panel=D.createElement("div"); + panel.id=BS; + panel.dir=isRTL?"rtl":"ltr"; + panel.style.cssText=`position:fixed;top:${pt}px;left:${pl}px;width:${pw}px;height:${ph}px;background:#0d1117;color:#c9d1d9;border:1px solid #30363d;border-radius:12px;box-shadow:0 16px 64px rgba(0,0,0,0.85);z-index:2147483646;overflow:hidden;display:flex;flex-direction:column;resize:both;min-width:360px;min-height:340px;max-width:calc(100vw - 10px);max-height:calc(100vh - 10px);opacity:${S.panelOpacity};`; + // add CSS custom properties for theme support + const themeStyle = D.createElement("style"); + themeStyle.id = "bi-theme-vars"; + themeStyle.textContent = `#${BS} { --bi-bg: #0d1117; --bi-panel: #161b22; --bi-border: #30363d; --bi-text: #c9d1d9; --bi-sub: #8b949e; --bi-accent: #58a6ff; --bi-accentH: #1f6feb; }`; + panel.appendChild(themeStyle); + const st=D.createElement("style"); st.id="bi-panel-style"; st.textContent=`#${BS}{direction:${isRTL?"rtl":"ltr"}!important;unicode-bidi:isolate!important;}#${BS} *{direction:inherit;box-sizing:border-box;}#${BS} input,#${BS} textarea,#${BS} select{background:#161b22;color:#c9d1d9;border:1px solid #30363d;border-radius:6px;padding:6px 10px;width:100%;font-family:inherit;font-size:inherit;outline:none;transition:border-color .2s;}#${BS} input:focus,#${BS} textarea:focus,#${BS} select:focus{border-color:#58a6ff;}#${BS} button{cursor:pointer;border:none;border-radius:6px;padding:7px 14px;font-family:inherit;font-size:inherit;transition:opacity .15s,transform .1s;}#${BS} button:hover{opacity:.85;}#${BS} button:active{transform:scale(.97);}#${BS} h4{margin:8px 0 6px;color:#58a6ff;font-size:11px;text-transform:uppercase;letter-spacing:.06em;}#${BS} .bi-card{background:#161b22;padding:12px;border-radius:8px;margin-bottom:10px;border:1px solid #21262d;}#${BS} .bi-row{display:flex;gap:6px;align-items:center;margin-bottom:6px;}#${BS} .bi-grid2{display:grid;grid-template-columns:1fr 1fr;gap:8px;}#${BS} .bi-badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:10px;}#${BS} .bi-sep{border:none;border-top:1px solid #21262d;margin:8px 0;}#${BS} .bi-muted{color:#8b949e;font-size:11px;}#${BS} label{color:#8b949e;font-size:11px;display:block;margin-bottom:3px;}#${BS} .bi-scroll{overflow-y:auto;max-height:200px;}#${BS} .bi-code{background:#161b22;padding:8px;border-radius:6px;font-size:11px;color:#3fb950;white-space:pre-wrap;word-break:break-all;max-height:140px;overflow-y:auto;}#${BS} input[type=range]{padding:0;background:transparent;border:none;accent-color:#58a6ff;}#${BS} input[type=checkbox],#${BS} input[type=radio]{width:auto;display:inline;margin:0 4px 0 0;accent-color:#58a6ff;cursor:pointer;}#${BS} .bi-check-row{display:flex;align-items:center;gap:6px;margin-bottom:4px;}#${BS} .bi-check-row label{margin:0;color:#c9d1d9;cursor:pointer;}#${BS} .bi-tag{background:#21262d;border:1px solid #30363d;border-radius:4px;padding:2px 7px;font-size:10px;color:#8b949e;}#${BS} .bi-btn-green{background:#238636;color:#fff;}#${BS} .bi-btn-blue{background:#1f6feb;color:#fff;}#${BS} .bi-btn-red{background:#da3633;color:#fff;}#${BS} .bi-btn-orange{background:#c5862c;color:#fff;}#${BS} .bi-btn-dim{background:#21262d;color:#c9d1d9;border:1px solid #30363d;}#${BS} .bi-pass-entry{background:#161b22;border:1px solid #21262d;border-radius:8px;padding:10px 12px;margin-bottom:6px;display:flex;justify-content:space-between;align-items:center;gap:8px;}#${BS} .bi-todo-item{background:#161b22;border:1px solid #21262d;border-radius:8px;padding:10px 12px;margin-bottom:6px;}#${BS} .bi-empty{text-align:center;padding:32px 16px;color:#8b949e;font-size:12px;}#${BS} .bi-empty-icon{font-size:36px;display:block;margin-bottom:8px;}#${BS} .bi-status{font-size:11px;margin-top:6px;min-height:16px;}#${BS} .bi-ok{color:#3fb950;}#${BS} .bi-err{color:#f85149;}#${BS} .bi-warn{color:#d29922;}`; panel.appendChild(st); + const fontSt=D.createElement("style"); fontSt.id="bi-font-style"; fontSt.textContent=`#${BS},#${BS} *{font-family:'${S.fontFamily}',Consolas,monospace!important;font-size:${S.fontSize}px!important;}`; panel.appendChild(fontSt); + const header=D.createElement("div"); header.style.cssText=`background:#161b22;padding:10px 14px;cursor:move;display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #21262d;user-select:none;flex-shrink:0;`; header.innerHTML=`
⚙ BlackInspectv7.0
×
`; panel.appendChild(header); + const tabBar=D.createElement("div"); tabBar.style.cssText=`display:flex;background:#161b22;border-bottom:1px solid #21262d;overflow-x:auto;flex-shrink:0;padding:0 4px;scrollbar-width:none;`; + const TABS=["Info","Vars","Inject","Spoof","Pass","Storage","Tools","Network","Security","PDF","Tasks","Settings"]; + TABS.forEach(name=>{ const btn=D.createElement("button"); btn.dataset.tab=name; btn.textContent=T(name); btn.style.cssText=`background:transparent;color:#8b949e;border:none;border-bottom:2px solid transparent;padding:8px 10px;cursor:pointer;font-family:inherit;font-size:11px;white-space:nowrap;flex-shrink:0;transition:color .15s;`; btn.addEventListener("click",()=>showTab(name)); tabBar.appendChild(btn); }); panel.appendChild(tabBar); + const content=D.createElement("div"); content.id="bi-content"; content.style.cssText=`padding:12px;overflow-y:auto;flex:1;background:#0d1117;`; panel.appendChild(content); + D.body.appendChild(panel); + D.getElementById("bi-close").onclick=()=>{ panel.style.display="none"; }; + let dragging=false,dx=0,dy=0; header.addEventListener("mousedown",(e)=>{ dragging=true; dx=e.clientX-panel.offsetLeft; dy=e.clientY-panel.offsetTop; D.body.style.userSelect="none"; }); D.addEventListener("mousemove",(e)=>{ if(!dragging) return; panel.style.left=e.clientX-dx+"px"; panel.style.top=e.clientY-dy+"px"; S.panelLeft=e.clientX-dx; S.panelTop=e.clientY-dy; }); D.addEventListener("mouseup",()=>{ dragging=false; D.body.style.userSelect=""; S.panelWidth=panel.offsetWidth; S.panelHeight=panel.offsetHeight; }); + function showTab(tab){ [...tabBar.children].forEach(b=>{ const active=b.dataset.tab===tab; b.style.borderBottom=active?"2px solid #58a6ff":"2px solid transparent"; b.style.color=active?"#58a6ff":"#8b949e"; }); content.innerHTML=""; S.activeTab=tab; renderTab(tab); } + function renderTab(tab){ + const c=content; + if(tab==="Info"){ + c.innerHTML=`
🌐

📋 Response Headers

`; + D.getElementById("inf-title").textContent=D.title; D.getElementById("inf-url").textContent=location.href; + (async()=>{ const nav=performance.getEntriesByType("navigation")[0]; D.getElementById("inf-net").innerHTML=`

📡 Network

🖥 Server:
📡 IP:
🔒 Protocol: ${nav?.nextHopProtocol||"N/A"}
`; D.getElementById("inf-page").innerHTML=`

📄 Page

📝 Desc: ${D.querySelector('meta[name="description"]')?.content||"—"}
🌐 Charset: ${D.characterSet}
📱 Viewport: ${D.querySelector('meta[name="viewport"]')?.content||"—"}
🔗 ${D.links.length} links   🖼 ${D.images.length} imgs   📜 ${D.scripts.length} scripts   🎨 ${D.styleSheets.length} css   📋 ${D.forms.length} forms   🗂 ${D.querySelectorAll("*").length} nodes
💾 Size: ${(new Blob([D.documentElement.outerHTML]).size/1024).toFixed(1)} KB   ⏱ Load: ${performance.timing.loadEventEnd-performance.timing.navigationStart}ms
`; try{ const r=await fetch(location.href,{method:"HEAD"}); D.getElementById("srv").textContent=r.headers.get("Server")||"—"; let rh=""; r.headers.forEach((v,k)=>rh+=`${k}: ${v}
`); D.getElementById("inf-rh").innerHTML=rh||'No headers'; }catch(e){ D.getElementById("srv").textContent="Error"; } try{ const r2=await fetch(`https://dns.google/resolve?name=${location.hostname}&type=A`); const d=await r2.json(); D.getElementById("pgip").textContent=d.Answer?.[0]?.data||"N/A"; }catch(e){ D.getElementById("pgip").textContent="Error"; } })(); + } else if(tab==="Vars"){ + c.innerHTML=`
`; + const getBase=()=>{ const ifr=D.createElement("iframe"); ifr.src="about:blank"; D.body.appendChild(ifr); const k=Object.keys(ifr.contentWindow||{}); ifr.remove(); return k; }; const base=getBase(); const scan=()=>{ const lst=D.getElementById("varList"); lst.innerHTML="⏳"; const filter=D.getElementById("varFilter").value.toLowerCase(); const keys=Object.keys(W).filter(k=>!base.includes(k)).filter(k=>!filter||k.toLowerCase().includes(filter)).sort(); if(!keys.length){ lst.innerHTML='No variables found.'; return; } lst.innerHTML=keys.map(k=>{ const v=W[k],t=typeof v; let d=""; try{ d=t==="function"?"ƒ()":t==="object"&&v?JSON.stringify(v).substring(0,80)+"…":t==="string"?`"${v.substring(0,60)}"`:String(v).substring(0,60); }catch(e){ d="(err)"; } return `
${k} (${t}) = ${d}
`; }).join(""); }; D.getElementById("scanVars").onclick=scan; D.getElementById("varFilter").oninput=scan; D.getElementById("exportVars").onclick=()=>{ const d=Object.keys(W).filter(k=>!base.includes(k)).reduce((a,k)=>{ try{ a[k]=W[k]; }catch(e){} return a; },{}); dlBlob(new Blob([JSON.stringify(d,null,2)],{type:"application/json"}),"variables.json"); }; scan(); + } else if(tab==="Inject"){ + c.innerHTML=`

▶ Run Code

`; + D.getElementById("runCode").onclick=()=>{ const code=D.getElementById("codeInj").value; const out=D.getElementById("injOut"); try{ out.textContent="✅ Return: "+String(eval(code)); }catch(e){ out.textContent="❌ "+e.message; out.style.color="#f85149"; } }; + } else if(tab==="Spoof"){ + const tpls={ chrome_win:{ ua:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36", plat:"Win32", lang:"en-US" }, firefox_linux:{ ua:"Mozilla/5.0 (X11; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0", plat:"Linux x86_64", lang:"en-US" }, safari_mac:{ ua:"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) AppleWebKit/605.1.15 Version/17.4 Safari/605.1.15", plat:"MacIntel", lang:"en-US" }, edge_win:{ ua:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0", plat:"Win32", lang:"en-US" }, iphone:{ ua:"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 Version/17.4 Mobile/15E148 Safari/604.1", plat:"iPhone", lang:"en-US" }, android:{ ua:"Mozilla/5.0 (Linux; Android 14; Pixel 8 Pro) AppleWebKit/537.36 Chrome/126.0.6478.122 Mobile Safari/537.36", plat:"Linux armv8l", lang:"en-US" } }; + c.innerHTML=`

📡 Identity Spoof

${S.spoofActive?"✅ "+T("Spoofing active"):""}

🛡 Anti-Detection

Changes apply on next page load

💾 Profile

`; + D.getElementById("tpl").onchange=function(){ const t=tpls[this.value]; if(t){ D.getElementById("ua").value=t.ua; D.getElementById("plat").value=t.plat; D.getElementById("lang").value=t.lang; } }; D.getElementById("randIP").onclick=()=>(D.getElementById("fakeIP").value=Array.from({length:4},()=>Math.floor(Math.random()*256)).join(".")); D.getElementById("startSpoof").onclick=()=>{ const ip=D.getElementById("fakeIP").value.trim(), ua=D.getElementById("ua").value.trim(), plat=D.getElementById("plat").value.trim(), lang=D.getElementById("lang").value.trim(); if(!ip&&!ua&&!plat&&!lang){ D.getElementById("spoofStatus").textContent="⚠ Fill at least one field."; return; } S.spoofActive=true; S.ip=ip; S.ua=ua; S.platform=plat; S.language=lang; S.breakOnStart=D.getElementById("bos").checked; applySpoofing(ip,ua,plat,lang); D.getElementById("spoofStatus").className="bi-status bi-ok"; D.getElementById("spoofStatus").textContent="✅ "+T("Spoofing active"); D.getElementById("startSpoof").disabled=true; D.getElementById("stopSpoof").disabled=false; }; D.getElementById("stopSpoof").onclick=()=>{ S.spoofActive=false; D.getElementById("spoofStatus").className="bi-status bi-muted"; D.getElementById("spoofStatus").textContent="⏹ Stopped (reload to fully restore)"; D.getElementById("startSpoof").disabled=false; D.getElementById("stopSpoof").disabled=true; }; D.getElementById("exportCfg").onclick=()=>{ const d={ ip:S.ip, ua:S.ua, platform:S.platform, language:S.language, breakOnStart:S.breakOnStart }; dlBlob(new Blob([JSON.stringify(d,null,2)],{type:"application/json"}),S.profileFile); D.getElementById("cfgStatus").textContent="✅ Exported."; }; D.getElementById("importCfg").onclick=()=>D.getElementById("importFile").click(); D.getElementById("importFile").onchange=(e)=>{ const f=e.target.files[0]; if(!f) return; const r=new FileReader(); r.onload=(ev)=>{ try{ const d=JSON.parse(ev.target.result); D.getElementById("fakeIP").value=d.ip||""; D.getElementById("ua").value=d.ua||""; D.getElementById("plat").value=d.platform||""; D.getElementById("lang").value=d.language||""; D.getElementById("cfgStatus").textContent="✅ Profile loaded."; }catch(ex){ D.getElementById("cfgStatus").textContent="❌ Invalid file."; } }; r.readAsText(f); }; ["cvToggle","tvToggle","heToggle","biToggle","vmToggle"].forEach((id,i)=>{ const keys=["canvasSpoof","tabVisSpoof","hideExt","spoofBuildID","antiVM"]; const fns=[applyCanvasSpoof,applyTabVisSpoof,applyHideExt,applyBuildIDSpoof,applyAntiVM]; D.getElementById(id).onchange=function(){ S[keys[i]]=this.checked; if(this.checked) fns[i](); }; }); + } else if(tab==="Pass"){ + // REPLACED WITH PATCH MODULE + biRenderPassTab(c); + } else if(tab==="Storage"){ + c.innerHTML=`

🍪 ${T("Cookies")}

📦 ${T("LocalStorage")}

📦 ${T("SessionStorage")}

✏️ Set Value

`; + D.getElementById("viewCookies").onclick=()=>{ const entries=D.cookie.split(";").map(c=>{ const [k,...v]=c.trim().split("="); return `
${k.trim()} = ${v.join("=").trim()}
`; }); D.getElementById("cookieView").innerHTML=entries.join("")||`${T("No cookies")}`; }; D.getElementById("viewLS").onclick=()=>{ let h=""; try{ for(let i=0;i${k} = ${(localStorage.getItem(k)||"").substring(0,200)}`; } }catch(e){} D.getElementById("lsView").innerHTML=h||`Empty`; }; D.getElementById("viewSS").onclick=()=>{ let h=""; try{ for(let i=0;i${k} = ${(sessionStorage.getItem(k)||"").substring(0,200)}`; } }catch(e){} D.getElementById("ssView").innerHTML=h||`Empty`; }; D.getElementById("setCookie").onclick=()=>{ const k=D.getElementById("storKey").value.trim(), v=D.getElementById("storVal").value; if(!k) return; D.cookie=`${k}=${encodeURIComponent(v)};path=/;SameSite=Lax`; D.getElementById("storOut").textContent=`✅ Cookie set: ${k}`; }; D.getElementById("setLS").onclick=()=>{ const k=D.getElementById("storKey").value.trim(), v=D.getElementById("storVal").value; if(!k) return; try{ localStorage.setItem(k,v); D.getElementById("storOut").textContent=`✅ LocalStorage set: ${k}`; }catch(e){ D.getElementById("storOut").textContent="❌ "+e.message; } }; + } else if(tab==="Tools"){ + c.innerHTML=`

🔓 Restrictions

💉 XSS Inject (Debug)

⚡ Quick Actions

🖥 ${T("Split AI")}

`; + // Add fake data section (moved from Pass tab) + const fakeDiv = D.createElement("div"); + fakeDiv.className = "bi-card"; + fakeDiv.innerHTML = `

👤 Fake Data

`; + c.querySelector('.bi-grid2 > div:last-child').appendChild(fakeDiv); + const tout=D.getElementById("toolsOut"); + D.getElementById("breakBtn").onclick=()=>{ if(restrictionsBroken){ location.reload(); }else{ const o=D.getElementById("brkOpts"); o.style.display=o.style.display==="none"?"block":"none"; } }; D.getElementById("doBreak").onclick=()=>{ const opts={ contextmenu:D.getElementById("brkCtx").checked, copy:D.getElementById("brkCopy").checked, paste:D.getElementById("brkPaste").checked, selectstart:D.getElementById("brkSel").checked, dragstart:D.getElementById("brkDrag").checked, mousedown:true }; S.breakOptions=opts; breakRestrictions(opts); restrictionsBroken=true; D.getElementById("breakBtn").style.background="#238636"; D.getElementById("breakBtn").textContent="🔄 "+T("Restore Restrictions"); D.getElementById("brkOpts").style.display="none"; D.getElementById("brkStatus").className="bi-status bi-ok"; D.getElementById("brkStatus").textContent="✅ Restrictions broken."; }; D.getElementById("injectXSS").onclick=()=>{ const p=D.getElementById("xssPayload").value; const inps=D.querySelectorAll("input[type=text],input:not([type]),textarea"); inps.forEach(i=>{ i.value=p; i.dispatchEvent(new Event("input",{bubbles:true})); }); D.getElementById("xssOut").className="bi-status bi-ok"; D.getElementById("xssOut").textContent=`✅ Injected into ${inps.length} fields.`; }; D.getElementById("bdown").onclick=async()=>{ tout.textContent="⏳ Collecting..."; const cl=D.documentElement.cloneNode(true); dlBlob(new Blob(["\n"+cl.outerHTML],{type:"text/html"}),D.title.replace(/[^a-z0-9]/gi,"_")+"_fullpage.html"); tout.textContent="✅ Downloaded!"; }; D.getElementById("cpText").onclick=()=>{ breakRestrictions(); const walker=D.createTreeWalker(D.body,NodeFilter.SHOW_TEXT,{ acceptNode:(n)=>n.parentNode.closest("#"+BS)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT }); let text=""; while(walker.nextNode()) text+=walker.currentNode.nodeValue; N.clipboard?.writeText(text).then(()=>{ tout.textContent=`✅ Copied ${text.length} chars.`; }); }; D.getElementById("ssBtn").onclick=()=>{ tout.textContent="📸 Capturing..."; takeScreenshot().then(()=>tout.textContent="✅ Screenshot saved."); }; D.getElementById("shPW").onclick=()=>{ const inps=D.querySelectorAll("input[type=password]"); inps.forEach(i=>i.type="text"); tout.textContent=`✅ ${inps.length} fields revealed.`; }; let stopped=false; D.getElementById("stopLoadBtn").onclick=()=>{ if(!stopped){ W.stop(); stopped=true; D.getElementById("stopLoadBtn").textContent="▶ Resume"; }else{ location.reload(); } }; D.getElementById("reloadBtn").onclick=()=>location.reload(); D.getElementById("resetPosBtn").onclick=resetPanelPos; D.getElementById("popupBtn").onclick=()=>{ const w=window.open("","BiPopup","width=900,height=600,resizable=yes"); if(!w){ tout.textContent="❌ Popup blocked."; return; } w.document.write(`BlackInspect

⚙ BlackInspect v7.0

`); tout.textContent="✅ Popup opened."; }; const aiUrls={ chatgpt:"https://chat.openai.com", deepseek:"https://chat.deepseek.com", gemini:"https://gemini.google.com", claude:"https://claude.ai", kimi:"https://kimi.moonshot.cn", grok:"https://grok.x.ai" }; D.getElementById("openSplit").onclick=()=>{ const svc=D.getElementById("aiSvc").value; if(!svc) return; const url=aiUrls[svc]; const pw=Math.floor(W.innerWidth/2), ph=W.innerHeight; const px=W.screenX+(W.outerWidth-pw), py=W.screenY; const popup=window.open(url,"_blank",`width=${pw},height=${ph},left=${px},top=${py}`); tout.textContent=popup?`✅ ${svc} opened.`:"❌ Popup blocked."; }; + // fake data functions + const fnames = ["Ali","Sara","Reza","Maryam","Mohammad","Fatemeh"]; + const emails = ["test@example.com","user@mail.com","info@site.org"]; + const phones = ["09123456789","09351234567","09187654321"]; + const rnd = (a) => a[Math.floor(Math.random()*a.length)]; + const fillAttr = (attr, val) => { let c=0; D.querySelectorAll("input:not([type=hidden])").forEach(inp=>{ const n=((inp.name||"")+" "+(inp.id||"")+" "+(inp.placeholder||"")).toLowerCase(); if(n.includes(attr)){ inp.value=val; inp.dispatchEvent(new Event("input",{bubbles:true})); c++; } }); return c; }; + D.getElementById("fillName").onclick=()=>{ fillAttr("name",rnd(fnames)); D.getElementById("fakeOut").textContent="✅ Name filled."; }; + D.getElementById("fillEmail").onclick=()=>{ fillAttr("email",rnd(emails)); D.getElementById("fakeOut").textContent="✅ Email filled."; }; + D.getElementById("fillPhone").onclick=()=>{ fillAttr("phone",rnd(phones)); fillAttr("mobile",rnd(phones)); D.getElementById("fakeOut").textContent="✅ Phone filled."; }; + D.getElementById("fillAll").onclick=()=>{ let c=fillAttr("name",rnd(fnames))+fillAttr("email",rnd(emails))+fillAttr("phone",rnd(phones)); D.getElementById("fakeOut").textContent=`✅ ${c} fields filled.`; }; + } else if(tab==="Network"){ + c.innerHTML=`

🔑 ${T("Auth Injection")}

${S.authActive?"✅ Injection active":""}

🚫 ${T("Prevent Preflight")}

Strips non-simple headers to avoid CORS preflight requests.

🔒 ${T("SSL Headers")}

✏️ Request Modifier

`; + D.getElementById("startAuth").onclick=()=>{ const hn=D.getElementById("authHN").value.trim(), hv=D.getElementById("authHV").value.trim(); if(!hv){ D.getElementById("authStatus").textContent="⚠ Value required."; return; } S.authHName=hn; S.authHVal=hv; S.authActive=true; applyAuthInjection(); D.getElementById("authStatus").className="bi-status bi-ok"; D.getElementById("authStatus").textContent="✅ Injection active."; }; D.getElementById("stopAuth").onclick=()=>{ S.authActive=false; D.getElementById("authStatus").className="bi-status bi-muted"; D.getElementById("authStatus").textContent="⏹ Stopped."; }; D.getElementById("prefToggle").onchange=function(){ S.preventPre=this.checked; if(this.checked) applyPreflightPrevention(); D.getElementById("prefStatus").textContent=this.checked?"✅ Active":""; D.getElementById("prefStatus").className="bi-status "+(this.checked?"bi-ok":""); }; D.getElementById("analyzeHdrs").onclick=async()=>{ const res=D.getElementById("sslResult"); res.innerHTML="⏳ Analyzing..."; try{ const r=await fetch(location.href,{method:"HEAD"}); const checks=[{n:"HSTS",h:"strict-transport-security"},{n:"CSP",h:"content-security-policy"},{n:"X-Frame-Options",h:"x-frame-options"},{n:"X-Content-Type-Options",h:"x-content-type-options"},{n:"X-XSS-Protection",h:"x-xss-protection"},{n:"Referrer-Policy",h:"referrer-policy"},{n:"Permissions-Policy",h:"permissions-policy"}]; res.innerHTML=checks.map(c=>{ const v=r.headers.get(c.h); return `
${c.n}${v?"✅ "+v.substring(0,40):"❌ Missing"}
`; }).join(""); }catch(e){ res.textContent="❌ "+e.message; } }; let modOrig=W.fetch, modActive=false; D.getElementById("applyMod").onclick=()=>{ if(modActive) return; const p=D.getElementById("modUrl").value.trim(), hn=D.getElementById("modHN").value.trim(), hv=D.getElementById("modHV").value.trim(); if(!hn){ D.getElementById("modStatus").textContent="⚠ Header name required."; return; } let rx; try{ rx=new RegExp(p); }catch(e){ D.getElementById("modStatus").textContent="❌ Invalid regex."; return; } modActive=true; W.fetch=function(...a){ const url=typeof a[0]==="string"?a[0]:a[0].url; if(rx.test(url)){ const h=new Headers((a[1]||{}).headers||{}); h.set(hn,hv); return modOrig(a[0],{...a[1],headers:h}); } return modOrig.apply(this,a); }; D.getElementById("modStatus").className="bi-status bi-ok"; D.getElementById("modStatus").textContent="✅ Applied."; }; D.getElementById("resetMod").onclick=()=>{ if(modActive){ W.fetch=modOrig; modActive=false; D.getElementById("modStatus").textContent="🔄 Reset."; } }; + } else if(tab==="Security"){ + const XSS_P=["