مؤتمر DEFCON 18. Trollim الهندسة العكسية باستخدام الرياضيات

التصيد في الرياضيات هو ما سأتحدث عنه. هذه ليست بعض الحيل القراصنة العصرية ، بل هو تعبير فني ، تقنية ذكية مضحكة بحيث يعتبرك الناس معتوه. الآن سوف أتحقق مما إذا كان تقريري جاهزًا للعرض على الشاشة. يبدو أن كل شيء على ما يرام ، حتى أتمكن من تقديم نفسي.



اسمي Frank Tu ، مكتوبًا صريحًا ^ 2 وfranksquared على Twitter ، لأن Twitter يحتوي أيضًا على نوع من مرسلي البريد العشوائي المسمى "frank 2". لقد حاولت تطبيق الهندسة الاجتماعية عليهم حتى قاموا بحذف حسابه ، لأنه من الناحية الفنية هو بريد مزعج ولدي الحق في التخلص منه كنسخة لي. لكن على ما يبدو ، إذا عاملتهم بأمانة ، فإنهم لا يردون بالمثل ، لأنه على الرغم من طلبي بحذف حساب مرسلي البريد العشوائي ، فإنهم لم يفعلوا أي شيء به ، لذا فقد أرسلت هذا Twitter سخيف إلى الجحيم.

يتعرف كثير من الناس على قلبي. أنا أعمل في المجموعات الإقليمية DefCon DC949 و DC310. أنا أيضًا أعمل مع Rapid7 ، لكن لا يمكنني التحدث عن ذلك هنا دون استخدام اللغة البذيئة ، ولا يريد من مديري أن أقسم. لذلك ، أعددت هذا العرض التقديمي لـ DefCon وسألتقي بالموعد النهائي المحدد بـ 15 دقيقة ، رغم أن هذا موضوع معقد إلى حد ما. هذا هو في الأساس عرض تقديمي قياسي يركز على الهندسة العكسية والأشياء المضحكة ذات الصلة.

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



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

يعتبر موضوع محادثتي روتينًا قياسيًا للمتسللين ، ولكن يبدو لي أن المتحدثين في الواقع لا يحاولون تقديم معلوماتهم بطريقة مسلية ، حتى لو كان ذلك ممكنًا ، ويفضلون الاستنتاجات الجافة غير المقلدة. "هنا IP ، هنا ESP ، إليك كيف يمكنك القيام بالاستغلال ، ها هو" يوم الصفر "، الآن صفق!" - والجميع يصفق أيديهم.

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

سترى موقفا سطحيا استثنائيا في علوم الكمبيوتر وروح الدعابة الطفولية تماما ، لذلك آمل أن تقدر ما سأعرضه هنا. أنا آسف إذا أتيت إلى هنا تبحث عن محادثة جادة.

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



أنت ترى أن هناك الكثير من "المخدرات" ، لكن لا داعي للقلق ، فقد زادت الآن حصة العلوم قليلاً.



لذلك ، منذ بعض الوقت ، كتب صديقي ميرلين ، جالسًا هنا في المقدمة ، روبوتًا رائعًا يعتمد على نص IRC Python ، الذي يحتل سطرًا واحدًا فقط.

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



اعتقدت أنه إذا قمت بتطبيق هذا المبدأ على الملفات الثنائية؟ لا أعرف من أين أتت هذه الفكرة ، لكن تبين أنها رائعة! ومع ذلك ، أريد توضيح بعض المفاهيم الأساسية.

من الممكن أن يكون مدرس الرياضيات قد قدم هذه الوظائف أكثر تعقيدًا مما هي عليه بالفعل.



لذلك ، فإن المعادلة f (x) بسيطة للغاية في المعنى ، فهي تعمل مثل الوظائف العادية. لديك X ، لديك إدخال ، ثم تحصل على X 7 مرات ، وهذا يساوي القيمة الخاصة بك. في Python ، يمكنك إنشاء وظيفة (lambda x: x * 7). إذا كنت ترغب في العمل مع Java - أنا آسف ، آمل ألا تريد أبدًا القيام بذلك - ثم يمكنك القيام بشيء مثل:

public static int multiplyBySevenAndReturn(Integer x) { return x * 7; } 

كما تعلمون ، قد تكون الوظائف الرياضية أكثر تعقيدًا ، ولكن هذا كل ما نحتاج إلى معرفته عنها في الوقت الحالي.

