28-07-2009, 08:52 AM
السلام عليكم و رحمة الله
مممم جيد حل صحيح اخي Rover
بما ان الموضوع وضع للمناقشة و ايصال معلومات عن طرق عمل الهندسة العكسية نبدأ ان شاء الله.
و هذا يسمى Anti XXX و هذه المضادات تستعمل كثيرا من طرف ادوات الحماية الحالية Protectors.
تم تطوير التمرين على اول اصدار لدلفي Delphi 1 و هو ينتج ملفات تنفيذية 16bit من نوع Ne' New Executable ' و ليست PE' Portable Executable.
يكمن تحليل هذا النوع من الملفات بــ : IDA تحليل static او بـــ SoftICE تحليل Dynamic.
ايضا تم وضع قيمة ثابتة عمدا تدخل في توليد رقم التسجيل ليتم استغلالها في الوصول الى خوارزمية التحقق
و هي تعني Delphi 4 Arab بــ Hexadecimal
تم وضع بعض المتغيرات التي تؤثر على رقم التسجيل الناتج كطول الاسم المدخل، اخذ محرف من الاسم بترتيب معين...
الوحدة كاملة للتمرين
الوحدة كاملة لمولد المفاتيح
المرفق يحتوي على مولد ارقام التسجيل مبرمج بدلفي 1 ايضا.
الصعوبة كانت تكمن فقط في تتبع مثل هذه التمارين...
----
لم ينتهي التمرين بعد
مطلوب جديد :
محاولة ايجاد خوارزمية التحقق في IDA...
اخي Rover هل تتكرم و تضيف الطريقة التقنية للوصول الى حلك
؟ بارك الله فيك 
و اخيرا : ماهو الشئ المضاف في الكود فوق لا يدعمه Delphi 1 ؟ نعم انا دائما بمشاكلي
بالتوفيق ان شاء الله
مممم جيد حل صحيح اخي Rover

بما ان الموضوع وضع للمناقشة و ايصال معلومات عن طرق عمل الهندسة العكسية نبدأ ان شاء الله.
إقتباس :في الحقيقة تعتبر تطبيقات 16 بت من البرمجيات الصعبة التتبع ..1- محاولة تعطيل الأدوات التي يعتمد عليها المهندس العكسي في تحليل البرنامج.
و هذا يسمى Anti XXX و هذه المضادات تستعمل كثيرا من طرف ادوات الحماية الحالية Protectors.
تم تطوير التمرين على اول اصدار لدلفي Delphi 1 و هو ينتج ملفات تنفيذية 16bit من نوع Ne' New Executable ' و ليست PE' Portable Executable.
يكمن تحليل هذا النوع من الملفات بــ : IDA تحليل static او بـــ SoftICE تحليل Dynamic.
إقتباس :وضوح السترينغ داخل البرنامج كما Good Boy.2- يجب ان تكون حماية البرامج لا تحتوي على ثغرات مثل رسائل نجاح او عدم نجاح عملية التسجيل.
ايضا تم وضع قيمة ثابتة عمدا تدخل في توليد رقم التسجيل ليتم استغلالها في الوصول الى خوارزمية التحقق
PHP كود :
44656C70686920342041726162
PHP كود :
function GetValidSerial(Name: string): string;
var i, Serial: integer;
begin
Serial := 0;
Result := '';
if Length(Name) >= 5 then
begin
for i := 0 to Length(Name) -1 do
begin
Serial := Serial + Ord(Name[i]);
end;
Serial := ((Serial mod $256) * $8) + (Length(Name) * $32) + Ord(Name[5]) ;
Result := IntToHex(Serial, 16) + '-' + IntToStr(Serial) + '-' + '44656C70686920342041726162' + IntToStr(Length(Name));
end;
end;
تم وضع بعض المتغيرات التي تؤثر على رقم التسجيل الناتج كطول الاسم المدخل، اخذ محرف من الاسم بترتيب معين...
PHP كود :
procedure TMain.TryBtnClick(Sender: TObject);
begin
if SerialEdt.Text = GetValidSerial(UserEdt.Text) then
MsgLbl.Visible := True else
MsgLbl.Visible := False;
end;
PHP كود :
procedure TMain.UserEdtChange(Sender: TObject);
begin
if Length(UserEdt.Text) >= 5 then
TryBtn.Enabled := TRUE else
TryBtn.Enabled := FALSE;
end;
الوحدة كاملة للتمرين
PHP كود :
unit Mainfrm;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, StdCtrls;
type
TMain = class(TForm)
LogoImg: TImage;
UserEdt: TEdit;
SerialEdt: TEdit;
TryBtn: TButton;
MsgLbl: TLabel;
procedure TryBtnClick(Sender: TObject);
procedure UserEdtChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Main: TMain;
implementation
{$R *.DFM}
function GetValidSerial(Name: string): string;
var i, Serial: integer;
begin
Serial := 0;
Result := '';
if Length(Name) >= 5 then
begin
for i := 0 to Length(Name) -1 do
begin
Serial := Serial + Ord(Name[i]);
end;
Serial := ((Serial mod $256) * $8) + (Length(Name) * $32) + Ord(Name[5]) ;
Result := IntToHex(Serial, 16) + '-' + IntToStr(Serial) + '-' + '44656C70686920342041726162' + IntToStr(Length(Name));
end;
end;
procedure TMain.TryBtnClick(Sender: TObject);
begin
if SerialEdt.Text = GetValidSerial(UserEdt.Text) then
MsgLbl.Visible := True else
MsgLbl.Visible := False;
end;
procedure TMain.UserEdtChange(Sender: TObject);
begin
if Length(UserEdt.Text) >= 5 then
TryBtn.Enabled := TRUE else
TryBtn.Enabled := FALSE;
end;
end.
الوحدة كاملة لمولد المفاتيح
PHP كود :
unit Mainfrm;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, StdCtrls;
type
TMain = class(TForm)
LogoImg: TImage;
UserEdt: TEdit;
SerialEdt: TEdit;
procedure UserEdtChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Main: TMain;
implementation
{$R *.DFM}
function GetValidSerial(Name: string): string;
var i, Serial: integer;
begin
Serial := 0;
Result := '';
if Length(Name) >= 5 then
begin
for i := 0 to Length(Name) -1 do
begin
Serial := Serial + Ord(Name[i]);
end;
Serial := ((Serial mod $256) * $8) + (Length(Name) * $32) + Ord(Name[5]) ;
Result := IntToHex(Serial, 16) + '-' + IntToStr(Serial) + '-' + '44656C70686920342041726162' + IntToStr(Length(Name));
end;
end;
procedure TMain.UserEdtChange(Sender: TObject);
begin
if Length(UserEdt.Text) >= 5 then
SerialEdt.Text := GetValidSerial(UserEdt.Text);
end;
end.
المرفق يحتوي على مولد ارقام التسجيل مبرمج بدلفي 1 ايضا.
الصعوبة كانت تكمن فقط في تتبع مثل هذه التمارين...
----
لم ينتهي التمرين بعد
مطلوب جديد :

محاولة ايجاد خوارزمية التحقق في IDA...
اخي Rover هل تتكرم و تضيف الطريقة التقنية للوصول الى حلك
؟ بارك الله فيك 
و اخيرا : ماهو الشئ المضاف في الكود فوق لا يدعمه Delphi 1 ؟ نعم انا دائما بمشاكلي

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

