انسخ الكود
private void InitializeComponent() { this.button_crypter = new System.Windows.Forms.Button(); this.DontDoAnyThing(“APXS”); // كود ميت this.button_decrypter = new System.Windows.Forms.Button(); this.BlaBlaBla(new System.Windows.Forms.Button()); // كود ميت this.button1 = new System.Windows.Forms.Button(); this.AlwaysNoThing(50, -10) ; // كود ميت this.SuspendLayout() ; this.AnOtherNoThing() ; // كود ميت }
- مثال عن إضافة control structure لغة C
قيل
انسخ الكود
for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { tab[i,j] = fct(i,j); } }
بعد
انسخ الكود
for(int I=1; I<=n; I+64) { for(int J=1; J<=n; J+64) { for(int i=I; i<=min(I+63,n); i++) { for(int j=J; j<=min(J+63,n); j++) { tab[i,j] = fct(i,j); } } } }
تغيير ترتيب الـ Boolean expression
إضافة Arguments إضافية للدوال (Arguments غير مستعملة)
تغليف الـ data structure المستعملة بإضافة طبقات من الـ control structure عليها (دون تأثير على الكود)
تعقيد بنية الجداول (استعمال جداول ثلاثية الأبعاد بدل ثنائية الأبعاد ...)
تعقيد الحلقات التكرارية (إضافة حلقات دون التأثير في سير البرنامج)
تكرير ظهور متغيرات في العمليات الحسابية (مثل إضافة و طرح نفس القيمة)
تحويل الكود من تسلسلي إلى تفرعي : الغرض من ذلك ليس تحسين أداء البرنامج و إنما يصعب على برامج De-obfuscater تحليل الكود التفرعي
يمكن تحويل أي كود تسلسلي إلى تفرعي ما لم يكن هناك ارتباطات بين أقسامه فمثلا يمكن استعمال الـ threads في الـ java و إذا وجدنا ترابطات في أجزاء الكود نحل هذه المعضلة باللجوء إلى الـ Synchronisation
مثال عن كود تفرعي في الـ java
قبل
انسخ الكود
void methode() { // instruction 1 // instruction 2 // instruction 3 }
بعد
انسخ الكود
// 1st thread class methodeA extends Thread { methodeA() { } public void run() { // instruction 1 // instruction 2 } } // 2nd thread class methodeB extends Thread { methodeB() { } public void run() { // instruction 3 } } void methodeC() { methodeA mA = new methodeA(); mA.run(); methodeB mB = new methodeB(); mB.run(); }
تحويل كود من class إلى آخرى
تقسيم بعض الدوال إلى مجموعة دوال جزئية
مثال عن تقسيم دالة في الـ PHP
قبل
انسخ الكود
function [url="http://fr.php.net/manual/fr/function.count.php"]count[/url]($id) { $fichier=$id.".cpt"; if(![url="http://fr.php.net/manual/fr/function.file-exists.php"]file_exists[/url]($fichier)) { $fp=[url="http://fr.php.net/manual/fr/function.fopen.php"]fopen[/url]($fichier,"w"); [url="http://fr.php.net/manual/fr/function.fputs.php"]fputs[/url]($fp,"0"); [url="http://fr.php.net/manual/fr/function.fclose.php"]fclose[/url]($fp); } $fp=[url="http://fr.php.net/manual/fr/function.fopen.php"]fopen[/url]($fichier,"r+"); $hits=[url="http://fr.php.net/manual/fr/function.fgets.php"]fgets[/url]($fp,10); $hits++; [url="http://fr.php.net/manual/fr/function.fseek.php"]fseek[/url]($fp,0); [url="http://fr.php.net/manual/fr/function.fputs.php"]fputs[/url]($fp,$hits); [url="http://fr.php.net/manual/fr/function.fclose.php"]fclose[/url]($fp); }
بعد
انسخ الكود
function [url="http://fr.php.net/manual/fr/function.count.php"]count[/url]($id) { $fichier=$id.".cpt"; create($fichier); write($fichier); } function create($fichier) { if(![url="http://fr.php.net/manual/fr/function.file-exists.php"]file_exists[/url]($fichier)) { $fp=[url="http://fr.php.net/manual/fr/function.fopen.php"]fopen[/url]($fichier,"w"); [url="http://fr.php.net/manual/fr/function.fputs.php"]fputs[/url]($fp,"0"); [url="http://fr.php.net/manual/fr/function.fclose.php"]fclose[/url]($fp); } } function write($fichier) { $fp=open($fichier,"r+"); $hits=[url="http://fr.php.net/manual/fr/function.fgets.php"]fgets[/url]($fp,10); $hits = calculate($hits); [url="http://fr.php.net/manual/fr/function.fseek.php"]fseek[/url]($fp,0); [url="http://fr.php.net/manual/fr/function.fputs.php"]fputs[/url]($fp,$hits); [url="http://fr.php.net/manual/fr/function.fclose.php"]fclose[/url]($fp); } function open($fichier, $opt) { $fp=[url="http://fr.php.net/manual/fr/function.fopen.php"]fopen[/url]($fichier, $opt); return $fp; } function calculate($hits) { return $hits++; }
تجميع أقسام بعض الدوال في دالة واحدة
استعمال دوال شبيهة بدل الدالة الأصلية
انسخ الكود
public Graphe Ajouterlesommet(Object s) { if(!Recherchersommet(s)) { Cellgraphe c = new Cellgraphe(s); listcell.Insererapres(c); } return this; }
مثال1 عن دالة شبيهة
انسخ الكود
// clone n°1 public Graphe AjouterUnSommet(Object sommet) { if(!Recherchersommet(sommet)) { Cellgraphe cell = new Cellgraphe(sommet); listcell.Insererapres(cell); } return this; }
مثال2 عن دالة شبيهة
انسخ الكود
// clone n°2 public Graphe AjouterSommet(Object s) { if(Recherchersommet(s) != 0) { Cellgraphe c = new Cellgraphe(s); listcell.Insererapres(c); } return this; }
مثال3 عن دالة شبيهة
انسخ الكود
// clone n°3 public Graphe Ajouter1sommet(Object obj) { if(!Recherchersommet(obj)) Cellgraphe c = new Cellgraphe(obj); if(!Recherchersommet(obj)) listcell.Insererapres(c); return this; }
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
--------------------
أخطر ثغرة أمنية في كل الأجهزة موجودة ما بين شاشة الحاسب و الكرسي
فاحذر منها