
يفحص ويفكك ويعالج هيكليًا بايت كود Hermes (HBC) من تطبيقات React Native، مع REPL بنمط GDB، وCFG، ومفكك، ومعالج إعادة تسلسل.
مجموعة أدوات تفاعلية لهندسة عكسية ومعالجة Hermes.
يقوم hermit بفحص وتفكيك وترقيع بنية Hermes bytecode (HBC)، وهو التنسيق الذي تُرسل به تطبيقات React Native شيفرتها JavaScript. افتح ملف .hbc، وتصفح دواله، واقرأ JavaScript المفككة، وعدّل التعليمات والسلاسل والقيم الحرفية في محرر تفاعلي، ثم اكتب ملفًا لا يزال Hermes VM قادرًا على تحميله وتشغيله.
على عكس الأدوات التي تحلل bytecode فقط، أو التي ترقعه في مكانه دون تغيير الأحجام، يعيد hermit تسلسل الملف بالكامل. يمكنه إدراج وحذف التعليمات، وإعادة تحديد مواقع القفزات ومعالجات الاستثناءات، وإعادة بناء جداول السلاسل والقيم الحرفية، وإضافة دوال جديدة وإعادة حساب SHA-1 footer. الملف غير المعدّل يمر ذهابًا وإيابًا بايت ببايت.
.hbc| الإصدار | الدور |
|---|---|
| 96 | الهدف الأساسي. ما تستخدمه تطبيقات React Native المُرسلة: RN 0.73 إلى 0.83، و RN 0.84+ مع تعطيل Hermes V1. |
| 94، 95 | تم التحقق منها. التنسيق مطابق لـ 96، فقط جداول opcode تختلف. |
التطبيقات المبنية بـ 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 ما لم تكن مثبتة مسبقًا.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، فهو Hermes bytecode. لا يفتح 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).