در این نوشته روش محافظت از توابع در برابر تغییرات رو بررسی می کنیم.یک برنامه برای مقاصد گوناگونی از جمله کرک کردن ممکن است مورد تغییر واقع شود.
ابتدا مقدماتی را ارایه می دهیم بعد به سراغ راهکار می رویم :
– برای بدست آوردن آدرس حافظه یک تابع در زمان اجرای برنامه می توانیم به این صورت عمل کنیم :
... 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 گداشته شده باشد ، را تشخیص داده و مقدار هش متفاوت می شود.
پر واضح است که خود چک کردن هش هم می تواند مورد تغییر یک کرکر واقع شده و برنامه نتواند تشخیص صحیح دهد و همه به عنوان یک اصل می دانیم که هیچ راهکاری برای جلوگیری از کرک شدن برنامه ۱۰۰% نمی باشد.
نظر شما دوست عزیز چیست ؟ آیا راهکاری برای بهبود این نوع محافظت دارید ؟ یا راه حل دیگری ؟ نظرات مفید خود را با ما در میان بگزارید …
دیدگاهتان را بنویسید لغو پاسخ