سؤال

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

إليك رمز الملف القابل للتنفيذ البسيط الذي كتبته لاختباره ببساطة:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    _TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5");
    _TCHAR* hiddenString2 =_T("hidden_password_or_whatever");
    for (int i= 0; i<argc; i++) {
        if (0 == _tcscmp(argv[i],hiddenString1)) {
            _tprintf (_T("The guid argument is correct.\n")); }
        else if (0 == _tcscmp(argv[i],hiddenString2)) {
            _tprintf (_T("Do something here.\n")); }
    }

    _tprintf (_T("This is a visible string.\n"));
    //Keep Running
    Sleep(60000);
    return 0;
}

يمكن بوضوح استخراج السلاسل من الملف القابل للتنفيذ المقابل:
alt text

أعتقد أنه من السهل جدًا العثور على الخيوط.

أسئلتي هي:

  1. كيف ببساطة يخفي سلسلة مخفية1 أو HiddenString2 في التنفيذ؟
  2. هل هناك طريقة أكثر أمانًا لاستخدام "رمز الغش" من بعض المدخلات الخفية الغامضة؟
هل كانت مفيدة؟

المحلول

مرحبًا بكم في عالم البرمجة الدفاعية الأوسع.

هناك خياران، لكنني أعتقد أن جميعها تعتمد على شكل من أشكال التشويش؛والتي، على الرغم من أنها ليست مثالية، إلا أنها على الأقل شيء ما.

  1. بدلاً من قيمة سلسلة مستقيمة، يمكنك تخزين النص في شكل ثنائي آخر (ست عشري؟).

  2. يمكنك تشفير السلاسل المخزنة في تطبيقك، ثم فك تشفيرها في وقت التشغيل.

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

أو مزيج منها.

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

الفكرة الرابعة هي عدم تخزين السلسلة في التطبيق نفسه، بل الاعتماد على رمز التحقق ليتم إرساله إلى الخادم الذي تتحكم فيه.يمكنك على الخادم التحقق مما إذا كان "رمز الغش" شرعيًا أم لا.

نصائح أخرى

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

فقط كن على علم بما يلي: كل شيء لعبة القط والفأر: إنه غير ممكن ل ضمان أن لا أحد سوف يكتشف "سر".

بغض النظر عن مقدار التشفير أو الحيل الأخرى التي تستخدمها؛ بغض النظر عن مقدار الجهد أو الأموال التي وضعتها فيه. بغض النظر عن عدد أنواع "NASA / MIT / CIA / NSA" تشارك في إخفاءها.

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

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

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

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

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

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

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

  • قم بإنشاء تجزئة (MD5، Sha، إلخ) من السلسلة / كلمة المرور / المعرف التي تريد المقارنة معها، ربما تضيف قيمة "الملح" إليها. تخزين هذا في البرنامج الخاص بك
  • عند تشغيل البرنامج، قم بتنفيذ نفس الخوارزمية في سلسلة الإدخال / كلمة المرور / المعرف ومقارنة التجزئة اثنين لمعرفة ما إذا كانت تتطابق.

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

هناك عناوين URL لطلبات HTTP التي أود إخفاؤها أيضا.

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

هل ستكون جميع الرموز السرية GUID أو كانت مثالا فقط؟

ربما تخزين سرك كجيد ثنائي:

const GUID SecretGuid =
    { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

ثم قم بتحويل GUID المرفق من سلسلة إلى تنسيق ثنائي ومقارنة من GUID Binary.

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

إذا كنت لا تريد أن يرى الناس GUID الخاص بك، فقم بإنشاءه من البايتات، بدلا من البناء من سلسلة:

const GUID SecretGuid = 
      { 0x4537774B, 0xCC80, 0x4eda, { 0x7A, 0x9E, 0xE7, 0x79, 0x91, 0xF5 } };

أفضل ما يمكنك القيام به هو رمز كلمة المرور الخاصة بك أو سلسلة أخرى تريد إخفاءها كصفيف Char. علي سبيل المثال:

std::string s1 = "Hello";   // This will show up in exe in hex editor
char* s2 = "World";   // this will show up in exe in hex editor
char s3[] = {'G', 'O', 'D'}; // this will not show up in exe in hex editor.

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

WCHAR T1[28];
 T1[22] = 69;
 T1[15] = 121 - 17;
 T1[9] = L':' + -26;
 T1[12] = L't' - 1;
 T1[6] = 116 - 1;
 T1[17] = 117 - 12;
 T1[3] = 116 - 1;
 T1[14] = L'' - 3;
 T1[13] = L'w' - 3;
 T1[23] = 69;
 T1[26] = L'Y' + 3;
 T1[19] = 111 + 0;
 T1[21] = L'k' - 34;
 T1[27] = L'\\' - 8;
 T1[20] = L'B' + 32;
 T1[4] = 42 + -10;
 T1[25] = L'm' - 17;
 T1[16] = L'H' + 18;
 T1[18] = L'A' + 56;
 T1[24] = 68;
 T1[1] = 105 - 1;
 T1[11] = L'k' - 6;
 T1[10] = 66 + 50;
 T1[2] = 105;
 T1[0] = 117 - 1;
 T1[5] = L'k' - 2;
 T1[8] = 89 + 8;
 T1[7] = 32;

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top