برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

صحت عدم تغییرات در توابع برنامه

در این نوشته روش محافظت از توابع در برابر تغییرات رو بررسی می کنیم.یک برنامه برای مقاصد گوناگونی از جمله کرک کردن ممکن است مورد تغییر واقع شود.

ابتدا مقدماتی را ارایه می دهیم بعد به سراغ راهکار می رویم :

– برای بدست آوردن آدرس حافظه یک تابع در زمان اجرای برنامه می توانیم به این صورت عمل کنیم :

 

...
procedure ImportantProc ( Serial : string );
...
var
ProcAdd : FARPROC;
...
ProcAdd := @ImportantProc ;

متغییر ProcAdd به آدرس تابع در حافظه اشاره می کند.

-برای بدست آوردن اینکه یک تابع در حافظه چقدر فضا اشغال می کند :

...
procedure ImportantProc ( Serial : string );
begin
   if Serial = 'true way' then
      writeLn('Program registered now !!')
   else
      Writeln('Wrong serial entered !!');

end;
procedure End_ImpProc;
begin end;
...
var
  ProcSize :Dword;
...
  ProcSize := Dword(@End_ImpProc) - Dword(@ImportantProc) ;

تایع End_ImpProc برای تایین آدرس پایان تابع اصلی به کار گرفته شده است.

تا به اینجای کار ما با مقدماتی همچون نحوه بدست آوردن آدرس و سایز تابع در حافظه آشنا شدیم. با این دو پارامتر ما به راحتی انواع  هش (Hash) ها را می توانیم از تابع خود به دست بیاوریم . ما برای اینکه از تغییرات احتمالی توابع آگاه شویم می توانیم در زمان کامپایل یک بار هش این توابع رو بدست آورده و در متغییری دخیره کنیم و در زمان اجرا هش توابع را بدست آورده و با مقادیر صحیح آن ها چک کنیم.

به عنوان مثال :

program CheckSum;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows;

procedure ImportantProc ( Serial : string );
begin
   if Serial = 'true way' then
      writeLn('Program registered now !!')
   else
      Writeln('Wrong serial entered !!');

end;
procedure End_ImpProc;
begin end;

function calculateLRC( Data: PByte ; Size: DWORD ) : Byte ;
var
  I: Integer;
begin
     Result := 0 ;

     for I := 0 to Size - 1 do
        Result := ( Pbyte(
                        DWORD(Data) + I
                        )^ + Result )
                  and
                  $FF ;

     Result := ( ( Result xor $FF ) + 1 ) and $FF ;
end;

var
  ProcSize :Dword;
  TrueHash :Byte;
begin

  ProcSize := Dword(@End_ImpProc) - Dword(@ImportantProc) ;
  trueHash := 218 ;

  if calculateLRC ( @ImportantProc , ProcSize ) <> trueHash then
    Writeln(' Wrong hash detected !! Important procedure  modified..')
  else
    Writeln(' Important procedure not modified .');

end.

در مثال از هش ساده ای به نام longitudinal redundancy check — LRC استفاده شده . شما می توانید انواع دیگر هش ها را استفاده کنید. و نکته دیگر اینکه این روش در صورتی که در قسمتی از تابع توسط دیباگر بریک پوینت نوع Int 3 گداشته شده باشد ، را تشخیص داده و مقدار هش متفاوت می شود.

پر واضح است که خود چک کردن هش هم می تواند مورد تغییر یک کرکر واقع شده و برنامه نتواند تشخیص صحیح دهد و همه به عنوان یک اصل می دانیم که هیچ راهکاری برای جلوگیری از کرک شدن برنامه ۱۰۰% نمی باشد.

نظر شما دوست عزیز چیست ؟ آیا راهکاری برای بهبود این نوع  محافظت دارید ؟ یا راه حل دیگری ؟ نظرات مفید خود را با ما در میان بگزارید …


انتشار

در

توسط

برچسب‌ها:

نظرات

3 پاسخ به “صحت عدم تغییرات در توابع برنامه”
  1. خیلی عالی بود ، میشه یک کرک می با این الگوریتم به صورت دمو بنویسید ؟

    1. AHA

      سلام.

      علیرضا فکرنکنم آنچنان نیازی به نوشتن یک کرک می باشه، همینطور که میبینیم از ابتدا بصورت روان نحوه بدست آورده ابتدای تابع و سایز کدهای تابع توضیح داده شده است و همچنین مثالی هم ذکر شده که LRC از تابع بدست میاره، که در واقع همون کرک می که میخای 😀

      حالا شما همین مثال رو هرطور که میخایین متناسب با نیازتون تغییر بدین.

      موفق باشین.

  2. FuJiN

    راه دیگه ای میشه بکار برد مقایسه مقدار برگشتی تابع هست تابع با یک نام دیگه و تغییراتی کوچک میتونه مقدار برگشتی رو چک کنه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *