بخش سوم امنيت نرم افزارهاي (پيشرفته):
اين روش بسيار كارآمد و تقريبا مي توان گفت تا وقتي كه كد اصلي (Decode) لو نرفته برنامه شما تا 99% ايمن و به راحتي قابل انتشار در بازار حتي بازار جهاني است .
گوش فرا دهيد :
در برنامه هاي تجاري مي توان گفت كه 100% وجود بانك اطلاعاتي الزامي است (Sql Sever,Oracle , MySql ,DBISAM) و نكته مهمي كه وجود دارد برقراي ارتباط با بانك اطلاعتي است (Connect To Database) پس يكي از گزينه هاي مهم برنامه اتصال به بانك اطلاعاتي است .
در صورتي كه شما بخشي از كدهاي مهم برنامه را كه براي اجراي برنامه وجودشان حياتي است را محافظت كنيد مي توانيد گام مؤثري را در مقابله با كركرها برداريد .
كركرها در حالت طبيعي و نرمال پس از UnPack برنامه مي توانيد شرطها و كيسها و حلقه ها را شناسايي و عملكرد آنها را تغيير يا غيرفعال كنند . يك تايمر يا يك تابع را با يك Nop يا عكس كردن عملش آن را غير فعال و اصطلاحاٌ آن را كرك كنند . اما اگر حلقه For يا Case يا Connect به بانك اطلاعاتي وجود داشته باشد .
بله مي خوام برم بعد از اين مقدمه كوتاه روي اصل ماجرا .
خوب اگر ما بتوانيم كدهاي برنامه را بعد از مرحله Design و توليد فايل اجرايي تغيير دهيم ديگر كسي نمي تواند كدهاي ما را تغيير و آنها را Crack كند . البته غيير ممكن نيست ولي بسيار مشكل و به شانس بسيار زيادي بستگي دارد .
خوب پس براي اجراي كدهاي تغيير پيدا كرده چه كاري مي توان انجام داد . بايد با استفاده از الگوريتم عكس عمل كد در زمان اجرا (Run Time) كدهاي Encrypt شده را در حافظه Decrypt نمود .
بسياري از پروتكتورهاي معرف اين امكان مهم را ارائه و پشتيباني مي كنند كه ما به راحتي از آن به دليل (شايد بلد نبود نحوه استفاده يا عدم مطالعه Help) ناشناخته استفاده نمي كنيم .
من براي مثال نحوه انجام اين كار را با Protector & Packer SVKP 1.44 توضيح مي دهم .
در پكيجهاي ابزارهاي Packer و Protector معمولا دو فايل با نامهاي مشخص وجود دارد كه براي اين مجموعه به نامهاي delphi_svkp_block_begin.inc و delphi_svkp_block_end.inc فايل اول حاوي اطلاعات و كدهاي اسمبلي زير است :
asm DB $EB,$7F,$EB,$00,$99,$AA,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $EB,$7F,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
و فايل دوم حاوي كدهاي زير است :
asm DB $EB,$7F,$EB,$00,$BB,$CC,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $EB,$7F,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
asm DB $90,$90,$90,$90,$90,$90,$90,$90,$90,$90 end;
اين كدها قرار است قبل و بعد از فرامين كليدي و مهم ما كه در بالا به يكي از مهمترين آنها اشاره شد قرار مي گيرند .
با فرض اينكه اين دو فايل در پوشه include قرار داشته باشند به اين نحو استفاده مي شوند :
unit main;
interface
procedure Start;
implementation
uses
Registry,
Classes,
Windows,
SysUtils,
special;
var
RegMessage : String;
// This procedure will encrypted and it will decrypted only if user have correct registration key
procedure ActionForRegisteredUsers;
begin
{$I include\delphi_svkp_block_begin.inc}
RegMessage := 'Registered version!';
MessageBox(0,PChar (RegMessage),'',0);
{$I include\delphi_svkp_block_end.inc}
end;
procedure Start;
begin
try
// this code will decrypted before using and after use removed
// tip: This type of blocks is very good use in initialize part of program
// (load DLL(s), initialize data, fill some special variables and etc.)
{$I include\delphi_svkp_block_type2_begin.inc}
RegMessage := 'Encryption blocks example';
{$I include\delphi_svkp_block_type2_end.inc}
// This code will decrypted before using and encrypted again after use
{$I include\delphi_svkp_block_type1_begin.inc}
MessageBox(0,PChar (RegMessage),'',0);
ActionForRegisteredUsers; //this procedure is only for registered users
{$I include\delphi_svkp_block_type1_end.inc}
except
end;
end;
end.
در كد بالا از يك Uses به نام special استفاده شده است كه ممكن است براي شما سوال پيش بيايد كه اين فايل چيست . معمولا Protectorها علاوه بر تغييراتي كه برروي فايل اجرايي انجام مي دهند يك سري كدهاي سودمند براي مقابله با Debugger ها و ساير سيستمهاي نفوذي مي نويسند كه با توجه به نوع زبان برنامه نويسي قابل استفاده است . كه در اينجا با استفاده از اين فايل كه در اصل براي استفاده از يك Dll كه همراه package پروتكتور عرضه شده استفاده شده است . عدم استفاده از اين فايل اشكالي در سيستمي حفاظتي از كدها نمي كند . فقط جهت افزايش امنيت است .
حالا براي اينكه بتوان كدها را حفاظت نمود پس از توليد فايل اجرايي شما بايد به وسيله پروتكتور فايل را محافظت كنيد . در هنگامي كه پروتكتور در حال تغيير موقعيت احضار توابع و رويه ها است . وقتي به كدهاي ما رسيد :
procedure ActionForRegisteredUsers;
begin
{$I include\delphi_svkp_block_begin.inc}
RegMessage := 'Registered version!';
MessageBox(0,PChar (RegMessage),'',0);
{$I include\delphi_svkp_block_end.inc}
end;
اطلاعات موجود در فايل هاي مشخص شده را با اطلاعات كد هاي ما و يك سري كد كه با ااگوريتم RSA توليد مي شود تركيب مي نمايد . و باعث تغيير فيزيكي محتواي فايل اجرايي مي شود . يا اصطلاحاْ به نوعي محتواي فايل را خراب مي كند .
حالا براي اجراي برنامه به صورت صحيح و رجيستر شده حتما نياز به كد فعال سازي جهت Decrypt شدن اطلاعات خراب شده در فايل اجرايي برنامه است كه اين فايل توسط پروتكتور توليد مي شود .
كه در اين مثال SVKP فايل را به نام regkey.key توليد مي كند كه حاوي كد فعال سازي و بازسازي اطلاعات تخريب شده در زمان اجراست است.
به يك نمونه از محتواي اين فايل توجه كنيد :
-----BEGIN RSA PUBLIC KEY-----
AAG/aAN0uqBYL7SxnMqOHJouq3Yhz2nV3KW6pfhDQ29qbIlFRJWrYn i8fVTud9Gli5rJft
jAYy/pf0Ee2aKcD2t+j6+y2pweECBTfOjVwBw9bmFWTOchMBG8b7xzh 3wZ+6S/2/QeYILI
0Gmop/wuCrZzm3MkekGSRspC2v2R8dtgDl3ZGsHwMYpmOqWnNSrpxzea nGAS4D3iUyo50H
tVKGOHqba96HD4yG5G+suc3tZObR1rJveXpCU9WLCFltVxkXhp DYQFr7XhEJTi3H9TEfJ1
coH8MQla3j1vwPLtyVD4hpeyyOHJ5qbTyLXmyjavIouaOBOSZB YlLi332qLiPI4DAQADA
-----END RSA PUBLIC KEY-----
در صورتي كه اين فايل وجود داشته باشد برنامه اجرا و در غير اين صورت امكان اجراي برنامه وجود نخواهد داشت .
براي پيدا كردن اين كد بايد به روش سعي و خطا عمل كرد مانند روش پيدا كردن رمز فايلهاي RAR يا Zip يا از روش نقل قول (Fh_prg) : (Bruteforce) مي توان استفاده نمود كه كار بسيار وقت گير و مشكلي است .
البته من براي اين كار از پروتكتورها استفاده نمي كنم . من در برنامه ها از كامپوننت SecureCode استفاده مي كنم . به دليل كپي رايت از ارائه اين كامپوننت در اينجا شرمنده هستم
البته اگر فايل رجيستر را ارائه دهيد و سيستم امنيني برنامه شما پايين باشد به راحتي مي توان با مثلا OLLY آن را dump كرد و از آنجايي كه فايل به صورت صحيح در Ram لود شده است اين محدوديت از بين مي رود .
از دوستان تقاضا مي شود كه الگوريتمهاي antidebug خود دريق نكنند . با همكاري و هم فكري هم ميشه سد بسيار بسيار بزرگي در مقابل كركرها ايجاد نمود .
از دوستان كركر كلاه سفبد تقاضا مي شود از الگوريتمهاي ضد ديباگ و مشكل ساز براي كركها بگذارند .
باي تا روز بدون كركر