إذا نظرت إلى تجميع الكود ، ستلاحظ أن إرشادات JMP و CALL ليست مرتبطة بقيم محددة ؛ فهي تعمل مع إزاحة. إذا كنت تستخدم مصحح أخطاء ، يمكنك أن ترى أن JMP00401000 أشبه بالتعليمات "القفز بضع بايت للأمام" من تعليمة محددة للقفز 5 أو 10 بايت. الأمر نفسه ينطبق على وظيفة CALL ، إلا أنه يدفع مجموعة كاملة من الأشياء إلى مجموعتك. الاستثناء هو الحال عند "لصق" العنوان بالسجل ، أي أنك تدخل إلى عنوان محدد. كل شيء يحدث هنا بطريقة مختلفة تماما. بعد ربط العنوان بالسجل والقيام بشيء مثل CALL EAX ، تصل الوظيفة إلى القيمة المحددة في EAX. الشيء نفسه ينطبق على CALL [EAX] أو JMP [EAX] - إنه مجرد dereferences EAX ويذهب إلى هذا العنوان. عند استخدام مصحح أخطاء ، قد لا تتمكن من تحديد العنوان المحدد الذي تتصل به CALL. هذا يمكن أن يكون مشكلة ، لذلك يجب أن تكون على علم بذلك.
لنلقِ نظرة على ميزة القفز القصير JMP SHORT. هذه إرشادات خاصة في بنية x86 تتيح لك استخدام إزاحة بايت واحد بدلاً من إزاحة 4 بايت ، مما يقلل من مساحة الذاكرة المستخدمة. هذا أمر مهم في وقت لاحق لجميع التلاعب التي ستحدث مع تعليمات فردية. من المهم أن تضع في اعتبارك أن JMP SHORT لديه نطاق من 256 بايت. ومع ذلك ، لا يوجد شيء مثل دعوة قصيرة.



الآن النظر في السحر من علوم الكمبيوتر. في منتصف إنشاء هذه الشرائح ، أدركت أنه في الواقع يمكنك تعريف التجميع على أنه مساحة صفرية ، أي أنه من الناحية الفنية يوجد فراغ بين كل تعليمة. إذا نظرت إلى تعليمات فردية ، فستشهد أن كل منها يتم تنفيذه واحدًا بعد آخر من الناحية الفنية ، يمكن تفسير ذلك على أنه قفزة غير مشروطة إلى التعليمات التالية. هذا يوفر لنا مسافة بين كل تعليمات التجميع ، في حين يرتبط كل تعليم في المقابل مع قفزة غير مشروطة.

إذا نظرت إلى مثال التجميع هذا ، بالمناسبة ، هذه أشياء بسيطة للغاية أوصي بفك تشفيرها باستخدام ASCII ، لذلك هذه مجرد مجموعة من الإرشادات المنتظمة.



تعد JMP 0s الموجودة بين كل تعليمات قفزات غير مشروطة لا تراها عادةً. يتبعون بعضهم البعض بعد كل تعليمات. لذلك ، من الممكن وضع كل تعليمة تجميع فردية في موقع ذاكرة تعسفي إذا وفقط إذا كان كل تعليمة وحدة مصحوبة قفزة غير مشروطة إلى التعليمات التالية. لأنه إذا قمت بنقل التجميع وكنت بحاجة إلى استخدام نفس الكود كما كان من قبل ، فيجب عليك إرفاق قفزة غير مشروطة بكل تعليمات.
دعونا ننظر أبعد من ذلك. من الناحية الفنية ، يمكن تفسير المصفوفة أحادية البعد على أنها صفيف ثنائي الأبعاد ، فهي تتطلب فقط بعضًا من الرياضيات أو الصفوف أو شيء من هذا القبيل ، ولن أقول ذلك بالتأكيد ، لكنه ليس صعبًا للغاية. هذا يسمح لنا بتفسير الموقع في الذاكرة في شكل شعرية (س ، ص). بالاقتران مع تفسير المسافة الفارغة بين التعليمات باعتبارها قفزات غير مشروطة يمكن أن ترتبط ببعضها البعض ، يمكننا رسم التعليمات حرفيًا. هذا رائع!

