[تمرين] حماية ذاتية : البرنامج معطوب، مصاب بفيروس او تم العبث به
#11
السلام عليكم ورحمة الله

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


[صورة: attachment.php?aid=4647]


.jpg   Untitled444.jpg (الحجم : 80.33 ك ب / التحميلات : 89)
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#12
السلام عليكم و رحمة الله
بخصوص: https://delphi4arab.net/forum/showthread...1#pid55271

لم استطع الرد في الموضوع مباشرة  لان الموضوع قديم و مغلق...

[صورة: M70DjPy.gif]
[-] كل من 1 user says قال شكرا ل I3CT على المشاركة المفيدة
  • Delphi4Us
الرد
#13
بارك الله فيك هل ممكن تتفضل وتوضح لماذا حدث هذا ولماذا عمل عند البعض اما نحن على دلفي 11 لم يعمل الا بتغيير النوع
وهذا فقط لفهم المشكلة وحلها اذا صادفت مرة اخرى مشكلة مشابهة
وشكرا

اما بعد التجربة وفهم مايجري هما كلمتان فقط (رائع ومذهل)
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#14
(28-06-2022, 01:10 PM)Delphi4Us كتب : لماذا حدث هذا ولماذا عمل عند البعض اما نحن على دلفي 11 لم يعمل الا بتغيير النوع
إصدارات دلفي الحديثة بها تغييرات تكسر backward compatibility التوافق مع الاصدارا القديمة
رَبَّنَا اغْفِرْ لِي وَلِوَالِدَيَّ وَلِلْمُؤْمِنِينَ يَوْمَ يَقُومُ الْحِسَابُ
[-] كل من 1 user says قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • Delphi4Us
الرد
#15
بنفس الطريقة جربت الكتابة بدل القراءة ولم تفلح 
هل هذه الطريقة الصحيحة

كود :
var
  MyStream: TMemoryStream;
  StoredChecksum,StorMachine, CalculateChecksum: dword;
begin
  MyStream := TMemoryStream.Create;
  MyStream.LoadFromFile(Application.ExeName);
  StoredChecksum:=12114367;
  MyStream.Seek(-4, soFromEnd);
  MyStream.Write (StoredChecksum, 4);

   MyStream.Seek(0, soFromBeginning);
  MyStream.SetSize(MyStream.Size - 4);

   MyStream.Free;

end;


وجربت على مشروع اخر غير الذي نتمرن عليه فلم اجد البلوك او لا اعرف ما تسمونه بنهاية الملف والذي يحوي اصفار 
وانما ارقام ورموز حتى نهايته
قل: اللهم فاطِرَ السماوات والأرض عالم الغيبِ والشهادة، ربَّ كُلِّ شَيءٍ ومَلِيكَه، أَشْهد أن لا إله إلا أنت، أعوذ بك من شرِّ نفسي وشرِّ الشيطان وشِرْكِهِ وأن أقترف على نفسي سوءًا أو أجرُّه إلى مسلم
الرد
#16
العملية تتم على مرحلتين الاولى اضافة CRC الى نهاية البرنامج و هذا يتم بواسطة برنامج خارجي...

كود :
uses idHashcrc;
procedure AddCrc();
const Rec_SIZE  = SizeOf(UInt32);
var
  FS:TStream;
  idCrc:TIdHashCRC32;
  C:UInt32;
  ExeFile:string;
begin
  if not PromptForFilename(ExeFile,'Applications |*.exe') then
      Exit;
  FS := TFileStream.Create(ExeFile, fmOpenReadWrite);
  try
      FS.Position := FS.Size - Rec_SIZE * 2;
      if (FS.Read(C,Rec_SIZE) = Rec_SIZE) and (C = FS.Size) then // previously done
         FS.Size :=  FS.Size - Rec_SIZE * 2; // trunc crc slot
     FS.Position := FS.Size;
     C := FS.Size + Rec_SIZE * 2;
     FS.Writebuffer(C, Rec_SIZE);
     FS.Position := 0;
     idCrc:=TIdHashCRC32.Create;
     C := StrToInt('$'+ idCrc.HashStreamAsHex(FS));
     idCrc.Free;
     C := C xor $FFFFFFFF;
     FS.Writebuffer(C,Rec_SIZE);// add crc
     Showmessage('Done');
  finally
    FS.Free;
  end;
end;

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

كود :
uses idHashcrc;

procedure CheckItSelf;
const Rec_SIZE  = SizeOf(UInt32);
var
  FS:TStream;
  idCrc:TIdHashCRC32;
  C:UInt32;
begin
  FS := TBufferedFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyWrite);
  try
      FS.Position := FS.Size - Rec_SIZE * 2;
      if (FS.Read(C, Rec_SIZE) = Rec_SIZE) and (C = FS.Size) then
      begin
         FS.Position := 0;
         idCrc:=TIdHashCRC32.Create;
         C := StrToInt('$'+ idCrc.HashStreamAsHex(FS));
         idCrc.Free;
         if Int32(C) = -1 then // valid crc
            Exit;
      end;

      raise Exception.Create('Crc check error');

  finally
    FS.Free;
  end;
end;



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

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

هناك طريقة اخرى و هي وضع الملف التنفيذي في ملف مضغود zip. rar و باستعمال سكريبت او bat تقوم بستخراج نسخة و تنفيذها في كل مرة ..
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • S.FATEH
الرد
#17
السلام عليكم

بارك الله فيك اخ Ndagor الحماية ناجحة ...

من فضلك ممكن شرح الكود من طرفك او من طرف احد الأعظاء
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
[-] كل من 1 user says قال شكرا ل S.FATEH على المشاركة المفيدة
  • Ndagor
الرد
#18
الكود الاول يوضع في برنامج بسيط مستقل يستعمل لاضافة crc  الى الملفات التنفذية ... اما الكود الثاني يوضع في الرنامج المراد حمايته .. 

في المثال الاصلي نقوم باضافة CRC الى نهاية الملف التنفيذي و عند اطلاق البرنامج يقوم بحساب CRC  و مقارنته مع المخزن في الملف و في حال وجد انه عير متطابق يتوقف البرنامج...

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

CRC مسجل بشكل عكسي لان TIdHashCRC32 تقوم بحساب CRC للملف كامل  بما في ذلك هذا المجال فتكون النتيجة ‎-1 في حال نجاح عملية المقارنة

[صورة: Sk.png]


في الحقيقة هذا مجرد تمرين من 2008 زمن xp عندما كانت الفيروسات تصول و تجول بكل حرية .

حاليا يمكن لاي مضاد فيروسات ان يغير في برنامجك و هذا يفشل حساب crc .

دالفي يتيح التوقيع الإلكتروني للبرنامج بعد انشائه اظن هذه افظل طريقة للحماية.
[-] كل من 1 user says قال شكرا ل Ndagor على المشاركة المفيدة
  • S.FATEH
الرد
#19
السلام عليكم

فقط كإضافة جعل كود الحماية في برنامج خارجي متعب كل مرة تقوم بكومبايل للكود تقوم بتكرار نفس الامر اضافة الـ CRC32 الى البرنامج
او تقوم بالعملية مرة واحدة عند الإنتهاء من البرنامج...
قمت بتغيير بسيط لكود إظافة CRC بحيث يأخذ مسار البرنامج المراد إضافة الـ CRC له كبرامتر و إستدعائه بإستخدام Build Events

PHP كود :
procedure AddCrc;
const 
Rec_SIZE  SizeOf(UInt32);
var
  FS:TStream;
  idCrc:TIdHashCRC32;
  C:UInt32;
  ExeFile:string;
begin
  ExeFile 
:= ParamStr(1);// تغيير بسيط

  FS := TFileStream.Create(ExeFilefmOpenReadWrite);
  try
      FS.Position := FS.Size Rec_SIZE 2;
      if (FS.Read(C,Rec_SIZE) = Rec_SIZE) and (FS.Sizethen // previously done
         FS.Size :=  FS.Size Rec_SIZE 2// trunc crc slot
     FS.Position := FS.Size;
     C := FS.Size Rec_SIZE 2;
     FS.Writebuffer(CRec_SIZE);
     FS.Position := 0;
     idCrc:=TIdHashCRC32.Create;
     C := StrToInt('$'idCrc.HashStreamAsHex(FS));
     idCrc.Free;
     C := xor $FFFFFFFF;
     FS.Writebuffer(C,Rec_SIZE);// add crc
     Showmessage('Done');
  finally
    FS.Free;
  end;
end

يتم وضع البرنامج المسئول عن اضافة crc الى جانب البرنامج المراد حمايته ثم يتم استدعائه باستخدام Build Events مع تمرير مسار البرنامج 

[صورة: attachment.php?aid=4714]

بهذه الطريقة الحماية تكون اوتوماتيكية ..


الملفات المرفقة
.png   Build Events.png (الحجم : 22.81 ك ب / التحميلات : 22)
.zip   Protect.zip (الحجم : 660 بايت / التحميلات : 5)
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
[-] كل من 1 user says قال شكرا ل S.FATEH على المشاركة المفيدة
  • Ndagor
الرد
#20
شكرا على الفكرة.
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم