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

نص التمرين (حماية ذاتية) :
أظف اجراء لبرنامجك لكي يفحص نفسه عند التنفيذ، فان تم العبث به او اصابه فيروس او عطب يظهر رسالة خطأ ويخرج

بعد اسبوع اضع احد الحلول الممكنة

والسلام عليكم
[-] كل من 2 users say قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • Delphi4Us, ELARAPY
الرد
#2
ليست لدى ادنى ادنى فكرة عن هذه الامور . مجرد محاولة فقط .


الملفات المرفقة
.rar   exe.rar (الحجم : 397.32 ك ب / التحميلات : 540)
الرد
#3
Library Code [ Lib.dll ]

PHP كود :
library Check_File_Hack;

uses
  ShareMem
,
  
SysUtils;

{
$R *.res}
type
  Long 
= record
    LoWord
: Word;
    
HiWord: Word;
  
end;

const
  
CRCPOLY = $EDB88320;

var
  
CRCTable: array[0..512] Of Longint;

procedure BuildCRCTable; 
var
  
i, j: Word;
  
r: Longint;
begin
  FillChar
(CRCTable, SizeOf(CRCTable), 0);
  for 
i := 0 to 255 do
  
begin
    r 
:= i shl 1;
    for 
j := 8 downto 0 do
      if (
r and 1) <> 0 then
        r 
:= (r Shr 1) xor CRCPOLY
      
else
        
r := r shr 1;
    
CRCTable[i] := r;
   
end;
end;

function 
RecountCRC(b: byte; CrcOld: Longint): Longint;
begin
  RecountCRC 
:= CRCTable[byte(CrcOld xor Longint(b))] xor ((CrcOld shr 8) and $00FFFFFF)
end;

function 
HextW(w: Word): string; stdcall;
const
  
h: array[0..15] Of char = '0123456789ABCDEF';
begin
  HextW 
:= '';
  
HextW := h[Hi(w) shr 4] + h[Hi(w) and $F] + h[Lo(w) shr 4]+h[Lo(w) and $F];
end;

function 
HextL(l: Longint): string;
begin
  with Long
(l) do
    
HextL := HextW(HiWord) + HextW(LoWord);
end;

function 
GetCRC32(FileName: string): Boolean; stdcall;
var
  
Buffer: PChar;
  
f: File of Byte;
  
b: array[0..255] of Byte;
  
CRC: Longint;
  
e, i: Integer;
begin
  BuildCRCTable
;
  
CRC := $FFFFFFFF;
  
AssignFile(F, FileName);
  
FileMode := 0;
  
Reset(F);
  
GetMem(Buffer, SizeOf(B));
  
repeat
    FillChar
(b, SizeOf(b), 0);
    
BlockRead(F, b, SizeOf(b), e);
    for 
i := 0 to (e-1) do
     
CRC := RecountCRC(b[i], CRC);
  
until (e < 255) or (IOresult <> 0);
  
FreeMem(Buffer, SizeOf(B));
  
CloseFile(F);
  
CRC := Not CRC;
  if 
HextL(CRC) = '2691ABA5' Then
  Result
:= True
  
Else
  
Result:= False;
end;

Exports
GetCRC32
;

end. 


Form Code


PHP كود :
unit Unit1;

interface

uses
  ShareMem
,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  
Dialogs, StdCtrls;
  function 
GetCRC32(FileName: string): Boolean; stdcall;
  
External 'Lib.dll';

  { 
Using Dll With This Method >> will Cause Error
  in Delphi 7 But not Existed 
for previous versions}

type
  TForm1 
= class(TForm)
  
Label1: TLabel;
  
Label2: TLabel;
  
procedure FormCreate(Sender: TObject);

private
    { Private 
declarations }
public
    { Public 
declarations }
end;

  var
  
Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
Var
Check:Boolean;
begin

Check
:= GetCRC32(Application.ExeName);
if 
Check then
      begin
      label1
.Caption := '   > File Not Hacked !! ';
      
label1.Font.Color := ClGreen;
      
End
else
      
Begin
      label1
.Caption := '   > File Hacked !! ';
      
label1.Font.Color := ClRed;
      
end;
end;

end. 


الملفات المرفقة
.rar   File Checked.rar (الحجم : 196.73 ك ب / التحميلات : 346)
الرد
#4
السلام عليكم و رحمة الله

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

اليك هذه المحاولة اخي دلتا Smile
الاجراء يعتمد على الفحص بــ CRC32 لـــ Stream ، التطبيق يفحص نفسه بنفسه دون الحاجة الى وسائط خارجية...
PHP كود :
procedure TMain.CheckItSelf;
var 
MyStream: TMemoryStream;
  
StoredChecksum, CalculateChecksum: integer;
begin
  MyStream 
:= TMemoryStream.Create;
  
MyStream.LoadFromFile(Application.ExeName);
  
MyStream.Seek(-4, soFromEnd);
  
MyStream.Read(StoredChecksum, 4);
  
StoredChecksumEdt.Text := IntToHex(StoredChecksum, 8);
  
MyStream.Seek(0, soFromBeginning);
  
MyStream.SetSize(MyStream.Size - 4);
  
CalculateChecksum := GetMemoryStreamCrc32(MyStream);
  
MyStream.Free;
  
CalculateChecksumEdt.Text := IntToHex(CalculateChecksum, 8);
  if 
StoredChecksum <> CalculateChecksum then
  begin
    MessageBox
(Handle, 'File Corrupted | Please scan your System | Maybe Virus infection.'#13 +
      
'Reinstall application to fix problem.'#13#13 +
      
'STRELiTZIA | AT4RE'#13 +
      
'www.delphi4arab.net', 'File Corrupted', MB_ICONWARNING);
    
Application.Terminate;
  
end;
end; 

استدعاء الاجراء في حدث OnCreate
PHP كود :
procedure TMain.FormCreate(Sender: TObject);
begin
  CheckItSelf
;
end; 

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


الملفات المرفقة
.rar   TestItSelf.rar (الحجم : 198.44 ك ب / التحميلات : 713)
[-] كل من 1 user says قال شكرا ل STRELiTZIA على المشاركة المفيدة
  • ELARAPY
الرد
#5

Rover
اجراء التحقق ونتيجة CRC32 بالمكتبة DLL
حل جميل لكنه غير صحيح حسب نص التمرين
لماذا ؟
ان اعتبرت المكتبة جزء من البرنامج يعني التعديل عليها يظهر رسالة الخطأ وهذا لايحدث في محاولتك
ان اعتبرت المكتبة ليس جزء من البرنامج فان من يتحقق ليس البرنامح وانما شيئ خارجي

hanipino
حفظ مسار البرنامج بملف نصي ونسخ البرنامج وتمويهه بلاحقة INI
محاولة جميلة ايضا لكن غير متوافقة مع التمرين اضافة الى احتوائها اخطاء

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

تحياتي لكم جميعا وبانتظار مشاركات اخرى
[-] كل من 1 user says قال شكرا ل محمد عبد العزيز على المشاركة المفيدة
  • ELARAPY
الرد
#6
هذا التطبق جد بسيط (غير مظم فقط كمثال)

ملاحظة لبقية الاخوان لا تعملوا compile أي F9 لكي ل يتغير الهاش


الملفات المرفقة
.rar   test h.rar (الحجم : 181.64 ك ب / التحميلات : 290)
الرد
#7
وهذه محاولة أخرى بسيطة (للتنويع)...باستعمال وحدة md5 من موقع torry's delphi pages
حفظ قيمة الهاش يتم في قاعدة السجلات..

-- حساب الهاش :
كود :
procedure TForm1.Button1Click(Sender: TObject); var MyStream: TMemoryStream; begin MyStream := TMemoryStream.Create; Try MyStream.LoadFromFile(Application.ExeName); Edit1.Text:=MD5DigestToStr(MD5Stream(mystream)); Finally MyStream.Free end; end;

