نمایش نتایج 1 تا 17 از 17

نام تاپیک: غيرفعال كردن بخشي از برنامه(Crack Me)

  1. #1
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

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

    سلام و خسته نباشيد
    برنامه پك نشده است
    اين برنامه با زدن يك كليد دو عدد پروسس بار را كه روي فرم هستند پر مي كند.
    كاري كنيد كه يكي از پروسس بارها پر نشود و غيرفعال شود .

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

  2. #2
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

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

    بروبچ آيا كسي بررسي كرده وضعيت اين كرك مي را ؟

  3. #3

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

    سلام،

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

  4. #4
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

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

    دمت گرم .
    چقدر كار را مشكل تر مي كند . آيا تاثيري در پيچيدگي و روند كرك كردن برنامه دارد .
    آيا مي توانيد گروهي از كركرها را از برنامه دور كند (مبتدي . متوسط)

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

  5. #5

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

    بالاخره یقین پیدا نکردم همین Code Virtualizer شرکت Orean رو استفاده کردید یا نه؟

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

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

  6. #6
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

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

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

  7. #7

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

    يه تابع داشتي به فرم

    function UpdateProgress(ProgressBar: TWinControl; Position: Integer)
    موقع به روز کردن موقعيت هم
    SendMessage(ProgressBar.Handle, PBM_SETPOS, Position, 0)
    اينو عوضش کردم حالا ديگه پارامتر ProgressBar بي اثره.

  8. #8
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

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

    پس با اين تفاسير سورس پروسس بار را تغيير دادي .
    من مي خواستم ببينم آيا مي توانيد (من يك حلقه For دارم كه از يك تا 10 مي شمارد و پروسس بارها را مقداردهي مي كند مي خواستم ببينم كه آيا مي توانيد فرمان مقدار دهي را براي يكي از پروسس بارها در حلقه For ملغي كنيد)

  9. #9
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

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

    مانند قبلي اينبار از هيچ ابزاري استفاده نشده بايد درون حلقه For را دستكاري كنيد تا يكي از پروسس بارها را غير فعال كنيد.
    فایل های ضمیمه فایل های ضمیمه

  10. #10
    مدیر بخش آواتار Securebit
    تاریخ عضویت
    آبان 1386
    محل زندگی
    تهران
    پست
    761

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

    اینم حذف به روشی دیگر پتچ به صورت اینلاین
    فایل های ضمیمه فایل های ضمیمه

  11. #11
    کاربر جدید
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اینترنت
    سن
    33
    پست
    6

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

    سلام من تازه دارم این درس مهندسی معکوس را فرا می گیرم و علاقه شدیدی بهش دارم.
    فقط دوست دارم که یک فیلم آموزشی در رابطه با همین پست که چطوری اینکار را کردید را یکی از شما عزیزان بزاره تا هم من و هم دیگران استفاده کنن.
    اگر این خواسته را انجام بدید خیلی ممنون میشم.
    یاحق.

  12. #12

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

    bardia_dst جان فايلي كه شما گذاشتي كركر شدهي پست شماره ي 9 هست يعني ؟؟؟

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

    -----------

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

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

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

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

    سطح امنيت : 10%

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


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






    فایل های ضمیمه فایل های ضمیمه

  13. #13
    VIP آواتار دنیای دلفی
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    یک جایی توی جنوب ایران
    پست
    1,298

    Smile آنچه شما خواسته ايد

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

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

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



  14. #14

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

    از همكاري صادقانت خوشم اومد .... ( حداقل جوري شد كه از قوانين پيروي كريدم و تاپيك داراي محتواي مفيد هستش )

    بايد بگم كه نوشتن لودر هم براش كاري نداره .. اگه خواستي بگو بنويسم و بزارم ...
    آخرین ویرایش به وسیله مهران موسوی : چهارشنبه 19 تیر 1387 در 10:20 صبح

  15. #15

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

    Mehran@
    دنیای دلفی ، طبق مقررات روش کارش رو گذاشت و باعث بوجود اومدن تاپیک مفید شد. حالا نوبت شماست که روش کارت رو به تفصیل شرح بدی!

  16. #16

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

    خوب من كه گفتم ....

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

    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 و فايل كرك شده رو اپلود ميكنيم و منتظر ميمونيم تا فردي كه كرك مي رو گذاشته سورس رو بزاره ... ( هر چند من كركر نيستم و فقط وقتي در هين انجام پرژه هاي برنامه نويسي بهم فشار مياد ميام يك كرك مي انتخاب ميكنم و كرك ميكنم تا ذهنم باز بشه )

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

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

    يا حق ...

  17. #17

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

    خوب، تنها آرزوی من این بود که یکی مثل "دنیای دلفی" باشه که سنت شکنی کنه و جامع و کامل روش کارش رو توضیح بده و هیچ نکته نگفته ای رو باقی نذاره.
    در عوض کسی هم باشه که روش کرکش رو کامل و جامع توضیح بده...گاهی اوقات نمیشه فهمید که چرا کرکر فلان خط رو تغییر میده، دلیلش چیه
    واسه همین، روش حل رو طوری توضیح میدم که تازه وارد ها هم یه تکونی بخورن

    اول برنامه رو با 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 ها، در فایل جدید ذخیره شوند.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •