
shouganaiyo-loader هو أداة سطر أوامر Node.js عبر الأنظمة الأساسية قائمة على Frida تفرض تحميل عمليات Java لوكيل Java/JVMTI بغض النظر عما إذا كان JVM قد عطل واجهة برمجة تطبيقات إرفاق الوكيل.
shouganaiyo-loader هي أداة سطر أوامر Node.js مبنية على Frida وتعمل عبر المنصات، وتجبر عمليات جافا على تحميل وكيل Java/JVMTI بغض النظر عمّا إذا كان JVM قد عطّل واجهة برمجة تطبيقات إرفاق الوكيل (agent attach API).
$ sudo npm install -g shouganaiyo-loader
$ git clone https://github.com/nccgroup/shouganaiyo-loader
$ cd shouganaiyo-loader
$ npm install
$ sudo npm install -g
# shouganaiyo-loader --pid <pid> -t <hotspot|openj9> -a /path/to/agent.jar "args..."
# shouganaiyo-loader --pid <pid> -t <hotspot|openj9> -j instrument "/path/to/agent.jar=args..."
# shouganaiyo-loader --pid <pid> -t <hotspot|openj9> -j "/path/to/(lib)?instrument.(so|dylib|dll)" "/path/to/agent.jar=args..."
# shouganaiyo-loader --pid <pid> -t <hotspot|openj9> -j /path/to/agent.so 'jvmti agent args...'
shouganaiyo-loader مرخّص بموجب رخصة أباتشي، الإصدار 2.0.
صُمّم shouganaiyo-loader لدعم إصدارات Java 6-17+ على Linux وWindows وMacOS لكل من JVMs HotSpot وOpenJ9.
| JVM | المنصة | الإصدارات المختبرة |
|---|---|---|
| HotSpot | Linux | 6,8,11,17 |
| HotSpot | MacOS | 8,11,17 |
| HotSpot | Windows | 8,11,17 |
| OpenJ9 (0.29.1) | Linux | 8,11,17 |
| OpenJ9 (0.29.1) | MacOS | 17 |
| OpenJ9 (0.29.1) | Windows | 17 |
| OpenJ9 (0.29.0) | Windows | 8,11 |
| OpenJ9 (0.27.0) | Linux | 8,11 |
| OpenJ9 (0.25.0) | Linux | 16 |
| OpenJ9 (0.24.0) | Linux | 8,11 |
تؤدي التغييرات في MacOS 11+ إلى عدم قدرة العمليات الجذرية على الإرفاق بالملفات الثنائية الموقّعة رقميًا (codesigned binaries) التي تفتقر إلى صلاحية Get Task Allow. وبما أن جميع إصدارات AdoptOpenJDK/Adoptium Temurin/IBM Semeru الأخرى غير AdoptOpenJDK JDK11+HotSpot موقّعة رقميًا دون صلاحية Get Task Allow، فلا يمكن الإرفاق بها افتراضيًا، ويمكن اعتبارها معطّلة.
لتصحيح هذه المشكلة على المدى القصير:
أزل توقيع codesign من أي ملفات جافا الثنائية:
$ codesign --remove-signature /path/to/jdk/Contents/Home/bin/javac
أزل "علامة الويب" (mark of the web) من الملف الثنائي:
$ cp /path/to/jdk/Contents/Home/bin/java /path/to/jdk/Contents/Home/bin/java.bak
$ curl -o /path/to/jdk/Contents/Home/bin/java.clean file:///path/to/jdk/Contents/Home/bin/java
$ mv /path/to/jdk/Contents/Home/bin/java.clean /path/to/jdk/Contents/Home/bin/java