-- حفظ الهاش في قاعدة السجلات.
كود :
procedure TForm1.Button2Click(Sender: TObject); var registre:TRegistry; begin Registre:=Tregistry.Create; Registre.RootKey:=HKEY_CURRENT_USER; Try Registre.OpenKey('Software\Delphi4Arab',true); Registre.WriteString('MyMd5',Edit1.Text); Label1.Caption:='HKEY_CURRENT_USER\SOFTWARE\DELPHI4ARAB'; Finally Registre.Free; end; end;

-- قراءة الهاش من قاعدة السجلات :
كود :
procedure TForm1.FormCreate(Sender: TObject); var registre:TRegistry; // MyStream: TMemoryStream; begin Registre:=Tregistry.Create; Registre.RootKey:=HKEY_CURRENT_USER; Try Registre.OpenKey('Software\Delphi4Arab',true); Label1.caption:=Registre.ReadString('MyMd5'); Finally Registre.Free; end; Button1Click(Sender); if Label1.Caption <> Edit1.Text then ShowMessage('MD5 Hash modified') else Form1.Caption:=Form1.Caption+' -[Md5 Hash OK]'; end;

[صورة: capture13op3.gif]

كل شى مع المرفقات..Smile


الملفات المرفقة
.rar   md5.rar (الحجم : 14.39 ك ب / التحميلات : 187)
:: رب يسر ولا تعسر رب سهل وتمم بالخير ::
الرد
#8
sandokhane
استخدام md5 وحفظ النتيجة في Registry
فكرة جيدة لكن ليس صحيحة حسب التمرين
نفس الملاحظة السابقة ل Rover و Hanipino
نقل البرنامج لجهاز اخر لاتوجد به القيمة يجعل البرنامج يظهر رسالة الخطا بالرغم انه لم يتم التعديل عليه
الرد
#9
DeltaAziz كتب :sandokhane
استخدام md5 وحفظ النتيجة في Registry
فكرة جيدة لكن ليس صحيحة حسب التمرين
نفس الملاحظة السابقة ل Rover و Hanipino
نقل البرنامج لجهاز اخر لاتوجد به القيمة يجعل البرنامج يظهر رسالة الخطا بالرغم انه لم يتم التعديل عليه

[صورة: capture1333el0.gif]

يا أخي...أعرف أن الفكرة بسيطة ...ولكنها قد تشكل نوعا من الحماية الإضافية ...أي أنها فضلا عن منع التعديل على الملف (وهذا نص التمرين) فإنها تمنع كذلك النقل اليدوي للتطبيق من جهاز لآخر بحيث لا يعمل البرنامج إلا عبر المرور ببرنامج التنصيب الذي هو من يكتب قيمة الهاش في قاعدة السجلات أثناء التنصيب...هذا مثال ..بال innoSetup
[صورة: capture135tp8.gif]
مع المرفقات تجد مثال برنامج تنصيب ....
مفتاح التنصيب : delphi4arab


الملفات المرفقة
.rar   setup.rar (الحجم : 421.57 ك ب / التحميلات : 344)
:: رب يسر ولا تعسر رب سهل وتمم بالخير ::
الرد
#10
السلام عليكم و رحمة الله
اخي سندوخان... في البرمجة كل الطرق تؤدي الى روما.... بما يخص الـــ CheckSum لتفاذي عطب الملفات كما تعلم من طرف البرامج الظارة او التحميل من النت...

الهدف من التمرين هو حصـــــــر التفكير في كيفية جعل ملف تنفيذي يفحص نفسه بنفسه و يتأكد من الــ CheckSum الخاص به...

مثلها مثل وضع تحدي Crackme في منتديات الهندسة العكسية يكسر بسهولة بــ Patching و لكن صاحب التحدي يطلب عمل Keygen و انت ادرى بذلك اخي العزيز Big Grin

الحل الذي ارفقته في مشاركتي السابقة بسيط ويستعمل كثيرا في ادوات الحماية الــ Protectors الذي تضاف اليه محاولة اخفاء قيمة الهاش و عمل Obfuscation لخوارزمية التحقق من الهاش الكثير استعمال في ادوات الحماية المشهورة...

WinRAR ايضا..

بالتوفيق ان شاء الله
الرد


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


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