• 0
djug

Obfuscation : حماية البرنامج من الهندسة العكسية

سؤال

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

أ/مخاطر الهندسة العكسية

تتمثل الهندسة العكسية في إمكانية الحصول على الكود المصدري للبرنامج من هيئته المترجمة (compiled ) المقدمة من طرف الشركة المبرمجة. يمكن ذلك من فهم أدق تفاصيل البرنامج.

قد يلجأ منافسك إلى الهندسة العكسية لمعرفة الخوارزميات المستعملة في برنامجك و لسرقة أسرارها .

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

ب/تقنيات الحماية

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

  • Obfuscation : تحويل الكود المصدري قبل مرحلة الترجمة بطريقة تجعله غير مفهوم لقارئه (الإنسان طبعا و ليس المترجم)
  • التشفير : تضمن حماية تامة لكودك المصدري مادام خوارزمية التشفير المستعملة لم تكسر بعد و المفتاح المستعمل لم يتم إيجاده
  • استعمال البرنامج عن بعد: حيث لا يقدم للزبون برنامجا جزئيا فقط .يقوم هذا البرنامج باستدعاء الأجزاء التي يحتاجها من Server محمي.
  • كتابة براج لمعمارية خاصة (hardware خاص ) يعقد من مهمة إيجاد Decompiler لذلك

ج/لماذا نستعمل الـ Obfuscation

.تتميز هذه التقنية بـ:

الأقل تكلفة من منافساتها

الأسهل من ناحية الاستعمال (لا تتطلب معمارية معينة)

لا تظهر آثاره للمستخدم العادي

لا تأثر على إنتاجية المبرمج.

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

توجد –بطبيعة الحال- أدوات تحاول عكس هذه العملية( DeObfuscation) . الصراع ما زال قائما بين مبرمجي أدواة الـ Obfuscation و بين مبرمجي de Obfuscation .لهذا يجب اختيار برنامج Obfuscation بدقة تسمح لك بحماية برنامجك و لو لحين

II/تقنيات Obfuscation

توجد عدة تقنيات للـ Obfuscation لعل من أهمها:

أ/تغيير Style الكود:

يتم ذلك بـ:

إعادة تسمية المعرفات : من متغيرات إلى أسماء الدوال مرورا بأسماء الـ class ...

حذف التعليقات Comments

حذف إعلانات الـ API غير المستعملة

حذف أنماط التنسيق و أنماط كتابة الكود

1/إعادة تسمية المعرفات:

تعتبر هذه التقنية أولى التقنيات المستعملة في الـ Obfuscation . يتمثل ذلك في إعادة تسمية كل من

Variables , constantes , class,methodes,attributs..

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

تسمى عملية إعادة التسمية بـ Refactoring .أن تقوم بكتابة برنامج يقوم بهذه العلمية ليس بالأمر الهين بسبب وجود ترابطات قريبة وبعيد بين أجزاء البرنامج (افرض أنك قمت بتغيير اسم class في الملف الذي يحتوي تعريفها لكنك نسيت تغييره في الملفات التي تستعمل هذه الـ class ).

لكن كيف يتم اختيار الأسماء الجديدة:

هناك عدة طرق:

الطريقة العشوائية: نقوم بتوليد أسماء عشوائية (لا يولد نفس الاسم أكثر من مرة) .

طريقة Overload Induction نقوم بتوليد أسماء بأحجام تصاعدية

نبدأ بـ a() ثم b() ثم ........ثم aa() .....

تسمح هذه الطريقة بإمكانية إعطاء نفس الاسم لعدة دوال (مبدأ Overload ). مما يسمح بتصغير حجم الكود المصدري في النهاية

طريقة الإخفاء: توليد أسماء تحوي على حروف ممنوع استعمالها في لغة البرمجة و في الـ decompilers .

مثال عن كود Java قبل عملية الـ Obfuscation

انسخ الكود
  1.  
  2.  
  3. public synchronized void put(int key, Employee value) {
  4.  
  5. Integer I = new Integer(key);
  6.  
  7. super.put(I, (Object) value);
  8.  
  9. }
  10.  
  11.  

