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

كيفية النداء على كلاس توجد في جهاز آخر

بدأه herch في 15 سبتمبر 2009 · 26 رد · 3,228 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الكلاس ClassLoader هي المسؤولة عن البحث عن الملفات class التي تحتوي على الكلاسات التي سنستعملها في برامجنا، وتحميل هاته الكلاسات في الذاكرة

التصرف الطبيعي للClassLoader هو البحث عن ملفات class في القرص الصلب، وبالخصوص في المجلدات الموجودة في الclasspath

ماذا لو كنا نريد اساخدام كلاس يوجد في خادم ما؟؟ ما العمل؟؟

سنقوم بكتابة ClassLoader خاص بنا، بحيث يقوم بتحميل الكلاس من الخادم

أولا فلنتكلم قليلا عن الكلاس ClassLoader

عندما تحتاج الJVM إلى كلاس ما، فإن الClassLoader يقوم بالخطوات التالية

1-- ينادي على الميثود findLoadedClassللتأكد من أن هذه الكلاس لم يتم تحميلها من قبل

2-- إذا لم تنجح المرحلة الأولى في إيجاد الكلاس المراد، ينادي الClassLoader على الميثود loadClass الخاصة بالdefault ClassLoader أي الClassLoader العادي الذي يستعمل دائما

3-- إذا لم تنجح المرحلة الثانية، فإن المرحلة الأخيرة هي النداء على الميثود findClass، إذا لم يتم إيجاد الكلاس فإنه يتم إرسال ClassNotFoundException

كل كلاس ترث من ClassLoader يجب عليها أن تعيد كتابة الميثود findClass وفيها نحدد طريقة البحث عن الكلاس

الآن مع التطبيق. لدينا كلاس Test يوجد في هذا العنوان http://herch.heliohost.org/Test.class ونريد طبعا عمل instance لهذه الكلاس داخل برنامجنا

أولا الClassLoader الذي أعدنا فيه كتابة الميثود findClass


import java.net.*;

