PDA

View Full Version : غيرفعال كردن بخشي از برنامه(Crack Me)



دنیای دلفی
دوشنبه 17 تیر 1387, 19:35 عصر
سلام و خسته نباشيد
برنامه پك نشده است
اين برنامه با زدن يك كليد دو عدد پروسس بار را كه روي فرم هستند پر مي كند.
:گیج:كاري كنيد كه يكي از پروسس بارها پر نشود و غيرفعال شود .:گیج:

ممنون مي شوم وقت مي گذاريد .
بعد از اين كار سطح كار و مدت زمان مورد نياز را بيان كنيد:متفکر:

دنیای دلفی
سه شنبه 18 تیر 1387, 13:47 عصر
بروبچ آيا كسي بررسي كرده وضعيت اين كرك مي را ؟

B-Vedadian
سه شنبه 18 تیر 1387, 14:38 عصر
سلام،

از Code Virtualizer استفاده کردید؟

دنیای دلفی
سه شنبه 18 تیر 1387, 14:46 عصر
دمت گرم .
چقدر كار را مشكل تر مي كند . آيا تاثيري در پيچيدگي و روند كرك كردن برنامه دارد .
آيا مي توانيد گروهي از كركرها را از برنامه دور كند (مبتدي . متوسط)

ممنون اگر توضيح دهيد

B-Vedadian
سه شنبه 18 تیر 1387, 14:59 عصر
بالاخره یقین پیدا نکردم همین Code Virtualizer شرکت Orean رو استفاده کردید یا نه؟

در مورد پیچیدگی بهتره من نظر ندم چون این کاره نیستم. من در واقع روند اجرای برنامه رو درست نفهمیدم، فقط بخشی که قراره progress bar ها رو update کنه عوض کردم که فقط یکی از اون ها رو update کنه.

تو رویه مربوط به این کار، progress barی که قراره update بشه بر اساس پارامتر ورودی انتخاب میشد، تو تغییر یافته دیگه به پارامتر ورودی ربطی نداره، همیشه فقط یکدومشونه.

دنیای دلفی
سه شنبه 18 تیر 1387, 15:33 عصر
درسته كد ويژالايزر است
ولي اين جمله را درست متوجه نشدم

تو رویه مربوط به این کار، progress barی که قراره update بشه بر اساس پارامتر ورودی انتخاب میشدميشه بيشتر توضيح بدهيد

B-Vedadian
سه شنبه 18 تیر 1387, 21:47 عصر
يه تابع داشتي به فرم


function UpdateProgress(ProgressBar: TWinControl; Position: Integer)موقع به روز کردن موقعيت هم

SendMessage(ProgressBar.Handle, PBM_SETPOS, Position, 0)اينو عوضش کردم حالا ديگه پارامتر ProgressBar بي اثره.

دنیای دلفی
سه شنبه 18 تیر 1387, 23:46 عصر
پس با اين تفاسير سورس پروسس بار را تغيير دادي .
من مي خواستم ببينم آيا مي توانيد (من يك حلقه For دارم كه از يك تا 10 مي شمارد و پروسس بارها را مقداردهي مي كند مي خواستم ببينم كه آيا مي توانيد فرمان مقدار دهي را براي يكي از پروسس بارها در حلقه For ملغي كنيد)

دنیای دلفی
چهارشنبه 19 تیر 1387, 00:19 صبح
مانند قبلي اينبار از هيچ ابزاري استفاده نشده بايد درون حلقه For را دستكاري كنيد تا يكي از پروسس بارها را غير فعال كنيد.

Securebit
چهارشنبه 19 تیر 1387, 02:15 صبح
اینم حذف به روشی دیگر پتچ به صورت اینلاین:چشمک:

dintic
چهارشنبه 19 تیر 1387, 03:37 صبح
سلام من تازه دارم این درس مهندسی معکوس را فرا می گیرم و علاقه شدیدی بهش دارم.
فقط دوست دارم که یک فیلم آموزشی در رابطه با همین پست که چطوری اینکار را کردید را یکی از شما عزیزان بزاره تا هم من و هم دیگران استفاده کنن.
اگر این خواسته را انجام بدید خیلی ممنون میشم.
یاحق.

مهران موسوی
چهارشنبه 19 تیر 1387, 04:00 صبح
bardia_dst جان فايلي كه شما گذاشتي كركر شدهي پست شماره ي 9 هست يعني ؟؟؟

من كه هيچ تغييري به جز جا به جا شدن يك پروسس بار و اظافه شدن حجم فايل كرك شده حس نكردم ... در ضمن هر دو تا پروسس بار ها هم پر ميشن .... خو بگذريم ....

-----------