بعد عملية الـ Obfuscation باستعمال الطريقة العشوائية

انسخ الكود
  1.  
  2.  
  3.  
  4. public synchronized void yrwla35rn3z22jd0sci9(int sbhc8wduotn7gkbr8pq6, k0j9y980ekqci18t09ju 78nrx59777f4io0qpg7t) {
  5.  
  6. Integer f841593p5rh12zf88285 = new Integer(sbhc8wduotn7gkbr8pq6);
  7.  
  8. super.yrwla35rn3z22jd0sci9(f841593p5rh12zf88285, (Object) 78nrx59777f4io0qpg7t);
  9.  
  10. }
  11.  

بعد استعمال الـOverload Induction

انسخ الكود
  1.  
  2. public synchronized void a(int a, b c) {
  3.  
  4. Integer d = new Integer(a);
  5.  
  6. super.a(d, (Object) c);
  7.  
  8. }
  9.  
  10.  
  11.  

بعد استعمال طريقة الإخفاء

انسخ الكود
  1.  
  2.  
  3.  
  4. public synchronized void #~a(int @b, f# a~) {
  5.  
  6. Integer #~b = new Integer(@b);
  7.  
  8. super.#~a(#~b, (Object) a~);
  9.  
  10. }
  11.  

2/حذف التعليقات:

أحيانا تقاس جودة مشروع ما بكمية التعليقات الموجودة فيه (مثل استعمال JavaDoc في الـ Java) قد تصل نسبة التعليقات في بعض المشاريع إلى نسبة 50% من إجمالي الكود. تسهل وجود تعليقات مفصلة عملية التنقيح.

لذا فإن استعمال الـ Obfuscation يقضي نهائيا على هذه التعليقات

انسخ الكود
  1.  
  2. /**
  3.  
  4.  * Comment1
  5.  
  6.   * Comment2
  7.  
  8.   * Comment3
  9.  
  10.   * Comment4
  11.  
  12.   * Comment5
  13.  
  14.   * Comment6
  15.  
  16.   */
  17.  
  18. public Branch findBranch(String number) throws ProblemException {
  19.  
  20.  
  21.  
  22. Branch b = null;
  23.  
  24.  
  25.  
  26. try {
  27.  
  28.  
  29.  
  30. // Comment
  31.  
  32. if ( (b = (Branch) (entries.get(number))) != null ) {
  33.  
  34. System.out.println("the branch " + number + " found");
  35.  
  36. }
  37.  
  38. // Comment
  39.  
  40. else {
  41.  
  42. throw new ProblemException("BankImpl.findBranch", "no branch found !");
  43.  
  44. }
  45.  
  46.  
  47.  
  48. } catch(ProblemException e) {
  49.  
  50. System.out.println("BankImpl.findBranch : error in finding - " + e.getMessage());
  51.  
  52. }
  53.  
  54.  
  55.  
  56. return b;
  57.  
  58. }
  59.  
  60.  
  61.  

بعد حذف التعليقات

انسخ الكود
  1.  
  2.  
  3.  
  4. public Branch findBranch(String number) throws ProblemException {
  5.  
  6.  
  7.  
  8. Branch b = null;
  9.  
  10.  
  11.  
  12. try {
  13.  
  14.  
  15.  
  16. if ( (b = (Branch) (entries.get(number))) != null ) {
  17.  
  18. System.out.println("the branch " + number + " found");
  19.  
  20. }
  21.  
  22. else {
  23.  
  24. throw new ProblemException("BankImpl.findBranch", "no branch found !");
  25.  
  26. }
  27.  
  28.  
  29.  
  30. } catch(ProblemException e) {
  31.  
  32. System.out.println("BankImpl.findBranch : error in finding - " + e.getMessage());
  33.  
  34. }
  35.  
  36.  
  37.  
  38. return b;
  39.  
  40. }
  41.  

3/حذف أنماط التنسيق:

يسهل استعمال أنماط التنسيق لدى كتابة الكود تسهيل الوصول إلى الكود (رؤية جيدة) . حيث يبنى المشاريع عادة على نمط واحد يتفق عليه في البداية.. قد يتعدى استعمال الأنماط إلى استعمال نمط لتسمية المتغيرات.