public class MyClassLoader extends ClassLoader {
protected Class findClass(String name)
throws ClassNotFoundException {
if (name.equals("Test")) {
InputStream input = null;
try {
URL urlClass = new URL("http://herch.heliohost.org/Test.class");
input = urlClass.openStream();
byte[] classData = new byte[input.available()];
input.read(classData);
return defineClass(name, classData, 0, classData.length);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
throw new ClassNotFoundException();
}
}
	 import java.io.*;

ماذا يفعل هذا الكود؟ أولا نقوم بفتح stream ونقرأ الملف class، ثم نخزن هذا المحتوى داخل مصفوفة byte. الآن لدينا مصفوفة من صنف byte، لكننا بحاجة إلى كلاس من صنف Class لأن الميثود findClass يجب أن تعيد Class object، هذا هو الهدف من استعمال الميثود defineClass، فهذه الميثود تنتظر أربع arguments، الأول هو إسم الكلاس، الثاني هو المصفوفة التي تحتوي على محتوى الكلاس، الarguments الثالث والرابع هما نقطتا البداية والنهاية بالنسبة للقراءة من المصفوفة، والناتج يكون Class object

الآن لدينا الClassLoader فكيف سنستعمله داخل البرنامج؟



public class TestClassLoader {
public static void main(String[] args) {
MyClassLoader loader = new MyClassLoader();
try {
Class c = loader.loadClass("Test");
Object o = c.newInstance();
Method m1 = c.getMethod("sayHello", null);
Method m2 = c.getMethod("sayBye", null);
Method m3 = c.getMethod("saySalam", null);
m1.invoke(o, null);
m2.invoke(o, null);
m3.invoke(o, null);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
	 import java.lang.reflect.*;

الكلاس Test تحتوي على 3 methods، sayHello & sayBye & saySalamوهما اللتان يتم النداء عليهما عن طريق invoke

عند عمل compile للبرنامج، فتحصلون على بعض الإنذارات، وذلك ناتج عن الnull الذي نمرر لinvoke و getMethod. يمكن إزالة الإنذارات بواسطة الoption -nowarn

CONSOLE

javac -nowarn YourClass.java

بالنسبة لملف الكلاس، فهو موجود فعلا في العنوان المستعمل ويمكنكم التجربة به، أو يمكنكم التجربة بعنوان آخر

#2

بارك الله فيك, موضوع جميل

هذا مقال جميل يتلكم عن ال كلاس لودر :

http://onjava.com/pub/a/onjava/2005/01/26/classloading.html

#4

فعلا كلاس حلو وفهمان

بس سؤال صغير

انتا قمت بأعادة كتابة جسم الدالة findClass وانت قلت ان هناك مرحلتين قبلها وهي الحل الاخير

هل تقصد ما فعلت ..ام فعلا يجب ان نتعامل مع الدالة findClass مباشرة دون الاخذ بعين الاعتبار المرحلة الاولى اوالثانية

بالتوفيق

الله معك

#6

بالفعل findClass تأتي في المرحلة الأخيرة، بالنسبة للمراحل التي قبلها فإن الكلاس الأم ClassLoader هي التي المسؤولة عنها

وفي الdocumentation الخاص بClassLoader ينصح بإعادة كتابة findClass فقط لمن يريد الوراثة من ClassLoader وإضافة مصدر جديد لملفات class

#7

بارك الله فيك يا عصام , عندي استفسار..

في المثال الذي وضعته , هل تم تحميل Test.class من السيرفر و ووضعه على الجهاز المحلي و بعدها تم استخدام الكلاس بشكل محلي, ام ان السابق لم يتم , وتم الاتصال مع السيرفر و استخدام الكلاس بشكل بعيد Remotely ؟؟؟ !!!!

#8

تم تحميله ووضعه في الذاكرة، بالطبع التحميل يحصل مرة واحدة فقط، وبعد ذلك يتم التعامل مع النسخة الموجودة في الذاكرة

#9

أخ عصام أنت قمت بمناداة هذه الدالة مباشرة

هل من طريقة تجعل الجافا تقوم بذلك لوحدها

لأن ما تقوم به هنا سيحصل دائماً حتى لو كانت الفئة Class موجودة في الذاكرة مسبقاً

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

بالنسبة لجعل المسألة أوتوماتيكية فحاولت لكني لم أعرف

بالنسبة للنقطة الثانية فلست متفقا معك

اقتباس
عندما تحتاج الJVM إلى كلاس ما، فإن الClassLoader يقوم بالخطوات التالية

1-- ينادي على الميثود findLoadedClassللتأكد من أن هذه الكلاس لم يتم تحميلها من قبل

2-- إذا لم تنجح المرحلة الأولى في إيجاد الكلاس المراد، ينادي الClassLoader على الميثود loadClass الخاصة بالdefault ClassLoader أي الClassLoader العادي الذي يستعمل دائما

3-- إذا لم تنجح المرحلة الثانية، فإن المرحلة الأخيرة هي النداء على الميثود findClass، إذا لم يتم إيجاد الكلاس فإنه يتم إرسال ClassNotFoundException

في الكود أنا أنادي على loadClass وليس findClass، الميثود loadClass تنادي أولا على findLoadedClass للتأكد من أن الكلاس ليست محملة مسبقا وفي المرحلة الأخيرة فقط تنادي على findClass التي أعدنا كتابتها

#11

ظننتك تنادي الدالة findClass

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#12

تشكر أخي عصام على طرحك الموضوع ،،

ما رأيك بمشروع صغنون :) ؟؟؟

Java Byte Code Protector :

نقوم بعمل أداه تأخذ ملف البايت كود وتشفره بأي خوارزمية .. وبالطبع لن يعمل هذا الملف مع الclass loader العادي ،، وسنضطر لكتابة class loader يفك الشفره أولا وبعدها يمرر البايت كود للjvm ..

بالتوفيق :) .

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

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

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

#13

والله فكرة جميلة يا وجدي

ما رأيك يا عصام؟؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#14
Wajdy Essam كتب:
تشكر أخي عصام على طرحك الموضوع ،،

ما رأيك بمشروع صغنون :) ؟؟؟

Java Byte Code Protector :

نقوم بعمل أداه تأخذ ملف البايت كود وتشفره بأي خوارزمية .. وبالطبع لن يعمل هذا الملف مع الclass loader العادي ،، وسنضطر لكتابة class loader يفك الشفره أولا وبعدها يمرر البايت كود للjvm ..

بالتوفيق :) .

يعني لا يفك التشفير الا اذا قمنا باستدعاء كلاس قد يكون مخفي للأمان

وهذا الكلاس بعيد ونستدعيه من خلال class loader

لغة شوارعية :happy: ... لازم تتحمل يا وجدي :angry:

موفق

الله معك

#15

بالضبط كلامك صحيح أخي شادي ،،

هذا الكلاس الذي يفك التشفير مهتمه بعد فك التشفير هو تمرير الكود الناتج الى الjvm ، تقريبا لن يختلف الكود كثيرا عن المعروض في الدرس ،،

اما البرنامج الذي يشفر ، فيمكن أن نستخدم أي شفره مثل AES الموجودة في javax.crypto.Cipher أو أو شفره أخرى ..

بالتوفيق ،،

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

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

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

#16

قلبي ودعواتي معكم، لكني اعملوها بدوني :lol:

أنا عندي نفور من كل ما فيه رياضيات وحسابات وأرقام، والتشفير مليء بالحسابات :wacko:

#17

ومنكم نستفيد اخ وجدي .

بالفعل الكلاس هذا كتير حبيتوا ... :wub:

بس سؤال اخير لمسيو عصام قبل ان نتورط ونمستخدمه

اقتباس
تم تحميله ووضعه في الذاكرة، بالطبع التحميل يحصل مرة واحدة فقط، وبعد ذلك يتم التعامل مع النسخة الموجودة في الذاكرة

ارجو ان يكون خفيف نضيف على الذاكرة اولا

اما ثانيا هل اذا حصل disconnect تبقى النسخة بالذاكرة ام هناك من يجبر على دعمه من السيرفر وتغذيته ؟

بالتوفيق

الله معكم

#18

حسنا عصام :) ..

