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

نام تاپیک: BruteForce کردن یک تابع، معرفی روش و توضیح روال مربوطه

  1. #1

    BruteForce کردن یک تابع، معرفی روش و توضیح روال مربوطه

    سلام.
    همون طور که می دونید، BruteForce روشی هست که تمام حالات ممکن رو برای کلید تست می کنه تا بالاخره کلید مربوطه رو پیدا کنه. پریروز نرم افزار یک بنده خدایی رو کرک کردم (خدا منو ببخشه ) و به سرور سایت دسترسی پیدا کردم، بعد به سرم زد که با روش مزبور پسورد sa رو بزنم
    نشستم این قطعه برنامه رو نوشتم، بعد از هک صرف نظر کردم (چون خیلی زمان بر بود!)
    حالا گذشته از شوخی، دیدم که این روال جنبه آموزشی خوبی می تونه داشته باشه، از طرفی یک روال جنرال هست که به راحتی می شه برای منظورهای خاص استفاده بشه. مثلا با استفاده از همین روال، طی چند دقیقه پسورد ادمین اس کیو ال سیستم لوکالم رو که یادم رفته بود، ولی می دونستم ترکیب چند حرفی از اعداد هست رو پیدا کنم.
    مرتبه ی زمانی این تابع همون طور که انتظار می ره توان هایی از طول کلید هست، بنابراین توقع معجزه نداشته باشید، اما با بهینه سازی دیکشنری، شمارش، ارسال کلید و ... می شه به روشهای سریعتری دست پیدا کرد.

    اما یونیت مربوطه:

    unit BruteForceUnit;

    interface

    type
    TBruteForcableFunc = function (TryThis: string): boolean of object;

    function BruteForce(VictimFunc: TBruteForcableFunc; Dictionary: string; MinLength: byte = 0; MaxLength: byte = 0): string;

    implementation

    uses Math, StrUtils;

    function BruteForce(VictimFunc: TBruteForcableFunc; Dictionary: string; MinLength: byte = 0; MaxLength: byte = 0): string;

    function GetItemsBy(this, base: cardinal; deep: integer): string;
    begin
    Result := '';

    repeat
    Result := Dictionary[(this mod base) +1] + Result;
    this := this div base;
    until this = 0;

    Result := RightStr(DupeString(Dictionary[1], deep) + Result, deep);
    end;

    var
    deep, base: integer;
    n: cardinal;
    TryThis: string;
    begin
    Result := '';
    base := length(Dictionary);

    if not Assigned(VictimFunc) then Exit;
    if base = 0 then Exit;
    if MinLength < 1 then MinLength := 1;
    if MaxLength > base then MaxLength := base;
    if MinLength > MaxLength then MaxLength := base;

    for deep := MinLength to MaxLength do
    begin
    for n := 0 to Floor(Power(base, deep)) -1 do
    try
    TryThis := GetItemsBy(n, base, deep);
    if VictimFunc(TryThis) then
    begin
    Result := TryThis;
    Exit;
    end;
    except
    end;
    end;
    end;

    end.


    این هم تست:

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    private
    function CheckPassword(Pass: string): boolean;
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    uses BruteForceUnit;

    {$R *.dfm}

    { TForm1 }

    function TForm1.CheckPassword(Pass: string): boolean;
    begin
    // Caption := Pass; {this line makes function really slow}

    Result := Pass = {091237} '80840';
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    ret: string;
    begin
    ret := BruteForce(CheckPassword, '0123456789');
    if ret <> '' then
    ShowMessage('HORA! Password is "' + ret + '"')
    else
    ShowMessage('Not successfull');
    end;

    end.


    برنامه رو هم می تونید از اینجا دانلود کنید:
    BruteForce.rar

    VictimFunc تابعی هست که یک رشته می گیره و اگر اون رشته مورد نظر ما بود true برمی گردونه. مثلا رشته رو در پایگاه داده چک می کنه، یا هر چیز دیگه. در اینجا فقط برای مثال یک تابع الکی کال شده.

    Dictionary هم کاراکترهایی هست که کلید باید از روی اونها ساخته بشه. همون طور که الان دارید فکر می کنید، اگر ترکیب اعداد و حروف بزرگ و کوچک رو در نظر بگیریم، می شه 10 + 26 + 26 یعنی 62 تا. در نظر بگیرید بدونیم طول رشته کلید 5 باشه، 62 به توان 5 حالت باید چک بشه. برای همینه که می گم فکرای بد بد نکنید!

    اون دو تا پارامتر دیگه هم که معلومه کارشون چیه. توضیح نمی دم.

    روش کار تابع به این صورته که برای هر طول انتخاب شده، در مبنای طول دیکشنری، اعداد رو تبدیل به مبنای مورد نظر می کنیم. شاید یکم سخت به نظر برسه ولی به بررسیش می ارزه. برای مثال می تونید اون قطعه Caption رو از کامنت در بیارید تا ببینید داره چه اتفاقی می افته.
    مثلا اگر دیکشنری مون فقط ABC باشه، و طول 2 رو بخواهیم چی می شه؟

    از 0 تا 8 می شماریم (3 به توان 2 منهای 1)
    نتیجه می شه:
    AA
    AB
    AC
    BA
    BB
    BC
    CA
    CB
    CC
    یعنی تمام حالات ممکن.

    روش مورد نظر می تونه برای تبدیل مبناها، و البته ساخت فضای نمونه ی تمام حالات و ترکیب های ممکن مثلا در محاسبات آماری هم بکار بره.
    به راحتی یک تابع رو بهش می دید و ..

    اگر سوالی هم داشتید بگید تا هر جا گنگ بود توضیح بدم.
    توابع تبدیل تاریخ با دقت 5000 سال
    پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840

    دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/


    نرم افزار پخش مویرگی

  2. #2

    نقل قول: BruteForce کردن یک تابع، معرفی روش و توضیح روال مربوطه

    سلام
    به نظرت بهتر نبود اگه این تاپیک رو توی بخش مقالات قرار میدادی؟

  3. #3

    نقل قول: BruteForce کردن یک تابع، معرفی روش و توضیح روال مربوطه

    لینک در سورس های نمونه آموزشی قرار داده شد. منظورت همون جا بود دیگه؟
    توابع تبدیل تاریخ با دقت 5000 سال
    پذیرش پروژه، کامپوننت، آموزش برنامه نویسی (دلفی، اس کیو ال، ..) -> 09123780840

    دوستای گلم حمایت کنید : https://cafebazaar.ir/app/com.nikanmehr.marmarxword/


    نرم افزار پخش مویرگی

  4. #4

    نقل قول: BruteForce کردن یک تابع، معرفی روش و توضیح روال مربوطه

    زبان برنامه پاسکال هست؟
    کاشکی به سی شارپ بود!

  5. #5

    نقل قول: BruteForce کردن یک تابع، معرفی روش و توضیح روال مربوطه

    نقل قول نوشته شده توسط Ebrahim_Rayaneh مشاهده تاپیک
    زبان برنامه پاسکال هست؟
    کاشکی به سی شارپ بود!
    سلام
    با اجازه You-See با کمی تغییر به #C تبدیل کردم
    اینم واسه اینکه آرزو به دل نمونید
    برنامه اصلی را در لازاروس اجرا کردم نکته جالب اینه که سرعت سی شارپ از برنامه کامپایل شده با لازاروس بیشتر بود
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله rahnema1 : شنبه 02 اسفند 1393 در 08:02 صبح