مثال كود java يتبع نمطا معينا

انسخ الكود
  1.  
  2.  
  3.  
  4. package bankServices;
  5.  
  6.  
  7.  
  8. import org.omg.CORBA.*;
  9.  
  10. import org.omg.PortableServer.*;
  11.  
  12. import org.omg.PortableServer.POA;
  13.  
  14.  
  15.  
  16. import java.util.HashMap;
  17.  
  18.  
  19.  
  20. public class BankImpl extends BankPOA {
  21.  
  22.  
  23.  
  24. private HashMap entries;
  25.  
  26.  
  27.  
  28. public void unregisterBranch(String number) throws ProblemException {
  29.  
  30.  
  31.  
  32. try {
  33.  
  34.  
  35.  
  36. Branch b = (Branch) (entries.get(number));
  37.  
  38.  
  39.  
  40. if(b != null) {
  41.  
  42. entries.remove(number);
  43.  
  44. System.out.println("the branch " + number + " is deleted");
  45.  
  46. return;
  47.  
  48. } else {
  49.  
  50. throw new ProblemException("BankImpl.unregisterBranch","no branch reference found !");
  51.  
  52. }
  53.  
  54.  
  55.  
  56. } catch(ProblemException e) {
  57.  
  58. System.out.println("BankImpl.unregisterBranch : error in unregistering - " + e.getMessage());
  59.  
  60. }
  61.  
  62.  
  63.  
  64. }
  65.  
  66. }
  67.  

بعد حذف النمط:

انسخ الكود
  1.  
  2.  
  3.  
  4. package bankServices;
  5.  
  6. import org.omg.CORBA.*;
  7.  
  8. import org.omg.PortableServer.*;
  9.  
  10. import org.omg.PortableServer.POA;
  11.  
  12. import java.util.HashMap;
  13.  
  14. public class BankImpl extends BankPOA{private HashMap entries;public void unregisterBranch(String number) throws ProblemException{
  15.  
  16. try{Branch b=(Branch)(entries.get(number));if(b!=null){entries.remove(number);System.out.println("the branch "+number+" is deleted");
  17.  
  18. return;}else{throw new ProblemException("BankImpl.unregisterBranch","no branch reference found !");
  19.  
  20. }}catch(ProblemException e){System.out.println("BankImpl.unregisterBranch : error in unregistering - " + e.getMessage());}}}
  21.  
  22.  
  23.  
  24.  
  25.  

4/حذف إعلانات الـ API غير المستعملة

يمكن لإعلانات الـApi المستعملة إعطاء فكرة عن نوعية الخوارزميات المستعملة

أحيانا ما يتم استدعاء مكتبات كاملة في حين يمكن استدعاء أجزاء محددة منها

الحد من هذه العملية قد يساعد على تصعيب عملية الهندسة العكسية

توجد هذه الخاصية في العديد من الـ IDE فمثلا في Eclipse يمكن عمل ذلك بـ : Source > Organize imports

مثال:

.قبل

انسخ الكود
  1.  
  2.  
  3.  
  4. import org.omg.CORBA.*;
  5.  
  6. import org.omg.PortableServer.*;
  7.  
  8. import org.omg.PortableServer.POA;
  9.  
  10. import java.util.HashMap;
  11.  

بعد

انسخ الكود
  1.  
  2.  
  3.  
  4. import org.omg.CORBA.ORB;
  5.  
  6. import org.omg.PortableServer.POA;
  7.  
  8. import java.util.HashMap;
  9.  

حذف أوامر الـتنقيح و الترجمة

يمكن في بعض الأحيان حذف هذه الأوامر .يخص هذا الأمر لغة البرمجة التي نطبق عليها Obfuscation (ليس الكود المصدري و إنما الـ Bytecode في حالة الـ java ، managed code في حالة الـ DotNet أو أي preCompiled code الذي لم يعد بحاجة إلى مثل هذه الأوامر)

ب-البيانات

1/تشفير الجمل