مع ان التشفير بالجافا لا يأخذ أكثر من 7 أسطر باستخدام مكتبة JCE/JCA الموجود بالجافا ، وسأتولى هذه المهمه التشفير والفك ،، وبعدها الclass loader عليك لأنك من قام بطرح الدرس :P

بالتوفيق ،،،

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

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

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

#19

لما تتم قراءة ملف الكلاس وتخزينه في مصفوفة byte فبعدها لا نهتم إذا انقطع الإتصال مع السيرفر أم لا

أما إذا انقطع الإتصال أثناء القراءة فعندها سيرفع IOException

@ أستاذ وجدي

بما أني أنا الذي طرح الدرس، فلازم أرتاح قليلا، يعني أنت اعمل كل حاجة، وأنا علي أشجعك وأدعي لك :lol:

تم تعديل هذه المشاركة بواسطة herch في 18 سبتمبر 2009 في 03:18

#20

أنتهيت من كلاس التشفير ، أمر ممتع التعامل مع المكتبات الجاهزه :P

 

 

[color= #666666; font-style: italic;]// Ecryption and Decryption using AES cipher

 

[color= #000000; font-weight: bold;]package [color= #006699;]com.myprotector[color= #339933;];

 

[color= #000000; font-weight: bold;]import [color= #006699;]java.io.* [color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]javax.crypto.* [color= #339933;];

[color= #000000; font-weight: bold;]import [color= #006699;]java.security.* [color= #339933;];

 

[color= #000000; font-weight: bold;]public [color= #000000; font-weight: bold;]class Protect [color= #009900;]{

    [color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void encrypt [color= #009900;]([color= #003399;]String plainName , [color= #003399;]String cipherName[color= #009900;])

                [color= #000000; font-weight: bold;]throws [color= #003399;]IOException , [color= #003399;]GeneralSecurityException [color= #009900;]{

        [color= #666666; font-style: italic;]// open file we want to encrypt

        [color= #003399;]FileInputStream in [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]FileInputStream[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]File[color= #009900;](plainName[color= #009900;])[color= #009900;])[color= #339933;];

        [color= #000066; font-weight: bold;]byte inByte[color= #009900;][[color= #009900;]] [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #000066; font-weight: bold;]byte[color= #009900;][in.[color= #006633;]available[color= #009900;]([color= #009900;])[color= #009900;]][color= #339933;];

        in.[color= #006633;]read[color= #009900;](inByte[color= #009900;])[color= #339933;];

 

        [color= #666666; font-style: italic;]// cipher configurations

        Cipher cipher [color= #339933;]= Cipher.[color= #006633;]getInstance[color= #009900;]([color= #0000ff;]"AES/ECB/PKCS5Padding"[color= #009900;])[color= #339933;];

        cipher.[color= #006633;]init[color= #009900;](Cipher.[color= #006633;]ENCRYPT_MODE, makeKey[color= #009900;]([color= #009900;])[color= #009900;])[color= #339933;];    [color= #666666; font-style: italic;]// make key

        [color= #000066; font-weight: bold;]byte[color= #009900;][[color= #009900;]] outByte [color= #339933;]= cipher.[color= #006633;]doFinal[color= #009900;](inByte[color= #009900;])[color= #339933;];        [color= #666666; font-style: italic;]// do encryption

 

        [color= #666666; font-style: italic;]// open cipher file to write decrypted data

        [color= #003399;]FileOutputStream out [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]FileOutputStream[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]File[color= #009900;](cipherName[color= #009900;])[color= #009900;])[color= #339933;];

        out.[color= #006633;]write[color= #009900;](outByte[color= #009900;])[color= #339933;];

 

        in.[color= #006633;]close[color= #009900;]([color= #009900;])[color= #339933;];

        out.[color= #006633;]close[color= #009900;]([color= #009900;])[color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]public [color= #000066; font-weight: bold;]void decrypt [color= #009900;]( [color= #003399;]String cipherName ,[color= #003399;]String plainName, [color= #003399;]String keyName [color= #009900;])

             [color= #000000; font-weight: bold;]throws [color= #003399;]IOException , [color= #003399;]GeneralSecurityException , [color= #003399;]ClassNotFoundException  [color= #009900;]{

         [color= #666666; font-style: italic;]// open file we want to decrypt

        [color= #003399;]FileInputStream in [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]FileInputStream[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]File[color= #009900;](cipherName[color= #009900;])[color= #009900;])[color= #339933;];

        [color= #000066; font-weight: bold;]byte inByte[color= #009900;][[color= #009900;]] [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #000066; font-weight: bold;]byte[color= #009900;][in.[color= #006633;]available[color= #009900;]([color= #009900;])[color= #009900;]][color= #339933;];

        in.[color= #006633;]read[color= #009900;](inByte[color= #009900;])[color= #339933;];

 

         [color= #666666; font-style: italic;]// cipher configurations

        Cipher cipher [color= #339933;]= Cipher.[color= #006633;]getInstance[color= #009900;]([color= #0000ff;]"AES/ECB/PKCS5Padding"[color= #009900;])[color= #339933;];

        cipher.[color= #006633;]init[color= #009900;](Cipher.[color= #006633;]DECRYPT_MODE, loadKey[color= #009900;](keyName[color= #009900;])[color= #009900;])[color= #339933;]; [color= #666666; font-style: italic;]// load key

        [color= #000066; font-weight: bold;]byte[color= #009900;][[color= #009900;]] outByte [color= #339933;]= cipher.[color= #006633;]doFinal[color= #009900;](inByte[color= #009900;])[color= #339933;];    [color= #666666; font-style: italic;]// do decryption

 

         [color= #666666; font-style: italic;]// open plain file to write normal data

        [color= #003399;]FileOutputStream out [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]FileOutputStream[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]File[color= #009900;](plainName[color= #009900;])[color= #009900;])[color= #339933;];

        out.[color= #006633;]write[color= #009900;](outByte[color= #009900;])[color= #339933;];

 

        in.[color= #006633;]close[color= #009900;]([color= #009900;])[color= #339933;];

        out.[color= #006633;]close[color= #009900;]([color= #009900;])[color= #339933;];

 

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]private SecretKey makeKey [color= #009900;]([color= #009900;]) [color= #000000; font-weight: bold;]throws [color= #003399;]NoSuchAlgorithmException,[color= #003399;]IOException [color= #009900;]{

        [color= #666666; font-style: italic;]// generate random secure key

        KeyGenerator keygen [color= #339933;]= KeyGenerator.[color= #006633;]getInstance[color= #009900;]([color= #0000ff;]"AES"[color= #009900;])[color= #339933;];

        [color= #003399;]SecureRandom sRand [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]SecureRandom[color= #009900;]([color= #009900;])[color= #339933;];

        keygen.[color= #006633;]init[color= #009900;]( sRand [color= #009900;]) [color= #339933;];

        SecretKey key [color= #339933;]= keygen.[color= #006633;]generateKey[color= #009900;]([color= #009900;])[color= #339933;];

 

        [color= #666666; font-style: italic;]// write key to file

        [color= #003399;]ObjectOutputStream out [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]ObjectOutputStream[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]FileOutputStream[color= #009900;](SECRETFILE[color= #009900;])[color= #009900;])[color= #339933;];

        out.[color= #006633;]writeObject[color= #009900;](key[color= #009900;])[color= #339933;];

        out.[color= #006633;]close[color= #009900;]([color= #009900;])[color= #339933;];

 

        [color= #666666; font-style: italic;]// return key

        [color= #000000; font-weight: bold;]return key [color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]private [color= #003399;]Key loadKey [color= #009900;]([color= #003399;]String keyName[color= #009900;]) [color= #000000; font-weight: bold;]throws [color= #003399;]NoSuchAlgorithmException,[color= #003399;]IOException

             , [color= #003399;]ClassNotFoundException [color= #009900;]{

        [color= #666666; font-style: italic;]// read key from file

        [color= #003399;]ObjectInputStream in [color= #339933;]= [color= #000000; font-weight: bold;]new [color= #003399;]ObjectInputStream[color= #009900;]([color= #000000; font-weight: bold;]new [color= #003399;]FileInputStream[color= #009900;](keyName[color= #009900;])[color= #009900;])[color= #339933;];

        [color= #003399;]Key key [color= #339933;]= [color= #009900;]([color= #003399;]Key[color= #009900;]) in.[color= #006633;]readObject[color= #009900;]([color= #009900;])[color= #339933;];

        in.[color= #006633;]close[color= #009900;]([color= #009900;])[color= #339933;];

 

        [color= #666666; font-style: italic;]// return key

        [color= #000000; font-weight: bold;]return key [color= #339933;];

    [color= #009900;]}

 

    [color= #000000; font-weight: bold;]private [color= #000000; font-weight: bold;]static [color= #000000; font-weight: bold;]final [color= #003399;]String SECRETFILE [color= #339933;]= [color= #0000ff;]"c:[color= #000099; font-weight: bold;]MyKey.AES" [color= #339933;];

 

    [color= #666666; font-style: italic;]// test main

    [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= #000000; font-weight: bold;]try[color= #009900;]{

            Protect pro [color= #339933;]= [color= #000000; font-weight: bold;]new Protect[color= #009900;]([color= #009900;])[color= #339933;];

            pro.[color= #006633;]encrypt[color= #009900;]([color= #0000ff;]"c:[color= #000099; font-weight: bold;]Test.class",[color= #0000ff;]"c:[color= #000099; font-weight: bold;]Test2.class"[color= #009900;])[color= #339933;];

            pro.[color= #006633;]decrypt[color= #009900;]([color= #0000ff;]"c:[color= #000099; font-weight: bold;]Test2.class",[color= #0000ff;]"c:[color= #000099; font-weight: bold;]Test3.class",SECRETFILE[color= #009900;])[color= #339933;];

        [color= #009900;]}

        [color= #000000; font-weight: bold;]catch [color= #009900;]( [color= #003399;]Exception e[color= #009900;]) [color= #009900;]{

            e.[color= #006633;]printStackTrace[color= #009900;]([color= #009900;])[color= #339933;];

        [color= #009900;]}

    [color= #009900;]}

[color= #009900;]}

حاليا كما يتضح من الدالة Main أن البرنامج يتم استدعاء الدالة encrypt وهي تقرأ الملف الأول وتضع الناتج المشفر في الملف الثاني . أما الدالة decrypt فهي تقرأ الملف المشفر وتضعه في الملف الجديد باستخدام المعامل الثالث وهو المفتاح..

المفترض أن يعمل برنامج التشفير بالشكل التالي من سطر الأوامر :

java Protect youclass.class
  java Loader yourclass keyFile

الأمر الأول يقوم بعملية التشفير وسينتج ملف يحتوي على المفتاح ..

الأمر الأخر يقوم بفك التشفير من خلال المفتاح ومن ثم تمرير البايت كود للjvm .

لذلك سيتم التغيير قليلا لجعل البرنامج يستقبل المعاملات من سطر الأوامر .. اضافة لجعل الدالة decrypt ترجع الناتج الجديد ولا تقوم بكتابته مره أخرى .. فنحن نريد هذا الناتج لكي يمرر للjvm .

بالتوفيق ،،

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

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

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

#21

السؤال الأهم هنا هل بإمكان أحد ما أن يقوم بكتابة الملف .class أثناء تواجده في الذاكرة؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#22

من الأفضل أت تفتح موضوعا جديدا خاصا بهذ البرنامج، وأيضا فرصة تتكلم قليلا عن التشفير في الجافا، حتى يستفيد أكبر عدد ممكن

#23

حسنا يمكن فصله في موضوع عن برمجة protector byte code ،، ولكن قم بها أنت أو علاء لأني لا أعرف طريقة فصل المواضيع ،،

بالمناسبة وجدت الكتاب :

51wuKFwnDdL._SL500_AA240_.jpg

التحميل من هنا

بالنسبة للتشفير فأفضل أن نطرح موضوع منفصل نتعرف فيه على امكانيات المكتبة JCA/JCE بشكل موسع من التشفير والهاش والتواقيع الرقمية والى غيره من المواضيع ..

بالتوفيق،،

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

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

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

#24

قمت بفتح موضوع جديد للشيفرة الخاصة بوجدي

بالنسبة لموضوع التشفير

فهذه مهمتك يا وجدي

نريد درس بسيط

بسيط يا وجدي لا نريد مجلدات :lol:

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#25

هههه كويس يا علاء :) ..

قمت بتغير العنوان قليلا وتغير مقدمة الموضوع لكي يفهم القارئ الغرض منه ،،

جزيتم خيرا ، وجوزتم بكرا ..

بالتوفيق ،

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

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

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

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