خيلي وقت بود زياد به اينجا سر نميزدم ... علتش هم اين بود كه چندين تا پرژه دارم انجام ميدم كه دارم روي اونا كار ميكنم ...

خوب من اين فايل دنياي دلفي عزيز رو كرك كردم ...

روش امنيتي : Code Virtualizer

توضيحات : برنامه قسمتي كه كدهاي امنيتي نوشته شده بود رو در زمان اجرا ايجاد ميكرد و بعدش هم اونها رو در هر بار اجراي تابع رويداد كليك ترميم ميكرد ....

سطح امنيت : 10%

نكته : كار كركرهاي اماتور رو سخت ميكنه و به قول خودتون خستشون ميكنه ...


راستي سورس يادت نره من منتظر سورسش هم هستم .. :لبخند: ( اگه سورس ندي ديگه روي بعدي كار نميكنم :بامزه: )

دنیای دلفی
چهارشنبه 19 تیر 1387, 09:58 صبح
بلاخره يك نفر بايد سنت شكني كند و سورس واقعي بگذارد من با جرات به همراه توضيحات مكفي اين كار را انجام مي دهم .خيلي ها ممكن است خوششان نيايد چون مجبور مي شوند آنها نيز سورس بگذارند .

من يك فرم ايجاد كردم و يك كليد روي فرم گذاشتم و دوتا پروسس بار سپس كدهاي زير را درون كليد نوشتم گذاشتم .


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 تشكر شد :بامزه:از اين كد معلومه خوشتون آمده بعد يك كد خفن ديگه از نوشته هام مي گذارم اگر هم تشكر نشد باز هم ممنون از وقتي كه دوستان گذاشتند.

مهران موسوی
چهارشنبه 19 تیر 1387, 10:03 صبح
از همكاري صادقانت خوشم اومد .... ( حداقل جوري شد كه از قوانين پيروي كريدم و تاپيك داراي محتواي مفيد هستش )

بايد بگم كه نوشتن لودر هم براش كاري نداره .. اگه خواستي بگو بنويسم و بزارم ...

Developer Programmer
چهارشنبه 19 تیر 1387, 20:46 عصر
Mehran@
دنیای دلفی ، طبق مقررات روش کارش رو گذاشت و باعث بوجود اومدن تاپیک مفید شد. حالا نوبت شماست که روش کارت رو به تفصیل شرح بدی!

مهران موسوی
چهارشنبه 19 تیر 1387, 23:56 عصر
خوب من كه گفتم ....

عب نداره بازم بيشتر توضيح ميدم ....


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);به خطوط رنگي دقت كنيد ... !!!

برنامه رو تا اولين خط رنگي در ديباگر دنبال ميكنيم ... بعد از اجرا شدن اين خط تمامي كدهاي مربوطه كه وظيفه ي انجام عمليات امنيتي رو دارن در حافظه جايگزين Nop ها ميشن ... ديگه برنامه رو ادامه نميديم ... بلافاصله كدهاي جايگزين شده رو كپي برداري ميكنيم ...

بعد برنامه رو از اول شروع ميكنيم و به ادرس تابع رويداد كليك ميريم ... و كدهاي كپي شده رو جايگزين Nop ها ميكنيم و بعدش هم توابع ترميم كننده رو از بين ميبريم ... تا اينجا عمليات بازسازي انجام شد ... حالا هم قسمتي كه پروسس بار ها رو به روز ميكنه يكيشون رو به دلخواه حذف ميكنيم كه بعد از بازسازي بسيار ساده هست و نيازي به تخصص نداره ... بعدش هم برنامه رو اجرا ميكنيم و بعد هم كه Dump و فايل كرك شده رو اپلود ميكنيم و منتظر ميمونيم تا فردي كه كرك مي رو گذاشته سورس رو بزاره ... :لبخند: ( هر چند من كركر نيستم و فقط وقتي در هين انجام پرژه هاي برنامه نويسي بهم فشار مياد ميام يك كرك مي انتخاب ميكنم و كرك ميكنم تا ذهنم باز بشه :لبخندساده: )

از اين به بعد همگي بايد از اين قوانين پيروي كنند و مديران وظيفه دارند با فردي كه رعايت نميكنه برخورد كنن .... ( بايد اين شيوه رو به شكل يك فرهنگ در اين انجمن در بياريم ) ...

اگه مديران همكاري نكنن واقعا هم خودشون و هم ما رو به زير سوال ميبرن .. يا از اول نبايد اون اطلاعيه رو بالاي سايت ميزدين يا حالا كه زدين بايد همكاري كنيد ....

يا حق ...

