المساعد الشخصي الرقمي

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


B.M.AbdelAziZ
13-01-2009, 03:43 PM
بسم الله الرحمن الرحيم

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

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

والسلام عليكم

hanipino
15-01-2009, 02:56 PM
ليست لدى ادنى ادنى فكرة عن هذه الامور . مجرد محاولة فقط .

Rover
15-01-2009, 03:06 PM
Library Code [ Lib.dll ]

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 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.


[B]Form Code


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.

STRELiTZIA
16-01-2009, 09:30 AM
السلام عليكم و رحمة الله


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


اليك هذه المحاولة اخي دلتا :)
الاجراء يعتمد على الفحص بــ CRC32 لـــ Stream ، التطبيق يفحص نفسه بنفسه دون الحاجة الى وسائط خارجية...

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.com', 'File Corrupted', MB_ICONWARNING);
Application.Terminate;
end;
end;


استدعاء الاجراء في حدث OnCreate

procedure TMain.FormCreate(Sender: TObject);
begin
CheckItSelf;
end;


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

B.M.AbdelAziZ
16-01-2009, 12:29 PM
Rover
اجراء التحقق ونتيجة CRC32 بالمكتبة DLL
حل جميل لكنه غير صحيح حسب نص التمرين
لماذا ؟
ان اعتبرت المكتبة جزء من البرنامج يعني التعديل عليها يظهر رسالة الخطأ وهذا لايحدث في محاولتك
ان اعتبرت المكتبة ليس جزء من البرنامج فان من يتحقق ليس البرنامح وانما شيئ خارجي

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

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

تحياتي لكم جميعا وبانتظار مشاركات اخرى

me&delphi
16-01-2009, 11:44 PM
هذا التطبق جد بسيط (غير مظم فقط كمثال)

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

sandokhane
17-01-2009, 08:46 PM
وهذه محاولة أخرى بسيطة (للتنويع)...باستعمال وحدة md5 من موقع torry's delphi pages (http://www.torry.net/vcl/security/strong/dmmd5.zip)
حفظ قيمة الهاش يتم في قاعدة السجلات..

-- حساب الهاش :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\DELPHI 4ARAB';
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;


http://img207.imageshack.us/img207/4348/capture13op3.gif

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

B.M.AbdelAziZ
17-01-2009, 11:06 PM
sandokhane
استخدام md5 وحفظ النتيجة في Registry
فكرة جيدة لكن ليس صحيحة حسب التمرين
نفس الملاحظة السابقة ل Rover و Hanipino
نقل البرنامج لجهاز اخر لاتوجد به القيمة يجعل البرنامج يظهر رسالة الخطا بالرغم انه لم يتم التعديل عليه

sandokhane
18-01-2009, 02:11 AM
sandokhane
استخدام md5 وحفظ النتيجة في Registry
فكرة جيدة لكن ليس صحيحة حسب التمرين
نفس الملاحظة السابقة ل Rover و Hanipino
نقل البرنامج لجهاز اخر لاتوجد به القيمة يجعل البرنامج يظهر رسالة الخطا بالرغم انه لم يتم التعديل عليه


http://img296.imageshack.us/img296/9762/capture1333el0.gif

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

STRELiTZIA
18-01-2009, 06:04 PM
السلام عليكم و رحمة الله
اخي سندوخان... في البرمجة كل الطرق تؤدي الى روما.... بما يخص الـــ CheckSum لتفاذي عطب الملفات كما تعلم من طرف البرامج الظارة او التحميل من النت...

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

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

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

WinRAR ايضا..

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