{$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;
Rover
اجراء التحقق ونتيجة CRC32 بالمكتبة DLL
حل جميل لكنه غير صحيح حسب نص التمرين
لماذا ؟
ان اعتبرت المكتبة جزء من البرنامج يعني التعديل عليها يظهر رسالة الخطأ وهذا لايحدث في محاولتك
ان اعتبرت المكتبة ليس جزء من البرنامج فان من يتحقق ليس البرنامح وانما شيئ خارجي
hanipino
حفظ مسار البرنامج بملف نصي ونسخ البرنامج وتمويهه بلاحقة INI
محاولة جميلة ايضا لكن غير متوافقة مع التمرين اضافة الى احتوائها اخطاء
STRELiTZIA
حل صحيح
بيننا نفس الطريقة التي فكرت فيها وقت وضع التمرين والتي كنت ساضعها كاحد الحلول
الان علي ان اجد طريقة اخرى واضعها
sandokhane استخدام md5 وحفظ النتيجة في Registry
فكرة جيدة لكن ليس صحيحة حسب التمرين
نفس الملاحظة السابقة ل Rover و Hanipino
نقل البرنامج لجهاز اخر لاتوجد به القيمة يجعل البرنامج يظهر رسالة الخطا بالرغم انه لم يتم التعديل عليه
DeltaAziz كتب :sandokhane استخدام md5 وحفظ النتيجة في Registry
فكرة جيدة لكن ليس صحيحة حسب التمرين
نفس الملاحظة السابقة ل Rover و Hanipino
نقل البرنامج لجهاز اخر لاتوجد به القيمة يجعل البرنامج يظهر رسالة الخطا بالرغم انه لم يتم التعديل عليه
يا أخي...أعرف أن الفكرة بسيطة ...ولكنها قد تشكل نوعا من الحماية الإضافية ...أي أنها فضلا عن منع التعديل على الملف (وهذا نص التمرين) فإنها تمنع كذلك النقل اليدوي للتطبيق من جهاز لآخر بحيث لا يعمل البرنامج إلا عبر المرور ببرنامج التنصيب الذي هو من يكتب قيمة الهاش في قاعدة السجلات أثناء التنصيب...هذا مثال ..بال innoSetup
مع المرفقات تجد مثال برنامج تنصيب ....
مفتاح التنصيب : delphi4arab
18-01-2009, 06:04 PM (آخر تعديل لهذه المشاركة: 18-01-2009, 06:09 PM بواسطة STRELiTZIA.)
السلام عليكم و رحمة الله
اخي سندوخان... في البرمجة كل الطرق تؤدي الى روما.... بما يخص الـــ CheckSum لتفاذي عطب الملفات كما تعلم من طرف البرامج الظارة او التحميل من النت...
الهدف من التمرين هو حصـــــــر التفكير في كيفية جعل ملف تنفيذي يفحص نفسه بنفسه و يتأكد من الــ CheckSum الخاص به...
مثلها مثل وضع تحدي Crackme في منتديات الهندسة العكسية يكسر بسهولة بــ Patching و لكن صاحب التحدي يطلب عمل Keygen و انت ادرى بذلك اخي العزيز
الحل الذي ارفقته في مشاركتي السابقة بسيط ويستعمل كثيرا في ادوات الحماية الــ Protectors الذي تضاف اليه محاولة اخفاء قيمة الهاش و عمل Obfuscation لخوارزمية التحقق من الهاش الكثير استعمال في ادوات الحماية المشهورة...