لتنفيذ هذا في الممارسة العملية ، تحتاج إلى تنفيذ الخطوات التالية:

  • تفكيك كل التعليمات لمعرفة ما هو الرمز ؛
  • تخصيص مكان في الذاكرة أكبر بكثير من حجم مجموعة التعليمات. عادة ما أحجز ذاكرة أكبر بعشر مرات من حجم الكود ؛
  • لكل تعليمات ، حدد f (x) ؛
  • اضبط كل تعليمة على موقع (x ، y) المقابل في الذاكرة ؛
  • إرفاق قفزة غير مشروطة إلى التعليمات ؛
  • بمناسبة الذاكرة قابلة للتنفيذ وتشغيل التعليمات البرمجية.

لسوء الحظ ، تثور أسئلة كثيرة هنا. إنه يشبه الجاذبية ، التي لا تعمل إلا من الناحية النظرية ، ولكن في الممارسة العملية نرى شيئًا مختلفًا تمامًا. لأن x86 في الواقع يرسل إلى تعليمات الجحيم JMP الخاصة بك ، تعليمات CALL ، تشويه رمز المرجع الذاتي الخاص بك ، رمز التعديل الذاتي الذي يستخدم التكرار.



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

لا يزال العمل مع JMPs المستند إلى السجل يمثل صداعًا ، ولأنه يحتاج إلى تعويضات ضيقة ويمكن حسابه في وقت التشغيل ، لا توجد طريقة سهلة لمعرفة أين يذهبون. لاكتشاف كل سجل تلقائيًا ، يلزمك استخدام مجموعة من المعرفة من نظرية التجميع. في وقت التشغيل ، قد تكون هناك مؤشرات دالة ومؤشرات الفصل وما شابه. صحيح ، إذا كنت لا ترغب في القيام بعمل إضافي من أجل القيام بكل هذا ، فلا يمكنك القيام بذلك. تعمل وظائف f (x) في رمز حقيقي وليس بأناقة مثل الورق. إذا كنت ترغب في القيام بذلك بشكل صحيح ، فستحتاج إلى القيام بالكثير من العمل.

لتعريف مؤشرات الفصل وأشياء من هذا القبيل ، تحتاج إلى استحضار C و C ++. قبل الحفظ ، أثناء التفكيك ، قم بتحويل SHORT JMP إلى JMP العادي ، لأنه عليك التعامل مع التحيز ، إنه أمر بسيط للغاية.

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

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

  • تفكيك التعليمات ؛
  • إعداد ذاكرة مؤقتة.
  • تهيئة الثوابت المتاحة f (x) ؛
  • التكرار على f (x) وبعض مؤشرات البيانات ، والتي بموجبها سيتم كتابة التعليمات البرمجية الخاصة بك أثناء تتبع تعليمات سخيف ؛
  • تعيين تعليمات إلى الفهارس التي تم إنشاؤها المقابلة ؛
  • إصلاح جميع القفزات الشرطية ؛
  • بمناسبة قسم الذاكرة الجديدة للتنفيذ ؛
  • تنفيذ التعليمات البرمجية.

إذا وضعت الأمور في نصابها الصحيح في أماكنها ، فسنحصل على أشياء غريبة - فكل شيء يفسد ، وتنتقل التعليمات إلى أماكن غامضة من الذاكرة ، وكل هذا يبدو ساحرًا.



هل كل هذا له أهمية عملية أم هو مجرد أداء السيرك؟ القيمة المطبقة لهذه التحولات هي على النحو التالي. عزل إرشادات التجميع وبضع خطوات لحساب f (x) يسمح لنا بوضع إرشادات التجميع هذه في أي مكان في المخزن المؤقت دون أي تدخل من المستخدم. للتشويش على مسارات تنفيذ التعليمات البرمجية ، كل ما عليك فعله هو كتابة الوظيفة والمؤشرات في بعض المجمّع ، واختيارها عشوائيًا.

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

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

لا تدور ميزة Anti -version حول مقدار المتعة التي تحصل عليها مما يجعل من المستحيل استخدام IDA ، وليس حول مقدار فساد جهاز كمبيوتر Reverser من خلال صور GNAA Last Measure ، على الرغم من أنه ممتع. تعني كلمة "منع الانعكاس" مجرد كونك خادعًا ، لأنه إذا كنت ، مثل الأحمق الأخير ، تحصل على Reverser ، المتأنق الذي يكسر حماية الأنظمة المختلفة ، فسوف يغضب ، ويرسل هذا البرنامج الضار إلى الجحيم ويغادر.