Developer Programmer
جمعه 21 تیر 1387, 17:28 عصر
خوب، تنها آرزوی من این بود که یکی مثل "دنیای دلفی" باشه که سنت شکنی کنه و جامع و کامل روش کارش رو توضیح بده و هیچ نکته نگفته ای رو باقی نذاره.
در عوض کسی هم باشه که روش کرکش رو کامل و جامع توضیح بده...گاهی اوقات نمیشه فهمید که چرا کرکر فلان خط رو تغییر میده، دلیلش چیه
واسه همین، روش حل رو طوری توضیح میدم که تازه وارد ها هم یه تکونی بخورن

اول برنامه رو با PEid باز میکنیم، این برنامه واسه فهمیدن زبان یا پکر مورد استفاده، خیلی کاربرد داره.
PEid میگه که زبان مورد استفاده Borland Delphi 6.0 - 7.0 بوده بعلاوه یکسری توضیحات دیگه که فعلا کاری باهاشون نداریم.
من تقریباهمیشه وقتی به برنامه ای که با Delphi نوشته شده باشه برخورد کنم اون رو با PE Explorer باز میکنم و Disassemble میکنم... یه تب داره به اسم VCL Methods که Event های مورد استفاده برنامه رو نشون میده...
آدرس0044E920 رو یادداشت میکنیم. حالا برنامه رو با Ollydbg باز میکنیم و کلید Gtrl+G رو میزنیم و آدرس 0044E920 رو که از قبل بدست آوردیم تایپ میکنیم... اینکار ما رو مستقیما به آدرس مورد نظر میبره... حالا یک بار کلید F2 رو میزنیم تا یه BreakPoint گذاشته بشه.


0044E920 PUSH EBX ; buttonClick
0044E921 PUSH ESI
0044E922 PUSH EDI
0044E923 MOV ESI, EAX
0044E925 CALL Project1.0044E5A8 ;function MainData
0044E92A MOV ECX, EAX
0044E92C MOV EDX, 5B
0044E931 MOV EAX, Project1.0044E94B
0044E936 CALL Project1.0044E54C ;WriteCurrectDataToAddreses
0044E93B MOV EDX, 0A
0044E940 MOV EAX, DWORD PTR DS:[ESI+2F8]
0044E946 CALL Project1.004260A0
...
0044E9A6 CALL Project1.0044E764 ; Function MainData1
0044E9AB MOV ECX, EAX
0044E9AD MOV EDX, 5B
0044E9B2 MOV EAX, Project1.0044E94B
0044E9B7 CALL Project1.0044E54C ;WriteCurrectDataToAddreses
یکبار F9 رو بزنین تا برنامه اجرا بشه... بلافاصله بعد از کلیک، به همون BreakPoint میرسین حالا اگه با F7 خط به خط برنامه رو Trace کنین، به همون توضیحات "دنیای دلفی" میرسین؛ واسه همین اسم توابع مورد نیاز رو جلوشون نوشتم.
همونوطور که مهران گفت، کافیه رشتهBA0A00 رو که برنامه همیشه در آدرس0044E94B مینویسه رو در برنامه درج کنیم و بعد دو تابعی که MainData و MainData1 رو می نویسن رو ناتوان کنیم. (اگه با MainData کار نداشته باشیم، تغییراتمون بی تاثیر میشن و اگه با MainData1 کاری نداشته باشیم، تغییرات NOP میشن)

همین طور که دارید F7 رو میزنین به این خطوط می رسین

0044E54C 53 PUSH EBX
0044E54D |. 56 PUSH ESI
0044E54E |. 57 PUSH EDI
0044E54F |. 55 PUSH EBP
0044E550 |. 83C4 F8 ADD ESP, -8
0044E553 |. 8BE9 MOV EBP, ECX
0044E555 |. 8BF8 MOV EDI, EAX
0044E557 |. 8BF2 MOV ESI, EDX
0044E559 |. 68 9CE54400 PUSH Project1.0044E59C ; /Title = "crack me"
0044E55E |. 6A 00 PUSH 0 ; |Class = 0
0044E560 |. E8 5F7DFBFF CALL <JMP.&user32.FindWindowA> ; \FindWindowA
0044E565 |. 8D5424 04 LEA EDX, DWORD PTR SS:[ESP+4]
0044E569 |. 52 PUSH EDX ; /pProcessID
0044E56A |. 50 PUSH EAX ; |hWnd
0044E56B |. E8 BC7EFBFF CALL <JMP.&user32.GetWindowThreadProc>; \GetWindowThreadProcessId
0044E570 |. 8B4424 04 MOV EAX, DWORD PTR SS:[ESP+4]
0044E574 |. 50 PUSH EAX ; /ProcessId
0044E575 |. 6A 00 PUSH 0 ; |Inheritable = FALSE
0044E577 |. 68 FF0F1F00 PUSH 1F0FFF ; |Access = PROCESS_ALL_ACCESS
0044E57C |. E8 DB79FBFF CALL <JMP.&kernel32.OpenProcess> ; \OpenProcess
0044E581 |. 8BD8 MOV EBX, EAX
0044E583 |. 54 PUSH ESP ; /pBytesWritten
0044E584 |. 56 PUSH ESI ; |BytesToWrite
0044E585 |. 55 PUSH EBP ; |Buffer
0044E586 |. 57 PUSH EDI ; |Address
0044E587 |. 53 PUSH EBX ; |hProcess
0044E588 |. E8 3F7AFBFF CALL <JMP.&kernel32.WriteProcessMemor>; \WriteProcessMemory
0044E58D |. 53 PUSH EBX ; /hObject
0044E58E |. E8 4978FBFF CALL <JMP.&kernel32.CloseHandle> ; \CloseHandle
0044E593 |. 59 POP ECX
0044E594 |. 5A POP EDX
0044E595 |. 5D POP EBP
0044E596 |. 5F POP EDI
0044E597 |. 5E POP ESI
0044E598 |. 5B POP EBX
0044E599 \. C3 RETN

