لم يعد هذا المشروع يتم الحفاظ عليه
يوصى باستخدام الإصدار الجديد Jar Analyzer V2 https://github.com/jar-analyzer/jar-analyzer
إصدار سطر أوامر jar-analyzer
جرة الحداثة CLI نسخة
مقدمة موجزة: https://mp.weixin.qq.com/s/rrx6x5m_28yrcqcdxueq
لا توجد وثيقة إنجليزية ، أجنبيون يرجى ترجمتها بنفسك
أداة واجهة المستخدم الرسومية لتحليل حزم jar ، وخاصة مناسبة لعمليات تدقيق أمان الكود. يمكن تحليل ملفات jar المتعددة في نفس الوقت ، ويمكن البحث بسهولة عن طريقة الهدف. يدعم إزالة الرمز الباقري وإنشاء العلاقات تلقائيًا بين الفصول والأساليب لمساعدة باحثو أمن Java على العمل بشكل أكثر كفاءة.
ملاحظة: لا تقم بتحليل حزم Jar كبيرة جدًا أو كثيرة جدًا ، فمن المستحسن ألا تتجاوز 300M
انتقل إلى التنزيل
يمكن تحديد موقع الطريقة بدقة (مميزة على اليسار)

يمكنك تحديد موقع السلاسل مباشرة (تحليل التعليمات المستمرة المتعلقة بالمجمع لتحقيق تحديد موقع دقيق)

يمكن تحليل المشاريع التي كتبها Spring Framework مباشرة