وفي الوقت نفسه ، سوف تكون قادرًا على بيع كل ما تبذلونه من الروبوتات لشبكات الأعمال الروسية ، لأنه مع برنامجك "تخفض" جميع المشاركين في الهندسة العكسية. يعلم الجميع كيفية العثور على تقنيات مكافحة تصحيح الأخطاء على Google ، لكنهم لن يجدوا حلولًا للمشاكل الناشئة عن الأشياء الإبداعية هناك. ستجعل أكثر المسدسات المضادة إبداعًا العاكسين من كسر أصابعهم من لوحة المفاتيح وترك فتحات بحجم القبضة في الجدران. سوف يغلي المهاجمون بالغضب ، فهم لا يفهمون ماذا فعلت بحق الجحيم ، لأن الشفرة أفسدت كل شيء.

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

إذن ماذا سأفعل؟ سأقوم بأداء وظائف التشويش والتشويش عليها. ثم سأقوم باستخدام الإصدار الثاني من التعتيم على الوظائف المتشابكة وتطبيق التعتيم مرة أخرى. لذلك ، دعونا سحب الرمز. هذا مثال على التصيد الرياضي الذي أخذته كمثال.



لذا ، أدخِل أمر "confused by formula" في النافذة التي تفتح.



بعد ذلك ، ترى تعليمات التجميع التي تؤدي وظيفتها. لاحظ أنني أستخدم C ++ هنا ، رغم أنني أحاول في أقل فرصة تجنب ذلك.



هنا يتم تسليط الضوء على الوظيفة النشطة CALL EAX ، ثم تتبع تعليمة الانتقال التي سيتم تطبيقها ، ترى مجموعة من جميع أنواع الأشياء المختلفة في المخزن المؤقت ، ويتم كل هذا مع كل تعليمة فردية.





الآن أعد الترجيع إلى النهاية ، وسوف ترى النتيجة. لذلك ، لا يزال الرمز رائعًا ، يتم تجميع مجموعة من تعليمات JMP هنا ، تبدو مربكة ، وهي في الواقع مربكة.



تعرض الشريحة التالية تمثيلًا بيانيًا لما يشبه المكدس.



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



تعمل صيغتان فقط هنا ، والتي قمت بتضمينها في التعليمات البرمجية المصدر. بناءً على ذلك ، يمكنك القيام بالعديد من الأشياء الإبداعية التي تريدها ، وهي في الأساس مجرد مهرجان دبي السينمائي الدولي من بداية المخزن المؤقت إلى المخزن المؤقت النهائي.

المشكلة هي أن هذا المثال من الكود يستخدم القفزات غير المشروطة ، وهو أمر سيء بالفعل ، لأن الكود يجب أن يكون هو نفسه تمامًا كما كان من قبل ، أي أن القفزات غير المشروطة تتبع اتجاهًا واحدًا فقط. لذلك ، يجب أن تنتقل من نقطة الدخول إلى النهاية بنفس الطريقة ، وأن تتخلص من تعليمات القفز وأنك انتهيت - لقد حصلت على الكود! ماذا تفعل؟ من الضروري تحويل القفزات غير المشروطة إلى قفزات مشروطة. يتم إجراء قفزات مشروطة في اتجاهين ، إنه أفضل بكثير ، يمكننا القول أنه أفضل بنسبة 50٪.

هنا لدينا معضلة مثيرة للاهتمام: إذا كنا بحاجة إلى القفزات الشرطية ، فإننا لا نزال بحاجة إلى استخدام القفزات غير المشروطة ... ماذا بحق الجحيم؟ إذن ماذا نفعل؟ سوف مبهمة يتوقع أن ينقذنا! بالنسبة لأولئك الذين لا يعرفون ، فإن التقييم غير الصحيح هو عبارة عن عبارة منطقية يتم تنفيذها دائمًا لإصدار معين بغض النظر عن أي شيء.
لذلك ، دعونا ننظر إلى امتداد مساحة الصفر التي ذكرتها سابقا. إذا كانت لديك مجموعة من التعليمات ولديها قفزات غير مشروطة ، وهي انتقالات بين كل تعليمة ، فذلك يعني أن سلسلة من تعليمات التجميع التي لا تؤثر بشكل مباشر على التعليمات التي نحتاجها يمكن أن تسبق أو تتبع تعليمة واحدة.
على سبيل المثال ، إذا كتبت تعليمات محددة للغاية لا تغير التجميع الرئيسي لما تحاول الخلط فيه ، أي أنك تحاول عدم التورط مع السجلات طالما كنت تحتفظ بحالة كل تعليمات التجميع. وهذا هو أكثر مذهلة.
يمكنك مراعاة كل تعليمات التجميع ، والتي يمكن الخلط بينها ، مثل الديباجة وبيانات التجميع والحاشية. الديباجة هي التي تسبق تعليمات التجميع ، والحاشية التالية هي التي تتبعها. عادة ما تستخدم الديباجة أو يمكن استخدامها لأمرين:

  • تصحيح عواقب المسند المعتم للديباجة السابقة ؛
  • شظايا رمز مكافحة التصحيح.

