بلاخره يك نفر بايد سنت شكني كند و سورس واقعي بگذارد من با جرات به همراه توضيحات مكفي اين كار را انجام مي دهم .خيلي ها ممكن است خوششان نيايد چون مجبور مي شوند آنها نيز سورس بگذارند .
من يك فرم ايجاد كردم و يك كليد روي فرم گذاشتم و دوتا پروسس بار سپس كدهاي زير را درون كليد نوشتم گذاشتم .
procedure TForm1.Button1Click(Sender: TObject);
var
i:Byte;
begin
ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;
end;
سپس يك تابع نوشتم كه بتواند در حافظه بعد از اجرا كدهاي مورد نظرم را بنويسد به صورت زير:
procedure WriteCurrectDataToAddress(Address : Longint;B:Integer;NameBuf:PChar);
var
BytesToWrite :Integer;
BytesWrite : cardinal;
window , ProcessId : integer;
HandleWindow : cardinal;
begin
BytesToWrite :=B;
Window := FindWindow(nil, PChar('crack me'));
GetWindowThreadProcessId(Window,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
WriteProcessMemory(HandleWindow, ptr(Address), NameBuf ,
BytesToWrite, BytesWrite);
CloseHandle(HandleWindow);
end;
اين تابع همانطور كه مشاهده مي شود داراي سه ورودي است آدرسي كه بايد از آنجا شروع به نوشتن كند . تعداد بايتهايي كه بايد بنويسد و مهم تر از همه اطلاعاتي كه بايد بنويسد .
بعد برنامه را كامپايل كردم و فايل اجرايي را ساختم سپس به وسيله برنامه بسيار بسيار قدرتمند PE Explorer فايل اجرايي را باز و كدهاي اسمبلي مربوط به درون كليد را پيدا كردم
در اصل كدهاي دلفي به صورت زير بود .
ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;
من معال كدهاي بالا را از اسمبلي به Hex در آوردم كه خود PE Explorer اين كار را انجام مي داد.
كدها به صورت زير شدند .
BA0A0000008B86FC020000E84577FDFFB3018BFB81E7FF0000 008BD78B86
F8020000E83E77FDFF8BD78B86FC020000E83177FDFF6A64E8 B2DA
FBFF4380FB0B75D133D28B86F8020000E81777FDFF33D28B86 F
C020000E80A77FDFF
اين كدها و قتي به زبان ماشين ترجمه شوند به معادل دلفي كه در بالا ديديد تبديل مي شوند.
حالا تابعي نوشتم كه بتواند كدهاي هگز را به زبان ماشين ترجمه كند .
به صورت زير :
function MainData:PChar;
var
i:integer;
Str,Data:String;
begin
Str:=
'BA0A0000008B86FC020000E84577FDFFB3018BFB81E7FF000 0008BD
78B86F8020000E83E77FDFF8BD78B86FC020000E83177FDFF6 A64E8B
2DAFBFF4380FB0B75D133D28B86F8020000E81777FDFF33D28 B86
FC020000E80A77FDFF';
Data:='';
i:=1;
while i<=Length(Str) do
begin
Data:=Data+Char(StrToInt('$'+Str[i]+Str[i+1]));
i:=i+2;
end;
Result:=PChar(Data);
end;
در بالاي برنامه هم آدرس شروع و تعداد بايتهايي را كه قرار است در حافظه نوشته شود را به صورت ثابت تعريف كردم :
const
add=$44E94B;
b=91;
بعد يك خط به كدهاي درون كليد در ابتدا اضافه كردم تا به شكل زير در آمد :
procedure TForm1.Button1Click(Sender: TObject);
var
i:Byte;
begin
WriteCurrectDataToAddress(add,b,MainData);
ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;
end;
اين خط WriteCurrectDataToAddress(add,b,MainData); باعث مي شود كه اطلاعات صحيح در آدرس مشخص شده نوشته شود اصطلاحا برنامه نويسي ثابت RunTime.
با استفاده از نرم افزار بسيار قدرتمند OlyDBG فايل كامپايل شده را باز كردم و كدهاي مربوط به كليد را پيدا كردم و همه را NOP كردم يعني اينوجوري .
909090909090909090909090909090909090909090
9090909090909090909090909090909090909090909
0909090909090909090909090909090909090909090
90909090909090909090909090
9090909090909090909090909090
حالا فايلم به صورتي در آمده كه اگر روي كليد كليك كنيد هيچ اتفاقي نمي افتد يا به زبان ساده تر كدي وجود ندارد كه اجرا شود.
حالا يك تابع نوشتم كه بعد از اجراي صحيح برنامه اطلاعات را دوباره NOP تبديل كند :
function MainData1:PChar;
var
i:integer;
Str,Data:String;
begin
Str:=
'909090909090909090909090909090909
0909090909090909090909090909090909090909090
90909090909090909090909090909090909090909090
9090909090909090909090909090909090909
0909090909090909090909090';
Data:='';
i:=1;
while i<=Length(Str) do
begin
Data:=Data+Char(StrToInt('$'+Str[i]+Str[i+1]));
i:=i+2;
end;
Result:=PChar(Data);
end;
حالا اين خط را به انتهاي فرامين كليدم اضافه كردم و فارمين كليد به شكل زير درآمد :
procedure TForm1.Button1Click(Sender: TObject);
var
i:Byte;
begin
WriteCurrectDataToAddress(add,b,MainData);
ProgressBar1.Max:=10;
ProgressBar2.Max:=10;
for i :=1 to 10 do
begin
ProgressBar1.Position:=i;
ProgressBar2.Position:=i;
Sleep(100);
end;
ProgressBar1.Position:=0;
ProgressBar2.Position:=0;
WriteCurrectDataToAddress(add,b,MainData1);
end;
هدف از اضافه كدن اين كد WriteCurrectDataToAddress(add,b,MainData1); اين است كه اطلاعات حذف شده را دوباره بعد از ترميم شدن حذف كند .
حالا وقتي روي كليد كليك مي كند اطلاعات حذف شده بازسازي مي شوند و سپس بعد از اجرا دوباره حذف مي شوند .
اين برنامه كاملا ايده اش از خودم بود و هدفم اين بود امكان استفاده از لودر را منتفي كنم مي دونم الان يكي با لودر كركش مي كنه
اميد وارم حال اين كد را ببريد اگر 25 تشكر شد از اين كد معلومه خوشتون آمده بعد يك كد خفن ديگه از نوشته هام مي گذارم اگر هم تشكر نشد باز هم ممنون از وقتي كه دوستان گذاشتند.