يسمح تشفير الجمل من إخفاء محتوياتها .(تخفى دالة و مفتاح التسفير داخل الكود)

مثال(تشفير e-mail بالـ javaScript )

انسخ الكود
  1.  
  2. <script type="text/javascript"> <!--
  3.  
  4. Ch=new Array(4);
  5.  
  6. Res=new Array(4);
  7.  
  8. Ch[0]='le_club_des_developeur';
  9.  
  10. Ch[1]='ÙÆÈÏàä';
  11.  
  12. Ch[2]='¬×ÄÇÍØÖÈÓÓ';
  13.  
  14. Ch[3]='ÐÊÕÈØäÒÏÉß¡ÂÓÒ';
  15.  
  16. for(y=1;y<4;y++){
  17.  
  18. Res[y]="";
  19.  
  20. for(x=0;x<Ch[y].length;x++)
  21.  
  22. Res[y]+=String.fromCharCode(Ch[y].charCodeAt(x)-Ch[0].charCodeAt(x));
  23.  
  24. }
  25.  
  26. document.write('<a href="'+Res[1]+':webmaster'+Res[2]+'-'+Res[3]+'">webmaster'+Res[2]+'-'+Res[3]+'</a>');
  27.  
  28. //-->
  29.  
  30. </script>
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  

2/تغيير نوع المتغير تغيير نوع المتغيرات يزيد من تعقيد و حجم الكود الذي يتم تحليله لاستخراج الكود المصدري

فمثلا في java استعمال integer بدل int يزيد من تعقيدات De-obfuscater

إضافة إلى أنه إذا تم تغيير نوع متغير من نوعه الأول إلى نوع آخر مركب فإن درجة التعقيد تزيد أكثر

3/إعادة ترتيب الجداول

قد يوحي محتوى بعض الجداول بنوعية الخوارزمية المستعملة (مثال على جدول يحتوي على رموز البلدان أو أسعار العملات...)

و عليه فإن تغيير ترتيب محتويات الجداول تعقد من مهمة الـ De-obfuscater

يجب التنويه إلى ضرورة كتابة دوال تعيد ترتيب الجداول في حال ما إذا كان هذا الترتيب مهما في البرنامج.

4/ تغيير مدى صلاحية المتغيرات

تحويل جميع المتغيرات الظرفية (local) إلى عامة (global) يعقد من مهمة De-obfuscater خاصة إذا كان هناك عدة متغيرات local تحمل نفس الاسم: نفس المعرف لعدة دوال يصعب من فهم أي دالة تقوم بأي عمل.

5/تعديد معرفات نفس المتغير:

يؤدي ذلك إلى (طبعا باستعمال المؤشرات Pointer ) إلى إطالة زمن عملية De-obfuscater و إخفاء مبدأ عمل أجزاء(قد تكون جد مهمة) من الخوارزميات.

ج/بنية البرنامج:

تغيير بنية البرنامج هي الحجز الأساس في عملية الـ obfuscater

1/ تغيير بنى الـ class

يتم تغيير بنى الـ class بتجميع البعض في class أشمل أو تقسيم أخرى أو تعميق سلسلة التوريث (مثلا الـ class A يرث من الـ class B نقوم بإنشاء عدة class تقوم بالتوريث لبعضها البعض لصنع سلسلة من التوريثات تبدأ بـ B لتنتهي عند A )

2/ control structures

توجد العديد من الطرق التي تساعد في خداع محلل الكود

  • إضافة control structures و التي تعطي دائما نفس النتيجة (لا تأثر على بقية البرنامج) و إيهام المحلل أن هذه الـ control structures تلعب دورا أساسيا في البرنامج
  • تكبير حجم الكود بإضافة دوال و class لا يحتاجها البرنامج
  • إضافة كود "ميت" لا يؤثر على مسار البرنامج (لكن يؤثر في زمن التشغيل)

- مثال عن إضافة كود "ميت" في C#

