الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حماية ملفات البايت كود Byte Code Protector

بدأه Wajdy Essam في 18 سبتمبر 2009 · 8 رد · 2,009 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

فكرة البرنامج أتت من خلال هذا الموضوع : كيفية النداء على كلاس توجد في جهاز آخر, استعمال ال 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 الخاص به ولكن بالتعديل بما يلزم .. يعني الفكرة ليست لي وبالتالي البرنامج مجانا :) ..

الكود بالمرفقات ..

Protector_Byte_Code.rar

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 18 سبتمبر 2009 في 16:44

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#2

بصراحة إخواني أنا مش فاهم شيء عن هذا الشيء , هل ممكن توضحوا أكتر..

يعني شو فائدة تشفير الملف الذي تم استدعاءه!!! ؟؟؟

على كل حال شكرا للمبدع وجدي.

#3

توجد برامج تسمح بعمل decompile للملفات class وبالتالي معرفة الsource code, مثلا أنت صاحب شركة تشتغل بالبرمجة، وكتبت برنامج جافا كلفك وقتا وجهدا وتستعمل خوارزمية خاصة بشركتك، فلن ترضى أن يأتي أحد منافسيك ويعمل decompile لبرنامجك ويأخد مجانا كل جهدك وتعبك، لذلك يجب عمل تشفير لملفات class

#4
herch كتب:

توجد برامج تسمح بعمل decompile للملفات class وبالتالي معرفة الsource code, مثلا أنت صاحب شركة تشتغل بالبرمجة، وكتبت برنامج جافا كلفك وقتا وجهدا وتستعمل خوارزمية خاصة بشركتك، فلن ترضى أن يأتي أحد منافسيك ويعمل decompile لبرنامجك ويأخد مجانا كل جهدك وتعبك، لذلك يجب عمل تشفير لملفات class

شكرا يا عصام على الرد , و لكن هل البرنامج الذي صممه وجدي يقوم بهذا الدور ؟؟؟

وأيضا , لو قمت بتشفير ملفات الكلاس و قمت بحزم برنامجي و نشره , فهل سيعمل البرنامج و خاصة أن ملفات الكلاس مشفرة ؟؟

ألا تظن أيضا أن عملية التشفير و فك التشفير تتطلب وقت اكبر لتنفيذ البرنامج ؟؟؟!!

#5

حياك الله أخي محمد ،،

في المثال قمنا بتشفير ملف البايت كود (.class file) بمفتاح يتولد عشوائيا .. بعد ذلك كما قال عصام اذا قمت بعمل decompiler للملف المشفر هذا ستحصل على نص مخربط ولن تحصل على السورس كود ، هذا أولا . ثانيا لن تستطيع تشغيل الكلاس والسبب أنه مشفر ويجب أن يتم فك التشفير حتى يعمل ،، وهذه وظيفة الكلاس المسمى JLoader في المثال ، فهو يقوم بفك تشفير الكلاس ويعطي الناتج للjvm والذي يقوم بتنفيذ البرنامج وهو لا يعلم بأن هناك تشفير من الأساس :) ..

عملية التشفير لن تأخذ زمنا طويلا والسبب أن ملف .class ملف صغير الحجم في الغالب ، ربما أقل من ثانية يتم التشفير فيها ، ومن الأساس نحن سنعطي الزبون ملف class مشفر يعني عملية التشفير هذه ستكون جزء من مرحلة التطوير .. وتبقى مرحلة فك التشفير وقت عمل البرنامج ، وهي أيضا تأخذ جزء من الثانية وهذا هو العيب الوحيد ان صح القول بأنه عيب :) .

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6
Wajdy Essam كتب:

حياك الله أخي محمد ،،

في المثال قمنا بتشفير ملف البايت كود (.class file) بمفتاح يتولد عشوائيا .. بعد ذلك كما قال عصام اذا قمت بعمل decompiler للملف المشفر هذا ستحصل على نص مخربط ولن تحصل على السورس كود ، هذا أولا . ثانيا لن تستطيع تشغيل الكلاس والسبب أنه مشفر ويجب أن يتم فك التشفير حتى يعمل ،، وهذه وظيفة الكلاس المسمى JLoader في المثال ، فهو يقوم بفك تشفير الكلاس ويعطي الناتج للjvm والذي يقوم بتنفيذ البرنامج وهو لا يعلم بأن هناك تشفير من الأساس :) ..

عملية التشفير لن تأخذ زمنا طويلا والسبب أن ملف .class ملف صغير الحجم في الغالب ، ربما أقل من ثانية يتم التشفير فيها ، ومن الأساس نحن سنعطي الزبون ملف class مشفر يعني عملية التشفير هذه ستكون جزء من مرحلة التطوير .. وتبقى مرحلة فك التشفير وقت عمل البرنامج ، وهي أيضا تأخذ جزء من الثانية وهذا هو العيب الوحيد ان صح القول بأنه عيب :) .

بالتوفيق ،

رائع يا وجدي ,,

يعني هل نستطيع أن نقول الان انه بالإمكان نشر برامجنا بالجافا دون خوف الحصول على المصدر !!! :wacko: :lol: :lol: :lol:

#7

نعم يا محمد لأن الملف سيكون مشفر لكن يجب أن يكون المفتاح موجود أيضا بالإضافة الى الJLoader حتى يفك الشفره بشكل صحيح ..

اذا أرفقت كل ذلك وكان المستخدم hacker يعرف هذه التفاصيل جيدا ، فيمكنه فك الشفره باستخدام المفتاح الموجود :) ..

لذلك البعض يفضل الObfuscating أكثر من التشفير للكلاس :

Protect Your Java Code - Through Obfuscators And Beyond

Protecting Java Code Via Code Obfuscation

وهناك الكثير من الحزم لعمل الObfuscating ، من البحث وجدت هذه : yGuard - Java™ Bytecode Obfuscator and Shrinker

سأحاول أن أطور الأداه لكي تعمل مع جميع الinner classes في الكلاس وتقوم بتشفيرهم أيضا ،،،

بالتوفيق ،،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 19 سبتمبر 2009 في 00:57

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#8
اقتباس
اذا أرفقت كل ذلك وكان المستخدم hacker يعرف هذه التفاصيل جيدا

والعياذ بالله

عل سيرة الهكر :happy: كنت اتمنا ان يكون تطبيق على هذا الكلاس شبكي من انامل السيد وجدي

بس اياكم وتفهمونا غلط B)

بالتوفيق

الله معكم

#9

ياخي الكبير كبير :)

تسلم حبيبي وجدي ريحتي , لأن برامج الديكومبايلر كانت تسببلي قلق وقد سألت أكثر من مرة عن حل لهذه المشكله وماحد رد

بس برضه تبقى فيها ثغره , هو أنك بتعطيعا للزبون مع كلاس فك التشفير والمفتاح , والخوف ليس من المستخدم نفسه وإنما لو وقع على يد cracker أو أي مبرمج عنده فكره عن الموضوع فهنا نكون رجعنا لنفس المشكله :(

أتمنى لو ممكن الواحد يشفره بحيث يمكن تشغيله مثل أي exe مع إستحالة فتح المصدر

عارف انه يوجد برامج تحول الjar إلى exe لكن هنا بتلتغي ميزة الـPortability

تم تعديل هذه المشاركة بواسطة M.Allaw في 24 سبتمبر 2009 في 00:33


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

مواضيع مشابهة