این آدرس همون تابع WriteCurrectDataToAddreses هست که ما رو کلافه کرده.اگه این تابع اجرا بشه می بینین که Olly خطوط بین آدرس 0044E94B تا 0044E9A5 رو با رنگ قرمز نوشته، این به این معنیه که خطوط تغییر کردن، خطوط تغییر کرده همون رشته طولانی BA0A00 هستن
olly رو ببندین و با فشار Ctrl +G به آدرس0044E54C بیاین و SpaceBar رو بزنین و عبارت Retn رو تایپ کنین. اینکار باعث میشه که تابع WriteCurrectDataToAddreses هیچوقت اجرا نشه، یعنی بلافاصله بعد از ورود، خروج کنه...! اینطوری دیگه اون و مشکلی که داشتیم رفع میشن.
حالا خطوط بین آدرس 0044E94B تا 0044E9A5 رو انتخاب کنید و Ctrl+E رو فشار بدید تا بتونیم رشته BA0A00 جایگزین NOP ها کنیم.(رشته BA0A00 رو که "دنیای دلفی" نوشته بود رو کپی و در قسمت هگز، Paste کنید)
این مشکل هم رفع شد حالا برنامه رو اگه اجرا کنین، همون دو تا ProgressBar رو نشون میده ... پس تا اینجای کارمون درست بوده... حالا باید یکی از نوارها رو غیرفعال کنیم.

0044E94B BA 0A000000 MOV EDX, 0A
0044E950 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E956 E8 4577FDFF CALL Project1.004260A0
0044E95B B3 01 MOV BL, 1
0044E95D 8BFB MOV EDI, EBX
0044E95F 81E7 FF000000 AND EDI, 0FF
0044E965 8BD7 MOV EDX, EDI
0044E967 8B86 F8020000 MOV EAX, DWORD PTR DS:[ESI+2F8]
0044E96D E8 3E77FDFF CALL Project1.004260B0 ; progress1
0044E972 8BD7 MOV EDX, EDI
0044E974 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E97A E8 3177FDFF CALL Project1.004260B0 ; progress2
0044E97F 6A 64 PUSH 64
0044E981 E8 B2DAFBFF CALL <JMP.&kernel32.Sleep>
0044E986 43 INC EBX
0044E987 80FB 0B CMP BL, 0B
0044E98A ^ 75 D1 JNZ SHORT Project1.0044E95D
0044E98C 33D2 XOR EDX, EDX
0044E98E 8B86 F8020000 MOV EAX, DWORD PTR DS:[ESI+2F8]
0044E994 E8 1777FDFF CALL Project1.004260B0
0044E999 33D2 XOR EDX, EDX
0044E99B 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E9A1 E8 0A77FDFF CALL Project1.004260B0
به دلخواه یکی از دو آدرسی رو که مربوط به Progress هاست رو NOP میکنیم تا اجرا نشه.

0044E96D E8 3E77FDFF CALL Project1.004260B0 ; progress1
0044E972 8BD7 MOV EDX, EDI
0044E974 8B86 FC020000 MOV EAX, DWORD PTR DS:[ESI+2FC]
0044E97A 90 NOP ; progress2
0044E97B 90 NOP
0044E97C 90 NOP
0044E97D 90 NOP
0044E97E 90 NOP
0044E97F 6A 64 PUSH 64
0044E981 E8 B2DAFBFF CALL <JMP.&kernel32.Sleep>
حالا right-click کنید و Copy to Executable->All Modification->Copy All->Save File رو انتخاب کنین تا کلیه Patch ها، در فایل جدید ذخیره شوند.