انسخ الكود
  1.  
  2.  
  3.  
  4. private void InitializeComponent()
  5.  
  6. {
  7.  
  8. this.button_crypter = new System.Windows.Forms.Button();
  9.  
  10. this.DontDoAnyThing(“APXS”); // كود ميت
  11.  
  12. this.button_decrypter = new System.Windows.Forms.Button();
  13.  
  14. this.BlaBlaBla(new System.Windows.Forms.Button()); // كود ميت
  15.  
  16. this.button1 = new System.Windows.Forms.Button();
  17.  
  18. this.AlwaysNoThing(50, -10) ; // كود ميت
  19.  
  20. this.SuspendLayout() ;
  21.  
  22. this.AnOtherNoThing() ; // كود ميت
  23.  
  24. }
  25.  

- مثال عن إضافة control structure لغة C

قيل

انسخ الكود
  1.  
  2.  
  3.  
  4. for(int i=1; i<=n; i++) {
  5.  
  6. for(int j=1; j<=n; j++) {
  7.  
  8. tab[i,j] = fct(i,j);
  9.  
  10. }
  11.  
  12. }
  13.  

بعد

انسخ الكود
  1.  
  2.  
  3.  
  4. for(int I=1; I<=n; I+64) {
  5.  
  6. for(int J=1; J<=n; J+64) {
  7.  
  8. for(int i=I; i<=min(I+63,n); i++) {
  9.  
  10. for(int j=J; j<=min(J+63,n); j++) {
  11.  
  12. tab[i,j] = fct(i,j);
  13.  
  14. }
  15.  
  16. }
  17.  
  18. }
  19.  
  20. }
  21.  

  • تغيير ترتيب الـ Boolean expression
  • إضافة Arguments إضافية للدوال (Arguments غير مستعملة)
  • تغليف الـ data structure المستعملة بإضافة طبقات من الـ control structure عليها (دون تأثير على الكود)
  • تعقيد بنية الجداول (استعمال جداول ثلاثية الأبعاد بدل ثنائية الأبعاد ...)
  • تعقيد الحلقات التكرارية (إضافة حلقات دون التأثير في سير البرنامج)
  • تكرير ظهور متغيرات في العمليات الحسابية (مثل إضافة و طرح نفس القيمة)
  • تحويل الكود من تسلسلي إلى تفرعي : الغرض من ذلك ليس تحسين أداء البرنامج و إنما يصعب على برامج De-obfuscater تحليل الكود التفرعي

يمكن تحويل أي كود تسلسلي إلى تفرعي ما لم يكن هناك ارتباطات بين أقسامه فمثلا يمكن استعمال الـ threads في الـ java و إذا وجدنا ترابطات في أجزاء الكود نحل هذه المعضلة باللجوء إلى الـ Synchronisation

مثال عن كود تفرعي في الـ java

قبل

انسخ الكود
  1.  
  2. void methode() {
  3.  
  4. // instruction 1
  5.  
  6. // instruction 2
  7.  
  8. // instruction 3
  9.  
  10. }
  11.  

بعد

انسخ الكود
  1.  
  2. // 1st thread
  3.  
  4. class methodeA extends Thread {
  5.  
  6. methodeA() {
  7.  
  8. }
  9.  
  10.  
  11.  
  12. public void run() {
  13.  
  14. // instruction 1
  15.  
  16. // instruction 2
  17.  
  18. }
  19.  
  20. }
  21.  
  22.  
  23.  
  24. // 2nd thread
  25.  
  26. class methodeB extends Thread {
  27.  
  28. methodeB() {
  29.  
  30. }
  31.  
  32.  
  33.  
  34. public void run() {
  35.  
  36. // instruction 3
  37.  
  38. }
  39.  
  40. }
  41.  
  42. void methodeC() {
  43.  
  44. methodeA mA = new methodeA();
  45.  
  46. mA.run();
  47.  
  48. methodeB mB = new methodeB();
  49.  
  50. mB.run();
  51.  
  52. }
  53.  
  54.  
  55.  

  • تحويل كود من class إلى آخرى
  • تقسيم بعض الدوال إلى مجموعة دوال جزئية

مثال عن تقسيم دالة في الـ PHP

قبل

انسخ الكود
  1.  
  2.  
  3. $fichier=$id.".cpt";
  4.  
  5.  
  6.  
  7.  
  8.  
  9. }
  10.  
  11.  
  12.  
  13. $hits++;
  14.  
  15.  
  16.  
  17.  
  18. }
  19.  

