Divergence: وقتی فرمت کردن کد جاوااسکریپت، برنامه رو عوض میکنه
خلاصهٔ کاملتر
تقریباً اولین قدم تو مهندسی معکوس جاوااسکریپت اینه که کد رو با یه ابزار خوشخوان کنی: DevTools مرورگر، یه فرمتر مثل prettier یا یه deobfuscator مثل WebCrack. نویسندهٔ این مقاله از TrustSig نشون میده که همین پردازش ساده میتونه برنامه رو به یه برنامهٔ کاملاً دیگه تبدیل کنه. این کار بدون source map، بدون چک کردن کد موقع اجرا و بدون شبکه انجام میشه و فقط به باگهای خود این ابزارها تکیه داره.
نویسنده اسم این تکنیک رو divergence گذاشته و میگه معادلش تو دنیای نرمافزارهای native، "disassembly desynchronization" هست. اون ۱۸۶ تکنیک تو بیش از ۳۷ ابزار پیدا کرده، از جمله prettier، babel، swc، esbuild، Terser، WebCrack و DevTools کروم و فایرفاکس. دموش یه اسکریپته که تتریس اجرا میکنه، ولی بعد از رد شدن از هر کدوم از این ابزارها، bytecode یه VM کوچیک عوض میشه و Snake اجرا میشه.
نکتهٔ مهم به گفتهٔ نویسنده اینه که نسخهٔ عوضشده یه طعمهست، نه یه مانع. نباید crash کنه یا نشونهای بده، وگرنه تحلیلگر میفهمه. کاربردش برای anti-cheat و anti-bot هست: اگه کسی منطق رو بازنویسی کنه و حتی یه عدد فرق کنه، سرور میتونه تشخیص بده و با تأخیر بن کنه. نویسنده میگه ایجنتهای LLM تقریباً همیشه کد رو فرمت میکنن و جز اجرا کردنش چیزی رو چک نمیکنن، پس این دفاع جلوی اونها خیلی قویه.
اون شش نوع divergence رو بر اساس اینکه چقدر از کد رو میشه تغییر داد دستهبندی میکنه: Rerouted و Rewritten (کم)، Folded و Stripped (متوسط)، Pruned و Erased (زیاد). سادهترینش تو DevTools کرومه که فقط whitespace اضافه میکنه. چون برای عبارتهای unary قانون فاصله نداره، دو تا + با فاصله به هم میچسبن:
var m = 0;
+ +m;
console.log(m); // 0 -> after formatting: ++m; // 1یعنی عبارتی که هیچ کاری نمیکرد، بعد از فرمت m رو یکی زیاد میکنه. DevTools هم فقط وقتی فرمت میکنه که میانگین طول خطها ۸۰ کاراکتر یا بیشتر باشه، که با یه کامنت خیلی بلند میشه فعالش کرد.
WebCrack عبارت getConfig().ready || (getConfig().ready = true) رو به ||= تبدیل میکنه و تعداد صدا زدن getConfig از دو به یک میرسه. Restringer فرض میکنه atob همیشه همون نسخهٔ اصلیه، حتی وقتی اسکریپت عوضش کرده. new-datadome-deobfuscator یه new Tick() داخل عبارت کاما رو حذف میکنه، obfuscator-io-deobfuscator مقدار null رو truthy میدونه و شاخهٔ else رو پاک میکنه، و Terser عبارت 0 in 1 رو با اینکه TypeError میده بیخطر میدونه و بدنهٔ تابع رو حذف میکنه.
نکات کلیدی:
- ۱۸۶ تکنیک divergence تو بیش از ۳۷ پردازشگر جاوااسکریپت پیدا شده.
- DevTools کروم و فایرفاکس، prettier، esbuild، swc و Terser هم آسیبپذیرن.
- باگهای کتابخونههای پایه مثل astring، swc و esbuild به همهٔ ابزارهایی که ازشون استفاده میکنن منتقل میشه.
- شش نوع divergence: Rerouted، Rewritten، Folded، Stripped، Pruned و Erased.
- DevTools کروم فقط وقتی فرمت میکنه که میانگین طول خط ۸۰ کاراکتر یا بیشتر باشه.
- DevTools سافاری بررسی نشده.




