السلام عليكــم ورحمـة الله وبركاتــه ،،
فكرة البرنامج أتت من خلال هذا الموضوع : كيفية النداء على كلاس توجد في جهاز آخر, استعمال ال ClassLoader
Java Byte Code Protector :
الفكرة هي بعمل أداه تأخذ ملف البايت كود وتشفره بأي خوارزمية .. وبالطبع لن يعمل هذا الملف مع الclass loader العادي ،، وسنضطر لكتابة class loader يفك الشفره أولا وبعدها يمرر البايت كود للjvm ..
حاليا انتهيت من الأداه البسيطة بشكل عام .. وتقوم بالتشفير باستخدام شفره AES .
لنفرض ان لدينا البرنامج لطباعه Hello World :
[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class HelloWorld [color= #009900;]{
[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]static [color= #000066; font-weight: bold;]void main [color= #009900;]([color= #003399;]String[color= #009900;][[color= #009900;]] args[color= #009900;]) [color= #009900;]{
[color= #003399;]System.[color= #006633;]out.[color= #006633;]println[color= #009900;]([color= #0000ff;]"Hello World JLoader"[color= #009900;])[color= #339933;];
[color= #009900;]}
[color= #009900;]}بعد ترجمة البرنامج واصدار أمر تشغيل الjvm للبايت كود سوف يعمل البرنامج ، وهذا ما لا نريده ..
سوف نستخدم الأن الأداه Protect لحماية هذا الملف ، وبعدها لكي نشغل الكلاس المشفر سوف نحتاج للـJLoader وهو يقوم بمهمه الفك وتمرير الناتج للjvm .
C:)java Protect HelloWorld.class HelloWorld.class
C:)java HelloWorld
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value
2069949144 in class file HelloWorld
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: HelloWorld. Program will exit.
C:)java JLoader HelloWorld.class MyKey.AES
Hello World JLoader
C:)
الأداه Protect تستقبل اسم الكلاس الذي نريد تشفيره والملف الجديد ، في سطر الأوامر اعلاه قمت بالكتابة فوق الكلاس وهكذا أصبح لدينا كلاس مشفر فقط ومفتاح سوف ينتج في نفس المسار .. ولن تستطيع فك هذا الكلاس أبدا أبدا في حال ضاع المفتاح منك ، لأن المفتاح key مولد عشوائيا ..
بعد ذلك نستخدم JLoader ونمرر له اسم الكلاس المشفر والمفتاح .. ويخرج الناتج ..
الكود بسيط ولم أراعي وجود أكثر من كلاس في ملف واحد أو أن الكلاس يستخدم أكثر من كلاس حيث في تلك الحالات سوف يخرج ملف بايت كود لكل من هذه الكلاسات الداخلية ..
للأمانة يوجد برنامج مشابه في الفكرة في كتاب core java2 ولكنه يستخدم قيصر ،، استخدمت الloader الخاص به ولكن بالتعديل بما يلزم .. يعني الفكرة ليست لي وبالتالي البرنامج مجانا :) ..
الكود بالمرفقات ..