بعد

انسخ الكود
  1.  
  2.  
  3.  
  4.  
  5. $fichier=$id.".cpt";
  6.  
  7. create($fichier);
  8.  
  9. write($fichier);
  10.  
  11. }
  12.  
  13. function create($fichier) {
  14.  
  15.  
  16.  
  17.  
  18.  
  19. }
  20.  
  21. }
  22.  
  23. function write($fichier) {
  24.  
  25. $fp=open($fichier,"r+");
  26.  
  27.  
  28. $hits = calculate($hits);
  29.  
  30.  
  31.  
  32.  
  33. }
  34.  
  35. function open($fichier, $opt) {
  36.  
  37. $fp=[url="http://fr.php.net/manual/fr/function.fopen.php"]fopen[/url]($fichier, $opt);
  38.  
  39. return $fp;
  40.  
  41. }
  42.  
  43. function calculate($hits) {
  44.  
  45. return $hits++;
  46.  
  47. }
  48.  

  • تجميع أقسام بعض الدوال في دالة واحدة
  • استعمال دوال شبيهة بدل الدالة الأصلية

انسخ الكود
  1.  
  2.  
  3.  
  4. public Graphe Ajouterlesommet(Object s) {
  5.  
  6. if(!Recherchersommet(s)) {
  7.  
  8. Cellgraphe c = new Cellgraphe(s);
  9.  
  10. listcell.Insererapres(c);
  11.  
  12. }
  13.  
  14. return this;
  15.  
  16. }
  17.  

مثال1 عن دالة شبيهة

انسخ الكود
  1.  
  2.  
  3.  
  4. // clone n°1
  5.  
  6. public Graphe AjouterUnSommet(Object sommet) {
  7.  
  8. if(!Recherchersommet(sommet)) {
  9.  
  10. Cellgraphe cell = new Cellgraphe(sommet);
  11.  
  12. listcell.Insererapres(cell);
  13.  
  14. }
  15.  
  16. return this;
  17.  
  18. }
  19.  

مثال2 عن دالة شبيهة

انسخ الكود
  1.  
  2.  
  3.  
  4. // clone n°2
  5.  
  6. public Graphe AjouterSommet(Object s) {
  7.  
  8. if(Recherchersommet(s) != 0) {
  9.  
  10. Cellgraphe c = new Cellgraphe(s);
  11.  
  12. listcell.Insererapres(c);
  13.  
  14. }
  15.  
  16. return this;
  17.  
  18. }
  19.  

مثال3 عن دالة شبيهة

انسخ الكود
  1.  
  2.  
  3.  
  4. // clone n°3
  5.  
  6. public Graphe Ajouter1sommet(Object obj) {
  7.  
  8. if(!Recherchersommet(obj))
  9.  
  10. Cellgraphe c = new Cellgraphe(obj);
  11.  
  12. if(!Recherchersommet(obj))
  13.  
  14. listcell.Insererapres(c);
  15.  
  16. return this;
  17.  
  18. }
  19.  

III/فعالية الـ Obfuscation

تتجلى فعالية الـ Obfuscation في الجهد المبذول لكتابة برنامج de- Obfuscation و في الوقت المبذول و في نوعية و كمية الموارد المستعملة في عملية de- Obfuscation .

يمكن مقارنة Obfuscation بالتشفير : حيث أنه يجب كتابة برنامج ذو كفاءة عالية يجعل من الصعب جدا إيجاد حل له (خصوصا في ما يتعلق بمعامل الزمن). لكن و مع التقدم التكنولوجي السريع و السرعات المتزايدة المتوفرة في أجهزة الحاسب يقلص من زمن حماية البرامج