تاپیک های مشابه

  1. معکوس کردن یک کلمه به روش بازگشتی
    نوشته شده توسط farzaneh_gerami در بخش الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها
    پاسخ: 3
    آخرین پست: شنبه 18 مهر 1388, 12:10 عصر
  2. پاسخ: 2
    آخرین پست: شنبه 19 بهمن 1387, 08:59 صبح
  3. تفاوت روش Fill کردن یک دیتاتیبل و روش استفاده از DataReader (پارامتر سرعت)
    نوشته شده توسط hanieh66 در بخش دسترسی به داده ها (ADO.Net و LINQ و ...)
    پاسخ: 7
    آخرین پست: جمعه 21 تیر 1387, 13:21 عصر
  4. سوال: لطفا یک سورس برای پیدا کردن مسیر برنامه معرفی کنید
    نوشته شده توسط googoolak در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 2
    آخرین پست: پنج شنبه 19 اردیبهشت 1387, 14:00 عصر
  5. باز کردن زیر منو به روش دیگر
    نوشته شده توسط علی رضائی در بخش کامپوننت های سایر شرکت ها، و توسعه کامپوننت
    پاسخ: 2
    آخرین پست: چهارشنبه 17 مرداد 1386, 08:00 صبح

برچسب های این تاپیک

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

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