[تمرين] كيف احمي برنامجي من الـــ rce ؟
#17
السلام عليكم و رحمة الله
مممم جيد حل صحيح اخي Rover Smile

بما ان الموضوع وضع للمناقشة و ايصال معلومات عن طرق عمل الهندسة العكسية نبدأ ان شاء الله.

إقتباس :في الحقيقة تعتبر تطبيقات 16 بت من البرمجيات الصعبة التتبع ..
1- محاولة تعطيل الأدوات التي يعتمد عليها المهندس العكسي في تحليل البرنامج.
و هذا يسمى Anti XXX و هذه المضادات تستعمل كثيرا من طرف ادوات الحماية الحالية Protectors.

تم تطوير التمرين على اول اصدار لدلفي Delphi 1 و هو ينتج ملفات تنفيذية 16bit من نوع Ne' New Executable ' و ليست PE' Portable Executable.

يكمن تحليل هذا النوع من الملفات بــ : IDA تحليل static او بـــ SoftICE تحليل Dynamic.

إقتباس :وضوح السترينغ داخل البرنامج كما Good Boy.
2- يجب ان تكون حماية البرامج لا تحتوي على ثغرات مثل رسائل نجاح او عدم نجاح عملية التسجيل.
ايضا تم وضع قيمة ثابتة عمدا تدخل في توليد رقم التسجيل ليتم استغلالها في الوصول الى خوارزمية التحقق

PHP كود :
44656C70686920342041726162 
و هي تعني Delphi 4 Arab بــ Hexadecimal

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 ايضا.

الصعوبة كانت تكمن فقط في تتبع مثل هذه التمارين...

----
لم ينتهي التمرين بعد
مطلوب جديد : Big Grin
محاولة ايجاد خوارزمية التحقق في IDA...

اخي Rover هل تتكرم و تضيف الطريقة التقنية للوصول الى حلك Big Grin؟ بارك الله فيك Smile

و اخيرا : ماهو الشئ المضاف في الكود فوق لا يدعمه Delphi 1 ؟ نعم انا دائما بمشاكلي Big Grin
بالتوفيق ان شاء الله


الملفات المرفقة
.rar   Keygenerator.rar (الحجم : 83.48 ك ب / التحميلات : 150)
الرد


الردود في هذا الموضوع
[تمرين] كيف احمي برنامجي من الـــ rce ؟ - بواسطة STRELiTZIA - 28-07-2009, 08:52 AM

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


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