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

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

بدأه zop2010 في 15 يناير 2011 · 22 رد · 3,997 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الي اعضاء المنتدي الغاليين

تحية طيبة وبعد

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

كان هناك في بعض البرامج مثل C# طرق حماية عن طريق رقم الهار او رقم المازر بورد فهل هذا يتوفر في الجافا وكيف برجاء الرد في اسرع وقت

#2

اهلا اخي الكريم .. ليس لدي معلومات كافيه خاصه بهذا الموضوع

ولكن انظر هذا ربما يفيدك http://download.oracle.com/javase/tutorial/security/tour2/step2.html

تم تعديل هذه المشاركة بواسطة Ahmed-Ghanem في 16 يناير 2011 في 00:48

2coscqr.jpg
#3

لا أدري إذا كانت هناك طريقة سهلة مباشرة لما تريد عمله.

يمكنك مثلا تشفير الملفات class واستعمال class loader خاص لفك التشفير عن الملفات class قبل استعمالها. يمكنك مثلا إعطاء مفتاح خاص يكل مستعمل. هذا موضوع يعطي مثال: حماية ملفات البايت كود

أيضا يجب أن تعرف أن الملفات class سهل أن تستخرج منها الكود باستعمال disassembler. يمكنك استعمال obfuscator لجعل الملفات class صعبة القراءة بالنسبة لل disassemblers

1
#4

الأخ تقريباً يقصد كيف يضمن عدم تشغيل برنامجه في أجهزة أخرى بحيث لو نسخه شخص آخر مايقبل يشتغل عنده , يعني بالعربي يشتغل في جهاز واحد فقط وعشان يقدر يضمن هذا فيحتاج يربطه بالـMac Address أو مثلما يقول رقم الهارد أو الـMother Board , فكيف يقدر يطلع هذه العناوين الخاصة بالهارد وير بأستخدام الجافا؟ بالنسبة للـMac Address :

public class MacAddress {

        public static void main(String[] args) {
        try {
                InetAddress address = InetAddress.getLocalHost();

                /*
                * Get NetworkInterface for the current host and then read the
                * hardware address.
                */
                NetworkInterface ni = NetworkInterface.getByInetAddress(address);
                if (ni != null) {
                byte[] mac = ni.getHardwareAddress();
                if (mac != null) {
                        /*
                        * Extract each array of mac address and convert it to hexa with the
                        * following format 08-00-27-DC-4A-9E.
                        */
                        for (int i = 0; i < mac.length; i++) {
                        System.out.format("%02X%s", mac, (i < mac.length - 1) ? "-" : "");
                        //      System.out.println(mac);
                        }
                } else {
                        System.out.println("Address doesn't exist or is not accessible.");
                }
                } else {
                System.out.println("Network Interface for the specified address is not found.");
                }
        } catch (UnknownHostException e) {
                e.printStackTrace();
        } catch (SocketException e) {
                e.printStackTrace();
        }


        }
}

أما بالنسبة لـسريل الهارد فهذا يعطيك السيريل للمحرك اللي تختاره :



public static class DiskUtils {
private DiskUtils() { }

public static String getSerialNumber(String drive) {
String result = "";
try {
File file = File.createTempFile("arabteam",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);

String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
+"Set colDrives = objFSO.Drives\n"
+"Set objDrive = colDrives.item(\"" + drive + "\")\n"
+"Wscript.Echo objDrive.SerialNumber";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return result;
}

public static void main(String args[]){
String sn = DiskUtils.getSerialNumber("D");
javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
null, sn, "Serial Number of D : ",
javax.swing.JOptionPane.DEFAULT_OPTION);
}
}

أما عن كيفية حماية البرنامج من إمكانية الإطلاع على الكود عن طريق الـDiassembler فمثلما قالوا لك الشباب

تحياتي

تم تعديل هذه المشاركة بواسطة .S.T.A.L.K.E.R في 16 يناير 2011 في 13:54 — السبب: تعديل تنسيق الكود الاول

3


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

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

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

#5

@M.Allaw .. ماشاء الله على الأفكار الجميله..

لكن ألا يوجد طريقة في الجافا لمعرفة السيريال للقرص الصلب؟ (لا أعتقدph34r.gif؟)

#6

جربت الكود الثاني اللي في ردي الأول؟