لماذا لا تختار تحليل IDEA : لأن IDEA لا تدعم تحليل حزم جرة الكود السلبي
يدعم ست طرق بحث:
LDC للعثور على الموقع الدقيق)LDC للعثور على الموقع الدقيق)يدعم اختيار ثلاث طرق فك:
استخدم تخصيص فئة لمكونات JSyntaxPane (غير رسمية) لإظهار رمز Java
(تتم إضافة الكثير من التكنولوجيا السوداء إلى المكتبة https://code.google.com/archive/p/jsyntaxpane )
يدعم بحث تعبير قوي للغاية ، والذي يمكن دمجه كما تريد البحث عن المعلومات التي تريدها
| تعبير | المعلمة | تأثير |
|---|---|---|
| namecontains | خيط | يحتوي اسم الطريقة |
| StartWith | خيط | بادئة الطريقة |
| endwith | خيط | طريقة لاحقة |
| classnamecontains | خيط | يحتوي اسم الفصل |
| Returntype | خيط | طريقة العودة نوع |
| paramtypemap | int سلسلة | طريقة المراسلات المعلمة |
| paramsnum | int | عدد معلمات الطرق |
| Isstatic | منطقية | هل الطريقة ثابتة؟ |
| issubclassof | خيط | من فئة الفرعية هو |
| issuperclassof | خيط | فئة الوالدين هي هي |
| حسنو | خيط | التعليق التوضيحي للطريقة |
| Hasclassanno | خيط | التعليقات التوضيحية الفئة |
| هاسفيلد | خيط | الحقول الفئة |
يلاحظ:
returnType و paramTypeMap أسماء فئة كاملة مماثلة ، مثل java.lang.String ، وكتابة النوع الأساسي مباشرة ، على سبيل المثال ، intisSubClassOf و isSuperClassOf أسماء فصول كاملة ، مثل java.awt.ComponenthasAnno و hasClassAnno اسم الفصل الكامل ، فقط اكتبه مباشرة ، على سبيل المثال ، Controller 
أساس البحث هو الطريقة ، ما هي الطريقة التي تريد البحث عنها
على سبيل المثال ، أريد أن تبدأ طريقة البحث مع set و WIND value
# method
. startWith ( "set" )
. endWith ( "value" ) على سبيل المثال ، أريد البحث عن الأساليب التي تحتوي اسم الفصل على Context واسم الطريقة يحتوي على lookup
# method
. nameContains ( "lookup" )
. classNameContains ( "Context" ) على سبيل المثال ، أريد البحث عن طريقة تُرجع ما مجموعه 3 معلمات من نوع Process والمعلمة الثانية هي String
# method
. returnType ( "java.lang.Process" )
. paramsNum ( 3 )
. paramTypeMap ( 1 , "java.lang.String" ) على سبيل المثال ، نريد أن نجد جميع الفئات الفرعية لـ javax.naming.spi.ObjectFactory (بما في ذلك الفئات الفرعية من الفئات الفرعية ، إلخ)
فقط اكتب القواعد التالية ، وسيبحث البرنامج بشكل متكرر لجميع فئات الوالدين
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" ) إذا كنت ترغب في العثور على جميع الفئات الأم لفئة معينة ، فما عليك سوى استخدام isSuperClassOf (لاحظ اسم الفئة الكاملة)
لاحظ أن ما سبق سيجد مباشرة جميع الطرق التي تفي بالمعايير ، لذلك أقترح إضافة بعض التصفية
على سبيل المثال
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" )
. startWith ( "xxx" )
. paramsNum ( 0 ) على سبيل المثال ، نريد أن نجد جميع طرق جميع الفصول المشروع بواسطة @Controller
اكتب القواعد التالية
# method
. hasClassAnno ( "Controller" ) على سبيل المثال ، أريد أن أجد جميع طرق @RequestMapping التعليق التوضيحي
# method
. hasAnno ( "RequestMapping" )وبالمثل ، نظرًا لوجود جميع الطرق التي تلبي فئة المعايير ، أقترح إضافة المزيد من التصفية
وفقًا لشروط Swing RCE التي يوفرها السيد عبر الإنترنت:
Component (بما في ذلك الفئات الفرعية غير المباشرة)لذلك نكتب قاعدة
# method
. startWith ( "set" )
. paramsNum ( 1 )
. paramTypeMap ( 0 , "java.lang.String" )
. isSubClassOf ( "java.awt.Component" )نتائج البحث

هام: يرجى استخدام Java 8+ للتشغيل (11 موصى بها و EXE إصدار من Java 11 JRE المدمجة)
(تم استخدام خط أفضل في Java 11 ، تستخدم الإصدارات الأخرى الخطوط الافتراضية)
(1) الخطوة 1: إضافة ملف jar (يدعم ملف jar واحد ودليل jar )
Select Jar File لفتح ملف الجرةمن فضلك لا تقلق ، يستغرق الأمر بعض الوقت لتحليل ملف الجرة
ملاحظة: يرجى الانتظار حتى يكون شريط التقدم ممتلئًا ويتم الانتهاء من التحليل.
(2) الخطوة 2: أدخل المعلومات التي بحثت عنها
نحن ندعم المدخلات في ثلاثة تنسيقات:
javax.naming.Context (على سبيل المثال)javax/naming/ContextContext (سوف يبحث عن جميع فئات *.Context )يوفر وسيلة للدخول بسرعة

ملاحظة: يمكن تخصيص محتوى البحث الشائع هنا للمكملات الغذائية
قم بإنشاء ملف search.txt جديد في الدليل الحالي ، وقسم اسم الفصل والطريقة الأولى تلو الأخرى مع # ، على سبيل المثال
java.lang.Runtime#getRuntime
java.lang.String#equals
سيعود البحث الثنائي فقط سواء كان موجودًا أم لا ، ولن يعيد معلومات محددة.

(3) الخطوة 3: يمكنك النقر نقرًا مزدوجًا إلى إلغاء الظهر
سوف يشير المؤشر إلى موقع مكالمة الطريقة تمامًا
أثناء فك الإلغاء ، سيتم إنشاء العلاقة بين الأساليب
يمكنك النقر نقرًا مزدوجًا في أي مكان على اللوحة لإزالة تجميع وبناء علاقات وعروض تقديمية جديدة وبناءها
يرجى ملاحظة: إذا واجهت موقفًا لا يمكنك فيه إلغاء توحيده ، فأنت بحاجة إلى تحميل ملف JAR الصحيح
على سبيل المثال ، لا يمكنني فك تشفير javax.naming.Context لأنني لم rt.jar
يمكنك استخدام Ctrl+F للبحث عن الكود والتحرير
يمكنك النقر فوق أي خيار وسيتم عرض تفاصيل الطريقة بعد ذلك
يمكنك النقر بزر الماوس الأيمن لإرسال الخيار إلى السلسلة. يمكنك فهم الرابط كمفضل أو سجل. في السلسلة ، يمكنك أيضًا النقر نقرًا مزدوجًا على Decompile ، ثم عرض علاقة استدعاء الطريقة الجديدة ، أو عرض التفاصيل على أساس مستقل. إذا كان هناك خيار في السلسلة شيء لا تريده ، فيمكنك النقر بزر الماوس الأيمن لحذف الخيار من السلسلة
لذلك ، يمكنك إنشاء سلسلة مكالمات تنتمي لك فقط
谁调用了当前方法当前方法调用了谁جميع الطريقة التي يمكن أيضًا إبطال العلاقة بين الطريقة ، انقر لرؤية التفاصيل ، انقر بزر الماوس الأيمن للانضمام إلى السلسلة
يمكنك عرض رمز بايت الفئة الحالي بنقرة واحدة

(1) ما هي العلاقة بين الأساليب
class Test {
void a (){
new Test (). b ();
}
void b (){
Test . c ();
}
static void c (){
// code
}
} إذا كانت الطريقة الحالية b
الذي أطلق على الطريقة الحالية: طريقة Test الفئة a
من يدعو الطريقة الحالية: طريقة Test الفئة c
(2) كيفية حل مشكلة تنفيذ الواجهة
class Demo {
void demo (){
new Test (). test ();
}
}
interface Test {
void test ();
}
class Test1Impl implements Test {
@ Override
public void test () {
// code
}
}
class Test2Impl implements Test {
@ Override
public void test () {
// code
}
} الآن لدينا Demo.demo -> Test.test Data ، ولكن في الواقع هو Demo.demo -> TestImpl.test .
لذلك أضفنا قواعد جديدة: Test.test -> Test1Impl.test and Test.test -> Test2Impl.test .
تأكد أولاً من عدم فقدان البيانات ، ثم يمكننا تحليل الرمز المقطوع يدويًا من قبل أنفسنا
Demo.demo -> Test.testTest.test -> Test1Impl.test / Test.test -> Test2Impl.test(3) كيفية حل علاقة الميراث
class Zoo {
void run (){
Animal dog = new Dog ();
dog . eat ();
}
}
class Animal {
void eat () {
// code
}
}
class Dog extends Animal {
@ Override
void eat () {
// code
}
}
class Cat extends Animal {
@ Override
void eat () {
// code
}
} Zoo.run -> dog.cat 's bytecode هو INVOKEVIRTUAL Animal.eat ()V ، ولكن لدينا فقط قاعدة Zoo.run -> Animal.eat Zoo.run -> Dog.eat animal.at
في هذه الحالة أضفنا قواعد جديدة: Animal.eat -> Dog.eat و Animal.eat -> Cat.eat
تأكد أولاً من عدم فقدان البيانات ، ثم يمكننا تحليل الرمز المقطوع يدويًا من قبل أنفسنا
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat / Animal.eat -> Cat.eat تم تطوير هذا المشروع باستخدام JetBrains Idea. بفضل JetBrains لتزويدني برخصة مجانية ، وهو دعم قوي لي.