لكن الديباجة محدودة أساسًا لأنه لا يمكنك فعل الكثير.
التذييل هو شيء أكثر تسلية. يمكن استخدامه من أجل:

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

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



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

أدناه لدينا مسند مبهمة للغاية. إذا حافظت على قيمة Eax في الحاشية السفلية إلى التعليمة العليا ، فاتبع عامل التشغيل XOR ، لذلك تعتقد JZ: "حسنًا ، من الواضح أنه يمكنني الذهاب إلى اليسار أو اليمين ، وأعتقد أنه من الأفضل أن أذهب إلى اليمين ، لأنه يوجد 0". ثم يتم تنفيذ POP EAX ، ويعود EAX الخاص بك ، وبعد ذلك تتم معالجة التعليمات التالية ، وهكذا.

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



ألاحظ أنه لا يتعين حساب الصيغ f (x) الخاصة بنا بشكل تكراري ، على سبيل المثال f (1) ، f (2) ، ... f (n). لا شيء يمنعهم من أن يتم حسابهم بشكل عشوائي. إذا كنت ذكيًا ، يمكنك تحديد عدد التعليمات التي تحتاجها ، ثم تعيين ، على سبيل المثال ، f (27) ، f (54) ، f (9) ، وسيكون هذا هو المكان الذي يتم فيه وضع التعليمات الخاصة بك بشكل عشوائي. عند القيام بذلك ، اعتمادًا على كيفية كتابة التعليمات البرمجية الخاصة بك ، يمكنك إيقافها مقدمًا ، وسيظل الكود يربط تعليماتك بشكل عشوائي.

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

الآن دعونا نتحدث عن أوجه القصور.



تتطلب هذه الطريقة تجميعًا دقيقًا للرمز ، بشكل رئيسي باستخدام GCC أو ، لا سمح الله ، باستخدام C ++. C ++ هي في الواقع لغة رائعة لعدة أسباب ، لكنك تعلم أن جميع المترجمين تمتصهم. لذا فإن الشيء الرئيسي في هذا الأمر هو تجميع كفء مصنوع يدويًا ، لأنه إذا كانت محاولتك للتشويش على التجميع الخاص بك ستتسبب في موافقة العصابة التي اخترعت دودة كونفيكر ، فحينئذٍ تكون قد انتهكت.

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

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

مؤشرات الوظيفة تتصرف بشكل غير متوقع - في بعض الأحيان بشكل صحيح ، وأحيانا لا. يعتمد ذلك على ما تقوم به ، وستكون هناك بالتأكيد مشكلة لأنك غير قادر على التنبؤ أين ومتى يتم إطلاق مؤشر الوظيفة في التجميع الخاص بك.

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

أتمنى أن تكون قد تعلمت شيئًا مفيدًا اليوم. في رأيي ، لقد كنت في حالة سكر بالفعل ، وبالتالي لا أفهم حقًا ما حدث الآن. تعرض الشريحة التالية جهات الاتصال الخاصة بي على Twitter والمدونة والموقع الإلكتروني ، لذا قم بزيارتي أو الكتابة.



هذا كل شيء ، شكرا لحضوركم!



شكرا لك على البقاء معنا. هل تحب مقالاتنا؟ تريد أن ترى المزيد من المواد المثيرة للاهتمام؟ ادعمنا عن طريق تقديم طلب أو التوصية به لأصدقائك ، خصم 30٪ لمستخدمي Habr على تناظرية فريدة من خوادم الدخول التي اخترعناها لك: الحقيقة الكاملة حول VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1 جيجابت في الثانية من 20 $ أو كيفية تقسيم الخادم؟ ( RAID1 RAID10, 24 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps , .

Dell R730xd 2 ? لدينا فقط 2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD بسرعة 1 جيجابت في الثانية 100 TV من 249 دولارًا في هولندا والولايات المتحدة الأمريكية! . c Dell R730xd 5-2650 v4 9000 ?

Source: https://habr.com/ru/post/ar433280/


All Articles