.IV /حدود الـ Obfuscation :

  • محدودية زمن الحماية
  • لا يوجد تأثير بخصوص الثغرات الأمنية
  • تعقيدات الحماية تزيد من الزمن المستغرق لتشغيل البرنامج
  • تدني مستوى الخوارزميات المستعملة مما يحرمها من إمكانية الحصول على certification
  • استحالة تمويه استعمال الـ API الخارجية
  • لجوء مبرمجي برامج de-Obfuscation لتجريب برامج Obfuscation المتوفرة لتجريبها (تطبيقها على كود معين و من ثم تحليل النتائج) مما قد يدفع أحيانا إلى استعمال برنامج Obfuscation خاص بك مما يؤدي إلى تدني مستوى الحماية (حلقة مفرغة)

.IV /خاتمة:

قدمنا لكم في هذا المقال أساسيات Obfuscation و سردا لمحاسنها و مساوئها. الحرب لا تزال قائمة بين الـ Obfuscators و الـ de-Obfuscators مثلما هو الحال بالنسبة للمشفرين و كاسري التشفير. هذا الحال يدفع عجلة تطوير هذا المجال.

لا يمكن اعتبار الـ Obfuscation حلا مثاليا و طويل المدى لحماية برامجك (حقوق الملكية الفكرية). إضافة إلى التدني المعتبر لمستوى و نوعية البرنامج .

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

عنوان المقال الأصلي:.

Obfuscation : protection du code source contre le reverse engineering

رابط المقال الأصلي :

http://cyberzoide.developpez.com/securite/obfuscation/

كاتب المقال الأصلي:

Hugo Etiévant

تمت الترجمة في 17/07/2008

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

11 إجابة على هذا السؤال .

  • 0

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

فأي واحد يفك قاعدة البيانات لن يفهم منها شيء فأسماء الجداول والحقول عشوائية ...

تم تعديل بواسطه خالد_الحوراني
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله ألف خير أخي الفاضل , تستاهل 100 زر شكر على هذه المعلومات , ولكن لدي بعض الملاحظات :

public synchronized void a(int a, b c) {

Integer d = new Integer(a);

super.a(d, (Object) c);

}

انت استعملت المعرف d مع انك لم تعرفه , وإنما قمت بتعريف b , فهل هذا مسموح في JAVA ؟

طريقة الإخفاء: توليد أسماء تحوي على حروف ممنوع استعمالها في لغة البرمجة و في الـ decompilers .

وهل سيقوم المترجم بترجمة برنامج فيه أحرف ممنوعة ؟!

وجزاك الله خيرا أخي , وننتظر جديدك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بخصوص الملاحظة الأولى

لاحظ السطر الثاني من الاقتباس (Integer d)

بخصوص الملاحظة سأبحث و أجيبك إن شاء الله (قمت بترجمتها كما هي :) )

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا أخي على المعلومة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

مشكور على ترجمة المقال المفيد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخ djug

مقال جميل جداً

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

سأحاول أن أبحث في الموضوع

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ماشاء الله، جزاك الله خيرا أخي الفاضل

فقط سؤال من أخوك مبتدأ

- هل حقا تعتبر لغة البايثون ضعيفة من ناحية الهندسة العكسية وكسر برامجها ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك اخي djug على هذا المقال الجيد .

يوجد كذلك مقال جيد باللغة الانجليزية لصاحبه Chris Wysopal يتحدث عن استعمال ال Obfuscation .

رابط الموضوع : Good Obfuscation, Bad Code

تم تعديل بواسطه mohfa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
- هل حقا تعتبر لغة البايثون ضعيفة من ناحية الهندسة العكسية وكسر برامجها ؟

حقيقة لا أدري عن هذا الأمر

هل لنا بالمصادر التي قرأت منها عن الموضوع؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تستاهل الشكر

انا صراحة افضل Obfuscate وبعض الالعاب داخل الكود

واظنها افضل طريقة لحماية البرنامج بعد عملية التشفير المعقدة طبعا

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

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

جميع اخطاء البرنامج تصلني الى البريد الالكتروني واستطيع تحميل تقارير الاخطاء في نفس البرنامج تحتوي على رقم السطر الذي حصل فيه الخطأ

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

تم تعديل بواسطه blackeyes
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

قرأت البداية و الأسلوب في الترجمة واضح ومفيد :)

لي عودة بإذن الله لإستكمال القراءه

شكرًا لك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .