
يفحص ويفكك ويعالج هيكليًا بايت كود Hermes (HBC) من تطبيقات React Native، مع REPL بنمط GDB، وCFG، ومفكك، ومعالج إعادة تسلسل.
مجموعة أدوات تفاعلية لهندسة عكسية ومعالجة Hermes.
يقوم hermit بفحص وتفكيك وتصحيح بنية بايت كود Hermes (HBC)، وهو التنسيق الذي تُشحن به تطبيقات React Native شيفرة JavaScript الخاصة بها. افتح ملف .hbc، وتصفح دواله، واقرأ JavaScript المفككة، وحرّر التعليمات والسلاسل والقيم الحرفية في محرر تفاعلي، ثم اكتب ملفًا لا يزال جهاز Hermes الافتراضي يحمّله ويشغّله.
على عكس الأدوات التي تكتفي بتحليل بايت كود، أو التي تصححه في مكانه دون تغيير الأحجام، يعيد hermit تسلسل الملف بأكمله. يمكنه إدراج التعليمات وحذفها، وإعادة تحديد مواضع القفزات ومعالجات الاستثناءات، وإعادة بناء جدولي السلاسل والقيم الحرفية، وإضافة دوال جديدة، وإعادة حساب توقيع SHA-1 الختامي. الملف غير المعدّل يمر ذهابًا وإيابًا بايتًا ببايت.
.hbc| الإصدار | الدور |
|---|---|
| 96 | الهدف الأساسي. ما تستخدمه تطبيقات React Native المشحونة: RN 0.73 إلى 0.83، وRN 0.84+ مع تعطيل Hermes V1. |
| 94، 95 | مُتحقَّق منها. التنسيق مطابق لـ 96، وتختلف جداول أكواد التشغيل فقط. |
التطبيقات المبنية بـ Hermes V1 (الافتراضي من RN 0.84) تُصدر HBC 98، وهو غير مدعوم بعد. ملاحظات التنسيق موجودة في doc/hbc-format/.
تحتوي كل إصدار على أرشيفات لـ macOS وLinux، على arm64 وx86_64. لا حاجة إلى Python أو مترجم:
| الأرشيف | المحتوى |
|---|---|
hermit-<version>-<platform>.tar.gz | REPL التفاعلي: ./hermit file.hbc. |
hermit-tools-<version>-<platform>.tar.gz | أدوات سطر الأوامر المستقلة hbc_*. |
SHA256SUMS | المجاميع الاختبارية: shasum -a 256 -c SHA256SUMS. |
tar -xzf hermit-0.1.0-macos-arm64.tar.gz
./hermit-0.1.0-macos-arm64/hermit --version
ملفات macOS الثنائية غير موقّعة. بعد التنزيل، امسح علامة الحجر الصحي
مرة واحدة: xattr -dr com.apple.quarantine hermit-0.1.0-macos-arm64. تحتاج نسخ Linux
إلى glibc 2.35 أو أحدث. لا يزال الأمر cfg يحتاج إلى تثبيت graph-easy.
تُنتَج الإصدارات بواسطة .github/workflows/release.yml عند دفع وسم v*،
باستخدام packaging/build-release.sh، والذي يمكنك تشغيله محليًا أيضًا.
FetchContent الخاص بـ CMake ما لم تكن مثبتة مسبقًا.graph-easy للأمر cfg
(cpanm Graph::Easy)، وless كأداة ترقيم صفحات له.شغّل كل شيء من هذا الدليل (الدليل الذي يحتوي على CMakeLists.txt):
cmake -B build
cmake --build build -j
هذا يبني مكتبة libhbc الثابتة، ووحدة Python _libhbc (في
build/bindings/)، والأدوات سطر الأوامر (في build/tools/) واختبارات
الوحدة. لا يحتاج REPL سوى وحدة Python:
cmake --build build --target _libhbc
يمكن استبعاد الأدوات والاختبارات من عملية البناء، على سبيل المثال لإصدار ما:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DHERMIT_BUILD_TOOLS=OFF -DHERMIT_BUILD_TESTS=OFF
أعد البناء باستخدام الأمر نفسه بعد كل تغيير في core/ أو bindings/.
macOS: إذا فشل الربط بخطأ يتعلق بـ SDK مشوّه، فوجّه البناء إلى SDK كامل، على سبيل المثال
SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX26.5.sdk cmake --build build.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
الوحدة _libhbc غير مثبّتة في البيئة الافتراضية. أضف دليل البناء الخاص بها إلى PYTHONPATH كلما شغّلت hermit:
export PYTHONPATH=$PWD/build/bindings:$PYTHONPATH
.hbcيُشحن تطبيق React Native حزمته كملف عادي:
| المنصة | الموقع داخل الحزمة |
|---|---|
Android (.apk، ملف zip) | assets/index.android.bundle |
iOS (.ipa، ملف zip) | Payload/<App>.app/main.jsbundle |
إذا بدأ الملف بالبايتات C6 1F BC 03 C1 03 19 1F، فهو bytecode خاص بـ Hermes. لا يفتح REPL إلا الملفات ذات الامتداد .hbc، لذا أعد تسميته:
unzip -p app.apk assets/index.android.bundle > app.hbc
xxd app.hbc | head -1 # c61f bc03 c103 191f ...
حلّل فقط التطبيقات المسموح لك بدراستها، مثل تطبيقاتك الخاصة، أو التطبيقات مفتوحة المصدر لأغراض البحث.
للحصول على مدخلات صغيرة ومضبوطة، ترجم JavaScript أو TypeScript باستخدام مترجم
Hermes الذي يُصدر HBC 96 (على سبيل المثال hermesc من react-native 0.73 إلى
0.83، ضمن node_modules/react-native/sdks/hermesc/):
hermes -emit-binary -g0 -out hello.hbc hello.js # -g0: no debug info
تُؤتمت حزمة seeder/ هذه العملية للبرامج النموذجية في
seeder/samples/ وتكتب النتائج إلى seeder/corpus/:
.venv/bin/python -m seeder.compile # all samples
.venv/bin/python -m seeder.compile --g0 seeder/samples/loop_sum.js
.venv/bin/python -m seeder.compile --debug seeder/samples/greeting.js
--g0 يكتب <name>_g0.hbc بدون معلومات التصحيح، بينما --debug يكتب
<name>_g.hbc مع معلومات التصحيح الكاملة. تحتاج عينات .ts إلى tsc في PATH لديك؛
يُؤخذ المترجم من --hermes (الافتراضي hermes). يبني seeder/build-real-bundle.sh
تطبيق React Native حقيقيًا مفتوح المصدر إلى ملف .hbc.
export PYTHONPATH=$PWD/build/bindings:$PYTHONPATH
.venv/bin/python -m cli.main app.hbc
بدون وسيطة ملف، يبدأ REPL فارغًا؛ استخدم open <file.hbc>. يعرض الموجّه إصدار HBC واسم الملف، مع علامة + عند وجود تغييرات غير محفوظة: [hbc v96 | app+] >. يُحفظ السجل في ~/.hermit_history وتُكمَّل الأوامر تلقائيًا بمفتاح Tab.
> info
> strings --identifiers filter:fetch
> functions
> disasm func:12
> decompile func:isPremium
> xrefs string:"api.example.com"
> edit func:isPremium
> patch patched.hbc
تُعنون الدوال بواسطة الفهرس أو الاسم (func:12، func:isPremium)، والسلاسل النصية بواسطة الفهرس أو القيمة (string:42، string:"hello")، ومواقع القيم الحرفية بواسطة الفهرس (array:7).