سلام
اين روش براي محافظت از رمز بانك اطلاعاتي DBISAM كه درون فايل اجرايي به صورت رشته به بانك تزريق مي شود شامل دو بخش حفاظتي در فايل اجرايي و يك DLL است .
من با استفاده از يك AESٍEncrypt رمز را كد كردم . براي اين كار از يك كليد استفاده نمودم .
حالا با استفاده از اين كار يك رشته كد شده دارم و يك كليد . كه بايد در كد نويسي با استفاده از AESDecrypt آن را بوسيله كليد تبديل به رشته اصلي كنم و به بانك تزريق كنم .
من با استفاده از يك روش ابداعي هم كليد و هم رشته كد شده را نابود كردم و آنها را در زمان طراحي توليد كردم . كليد را در DLL قرار دادم و رشته كد شده را در EXE .
نحوه نابود كردن رشته كد شده و كليد به اين صورت است .
در فايل اجرايي براي رشته كد شده :
const
dbs: array [0..43] of Byte= (
$B5,$F1,$74,$49,$B1,$AF,$48,$7F,$31,$14,$36,$A7,$3 B,$51,$BB,$40,
$81,$D6,$46,$2C,$9D,$87,$BB,$E8,$ED,$CB,$BC,$B6,$1 A,$A4,$05,$CE,
$2E,$97,$E0,$E5,$4B,$B8,$44,$11,$F0,$A5,$E6,$67
);
function dcf(aBegPos, aLength: Integer): string;
var tmp: string;
i, endPos: Integer;
MyKey: word;
begin
{$I VM_Start_WithLevel.inc}
MyKey:= 63444;
SetLength(Result, aLength);
tmp:= '';
endPos:= aBegPos+ aLength -1;
for i:= aBegPos to endPos do
tmp:= tmp+ Chr(dbs[i]);
for i:= 1 to Length(tmp) do
begin
Result[i]:= Char(Byte(tmp[i]) xor (MyKey shr 8));
MyKey:= (Byte(tmp[i])+ MyKey)* 34523+ 34623;
end;
{$I VM_End.inc}
همانطور كه در بالا مي بينيد از سيستم ماشين مجازي TheMida همراه با Level استفاده كرده ام اين كار باعث مي شود كه يك پيچيدگي بسيار زيادي به كدها اعمال شود و روند تريس را بسيار كند و درهم كند .
من از Level پانزده استفاده كردم اين لول مي تواند تا 255 باشد كه يك پيچيدگي بسيار بالا و بسيار كند است .
در DLL براي كليد :
library Special;
{$R *.res}
function DBPASS:String; stdcall;
function dcf(aBegPos, aLength: Integer): string;
const
dbs: array [0..19] of Byte= (
$51,$72,$F2,$09,$24,$82,$51,$65,$C9,$5E,$CD,$23,$0 1,$B7,$3A,$CE,
$3F,$7C,$23,$43
);
var tmp: string;
i, endPos: Integer;
MyKey: word;
begin
MyKey:= 12345;
SetLength(Result, aLength);
tmp:= '';
endPos:= aBegPos+ aLength -1;
for i:= aBegPos to endPos do
tmp:= tmp+ Chr(dbs[i]);
for i:= 1 to Length(tmp) do
begin
Result[i]:= Char(Byte(tmp[i]) xor (MyKey shr 8));
MyKey:= (Byte(tmp[i])+ MyKey)* 52845+ 22719;
end;
end;
begin
{$I CodeReplace_Start.inc}
Result:=dcf(0 ,20);
{$I CodeReplace_End.inc}
end;
exports
DBPASS;
begin
end.
در dll از روش جايگزيني كد نيز براي ارسال كليد استفاده شده در اين روش كد ها به يك مكان خالي حافظه در هنگام اجرا منتقل شده در حالتي بسيار امن داده پس از توليد ارسال مي شود و دوباره كدها نابود مي شوند . اين روش به اين سبك فقط مخصوص Themida است .
دوستان از آن استفاده كنيد و لذت ببريد
حالا در فايل اجرايي درون كليد اين كدها به اينصورت نوشتم :
{$I CodeReplace_Start.inc}
DBISAMSession1.AddPassword(AESDecrypt(dcf(0 ,44),DBPASS));
Table1.Open;
MessageBox(0,pchar(Table1.fieldbyname('Message').a sstring),'',0);
Application.Terminate;
{$I CodeReplace_End.inc}
در انجا نيز اگر دقت كنيد از كد ريپليس استفاده شده است .
و در كل اين روش تا 80 درصد مي تواند كدهاي و رشته هاي شما از دست قوي ترين كركرها در امان بگذارد . و نهايتا كار هركسي نيست كه بتواند كدها و رمزهاي شما را پيدا كند .
يا به زبان ساده تر نفراتي كه مي توانند برنامه شما را كرك كنند كمتر و كمتر خواهد شد.
امدوارم استفاده لازم را برده باشيد .
در آخر هم با TheMida پكش كردم كه هركسي تواند حتي بازش كند .