إذا كنت تقصد بكود جافا خالص فما اعتقد , لكن ممكن تتحايل عليه ولكن المشكلة مابيمشي الا على وندوز فقط مثل المثال اللي فوق :(

تم تعديل هذه المشاركة بواسطة M.Allaw في 16 يناير 2011 في 11:21


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

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

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

#7

أي نعم لأنه vbscript ....

أعتقد أن حل مثل هذه المشكله ربما يكون platform dependent من الدرجه الأولي...

#8
herch كتب:

يمكنك استعمال obfuscator لجعل الملفات class صعبة القراءة بالنسبة لل disassemblers

انا بحثت فى خصائص المشروع عن خاصيه الـ obfuscator

لكنى لم اجدها

بالرغم انى استعملتها قبل كدا فى الـ JavaME

فاين هى بالنسبه للـ JavaSE

وشكرا

Software Developer
Mahmoudkelany.com


 

#9
ProGuard
2
#10
herch كتب:

بس الخاصيه obfuscator

موجوده فى الـ JavaME

post-217802-044258600 1295175923_thumb.p

ولا دى حاجه غيرها ؟؟؟؟

المرفقات
obsfuscator.png

Software Developer
Mahmoudkelany.com


 

#11

الخاصية موجودة في مشاريع ال mobile فقط

#12
herch كتب:

الخاصية موجودة في مشاريع ال mobile فقط

امممم

ماشى تمام

بس انا نزلت البرنامج وحاولت استخدامه لكن دون جدوى

هل يوجد برنامج افضل من ذلك ؟؟

ام هذا افضل شىء

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 16 يناير 2011 في 14:20

Software Developer
Mahmoudkelany.com


 

#13

الطريقة التقليدية هي كما قال اخونا محمد و هي بجعل المستخدم يرسل اي معلومة خاصه بجهازه بحيث لا تتكرر هذه المعلومة مع اي شخص أخر، مثلاً رقم المعالج ورقم الهارد أو اي رقم أخر..

بعد ذلك تقوم بتوليد السيريال نمبر Generation.. ولنفرض الأن انها عباره عن الmd5 hash للرقم الذي يرسله لك الزبون.. وستقوم بارسال السيريال للزبون..

هنا سوف يدخل الزبون السيريال للبرنامج، وهنا عليك أن تحقق من أن السيريال صحيح Verification ، وستقوم بأخذ المعلومة نفسها الذي أرسلها المستخدم لك وأخذ الmd5 hash لها ومقارنتها بالمدخل الذي أدخله المستخدم..

اذا تطابقا فهذا معناه أنه صحيح ولا فهو خاطئي..

المشكلة أن هذه العملية بدائيه جداً وفور تم الكشف عنها ، يمكن لأي مستخدم توليد md5 hash للمعلومة وادخالها للبرنامج وسوف يقول البرنامج انها صحيحة ..وهكذا "يتكرك" البرنامج :).

في الغالب ستجد أن عملية توليد السيريال تكون مكونه من عدة عمليات مثلا xor مع قيمة ، وضرب في قيمة وووالخ.. لكن في النهاية فور كشفها سوف تقع في المصيدة..

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

سوف تعود لنفس المشكلة، وهي أن اي شخص يمكن عمل reverse للبرنامج سوف يمكنه اكتشاف طريقة الحماية وتغييرها، وفي الطريقة اعلاه فقط عليه بتغيير المفتاح العام الخاص بي الى مفتاح عام خاص فيه (عمل Patching للبرنامج) وبعدها سوف "يتكرك" البرنامج أيضاً. على كل الشيء الجيد حقيقة هو قله الخبراء في الbyte code بعكس برامج الويندوز PE حيث أغلب الكراكر لديهم فهم واسع لبنية ويندوز، بعكس الجافا وهذه نقطة في صالحنا :).

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

معذرة على الاطالة :).

بالتوفيق،

4

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

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

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

#14

رد رائع أخي وجدي ... زادك الله من علمه

#15

حياك الله أخوي هويدي..

بالنسبة لاستخراج المعلومات من جهاز الشخص، فيمكن كتابة بريمج كونسول صغير بسي++ وقم باستدعائه من جافا وأخذ الناتج منه،، عملية سريعة ولا تتطلب jni ولا غيره.. وهنا عليك أن تلحق هذا البريمج مع برنامجك عندما ينزل في جهاز العميل (لأنه سوف يستخدم مرة اخرى عند التحقق).

حالياً أعمل على برنامج أستخدم فيه أكثر من 4 c++ console application :).

بالتوفيق ،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 16 يناير 2011 في 21:05

1

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

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

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

#16

+1

بارك الله فيك أخي وجدي وزادك علم إلى علمك (أنا أسميه حامل المسك) happy.gif

بس كيف تقدر تستدعي بريمج بالسي++ بدون الـJNI? تقصد تشغله كـexe عن طريق الـRuntime.exec() إلى داخل process ? ولا في طريقة ثانيه تشغل الكود مباشرة؟

ممكن مثال بسيط وجزاك الله ألف خير أخي وجدي :)


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

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

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

#17
اقتباس
تقصد تشغله كـexe عن طريق الـRuntime.exec() إلى داخل process

وهي كذلك يا محمد،، كل في ما الأمر أنك تقوم بكتابة برنامج سي++ يقوم مثلا بطباعة ما تريد وليكن الرقم 20، في برنامج جافا قم بتشغيل الملف التتنفيذي واقرأ الناتج واستفد منه :) .

بالتوفيق،

2

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

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

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

#18

لكن ستظل نفس المشكله وهي انه لن يعمل الا على الوندوز :(

شكراً جزيلاً حبيبي وجدي وجزاك الله خير , ولك وحشة ياكبير فخلينا نشوفك لا تغيب علينا happy.gif

1


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

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

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

#19
M.Allaw كتب:

لكن ستظل نفس المشكله وهي انه لن يعمل الا على الوندوز :(

شكراً جزيلاً حبيبي وجدي وجزاك الله خير , ولك وحشة ياكبير فخلينا نشوفك لا تغيب علينا happy.gif

يمكنك تضمين أكثر من binary لأكثر من platform ..

1
#20
M.Allaw كتب:

لكن ستظل نفس المشكله وهي انه لن يعمل الا على الوندوز :(

شكراً جزيلاً حبيبي وجدي وجزاك الله خير , ولك وحشة ياكبير فخلينا نشوفك لا تغيب علينا happy.gif

لغة cpp نفسها تتميز بالمحمولية portability لكن يجب ترجمتها compile على اكثر من نظام

مثلا على لينوكس يكون المخرج output بامتداد .out وعلى ويندوز .exe

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

على كل الاستاذ وجدى له خبرة كبيرة وأكيد جرب هذه العملية قبل ذلك

نتمنى ان يضع لنا مثال بسيط عن الية التنفيذ

--------------------------------------------------------

معذرة لم ارى ردك اخى هويدى

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 17 يناير 2011 في 11:51


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#21

فاهم قصدكم بس كان قصدي انه مثلما قال محمد انه لازم تسوي Compile لكل Platform بحيث يقبل التنفيذ على الأنظمة الأخرى , أما كـexe عادي ماتقدر :)

ذلتنا للناس هذه اللغة , في السي تشتغل وراسك مرفوع ولا تحتاج مساعدة من أي لغه أخرى mad.gif , الجافا مشكلتها هنا أن اتفه تعامل مع الهارد وير لازم تستعين بقوات أجنبيه تحل المشاكل المماثلة لأنها رقيقة وتخاف تتعور لوتعاملت مع الهارد وير sleep.gif

بس اللي مستغربله اني شفت بعيني في الـYoutube روبوتات مبرمجة بالجافا !!! ونزلت مرة موضوع عرضت به كم مقطع يبين امكانيات الجافا , بس للآن ماشفناها بالواقع unsure.gif


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

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

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

#22
M.Allaw كتب:

ذلتنا للناس هذه اللغة , في السي تشتغل وراسك مرفوع ولا تحتاج مساعدة من أي لغه أخرى mad.gif , الجافا مشكلتها هنا أن اتفه تعامل مع الهارد وير لازم تستعين بقوات أجنبيه تحل المشاكل المماثلة لأنها رقيقة وتخاف تتعور لوتعاملت مع الهارد وير sleep.gif

ههههههه

مهما كان فالجافا لها جوانب قوية جدا مثل ال hibernate وال rmi و ال network والتقارير jasper report وال mobile application

و java applets و java web start و enterprise java beans وغيرهم الكثير

من الاخر ابتعد عن استخدام الجافا فى low-level programming

1


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#23

والله شيء جميل ورائع وشكرا لك اخي

إذا نظــرتَ نيـوب اللـّيـثِ بـارزةً         فـلا تظــنَنَ أَنَّ اللـّيـــثَ يبْتسـِـــمُ


 


 


رسم المخططات البيانية بواسطة الجافا


 


كتاب تحليل وتصميم نظم المعلومات


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