Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Генерация комбинаций (http://forum.oszone.net/showthread.php?t=129655)

morgan1991 23-01-2009 21:43 1017278

Генерация комбинаций
 
Скажите пожалуйста, можно ли средствами автоита сгенереровать .тхт документ с всеми возможными комбинациями клавиатуры от 6 до 20 символов, на каждой новой строчке новая комбинация?

Creat0R 23-01-2009 21:56 1017289

Цитата:

Цитата morgan1991
можно ли средствами автоита сгенереровать .тхт документ с всеми возможными комбинациями клавиатуры от 6 до 20 символов »

Можно. Но как понимать «возможными комбинациями клавиатуры от 6 до 20 символов»? Можно пример подобной комбинации?

morgan1991 23-01-2009 23:35 1017444

Цитата:

Цитата Creat0R
Можно пример подобной комбинации? »

;ijd;gjj
;jnx;dgnh
jdjjdkgkkrtjh
kdjfngjj
лорир
жлдовар
54524енкнеан5

Обсалютно любые комбинации, на обоих языках.

266903582 24-01-2009 00:01 1017480

Можно попробовать так.
Код:

HotKeySet("{esc}","es")
$file=FileOpen("comb.txt",1)
Dim $alph[61]
$alph[0]="a"
$alph[1]="b"
$alph[2]="c"
$alph[3]="d"
$alph[4]="e"
$alph[5]="f"
$alph[6]="g"
$alph[7]="h"
$alph[8]="i"
$alph[9]="j"
$alph[10]="k"
$alph[11]="l"
$alph[12]="m"
$alph[13]="n"
$alph[14]="o"
$alph[15]="p"
$alph[16]="q"
$alph[17]="r"
$alph[18]="s"
$alph[19]="t"
$alph[20]="u"
$alph[21]="v"
$alph[22]="w"
$alph[23]="x"
$alph[24]="y"
$alph[25]="z"
$alph[26]="а"
$alph[27]="б"
$alph[28]="в"
$alph[29]="г"
$alph[30]="д"
$alph[31]="е"
$alph[32]="ё"
$alph[33]="ж"
$alph[34]="з"
$alph[35]="и"
$alph[36]="й"
$alph[37]="к"
$alph[38]="л"
$alph[39]="м"
$alph[40]="н"
$alph[41]="о"
$alph[42]="п"
$alph[43]="р"
$alph[44]="с"
$alph[45]="т"
$alph[46]="у"
$alph[47]="ф"
$alph[48]="х"
$alph[49]="ц"
$alph[50]="ч"
$alph[51]="ш"
$alph[52]="щ"
$alph[53]="ъ"
$alph[54]="ы"
$alph[55]="ь"
$alph[56]="э"
$alph[57]="ю"
$alph[58]="я"
$alph[59]=" "
$alph[60]=""


;#cs
For $i1=60 to 0 Step -1
        ;#include<thread2.au3>
        For $i2=60 to 0 Step -1
                For $i3=60 to 0 Step -1
                        For $i4=60 to 0 Step -1
                                For $i5=60 to 0 Step -1
                                        For $i6=60 to 0 Step -1
                                                For $i7=60 to 0 Step -1
                                                        For $i8=60 to 0 Step -1
                                                                For $i9=60 to 0 Step -1
                                                                        For $i10=60 to 0 Step -1
                                                                                FileWrite($file,$alph[$i1]&$alph[$i2]&$alph[$i3]&$alph[$i4]&$alph[$i5]&$alph[$i6]&$alph[$i7]&$alph[$i8]&$alph[$i9]&$alph[$i10]&@CRLF)
                                                                        Next
                                                                Next
                                                        Next
                                                Next
                                        Next
                                Next
                        Next
                Next
        Next
Next
MsgBox(0,$br,$co)
;#ce

Func es()
        if MsgBox(4,"","Выходим?")=6 Then Exit
EndFunc

это образец, немного доработай для своих нужд, набор символов подкорректируй...

morgan1991 24-01-2009 00:37 1017516

Спасибо

Creat0R 24-01-2009 01:39 1017550

Цитата:

Цитата 266903582
Можно попробовать так »

Сорри, не удержался.

Это долго...

Для начала вот функция гинерирующая строку от 6 до 20 случайных символов:

Код:

$sRandomString = _StringGetRandomString(6, 20)

MsgBox(64, "Result", $sRandomString)

Func _StringGetRandomString($iMin=1, $iMax=1)
    If $iMax < $iMin Then Return SetError(1, 0, 0)

    Local $iRandom
    Local $sRet_Str = ''

    For $i = 1 To Random($iMin, $iMax, 1)
        $sRet_Str &= Chr(Random(33, 255, 1))
    Next

    Return
$sRet_Str
EndFunc


Creat0R 24-01-2009 02:11 1017574

Вообщем задача не на скорую руку, вот пример используя функцию выше, у меня на P4 ушло около 30'ти секунд! на гинерацию всех(?) вариантов от 6 до 7, т.ч можете представить сколько уйдёт на 6-20:

Код:

$sFile_Content = ""

$iMin_Number = 6
$iMax_Number = 20

$iVars_Count = 0

;Подсчитываем возможное число вариантов для значении 6 - 20.
For $i = $iMin_Number To $iMax_Number
    $iVars_Count
+= _NumberVarsCount($i)
    ConsoleWrite($iVars_Count & @CRLF)
Next

;Проходимся столько раз (сколько есть вариантов у 6-20) в цикле и получаем случайные строки содержащие от 6-ти до 20-ти символов.
For $i = 1 To $iVars_Count
    $sRandomString
= _StringGetRandomString($iMin_Number, $iMax_Number)

    While StringInStr($sFile_Content, $sRandomString & @CRLF)
        $sRandomString = _StringGetRandomString($iMin_Number, $iMax_Number)
    WEnd

    $sFile_Content &= $sRandomString & @CRLF
Next

FileWrite("File.txt", $sFile_Content)

Func _StringGetRandomString($iMin=1, $iMax=1)
    If $iMax < $iMin Then Return SetError(1, 0, 0)

    Local $iRandom
    Local $sRet_Str = ''

    For $i = 1 To Random($iMin, $iMax, 1)
        $sRet_Str &= Chr(Random(33, 255, 1))
    Next

    Return
$sRet_Str
EndFunc

Func
_NumberVarsCount($Number)
    If Not IsNumber($Number) Then Return SetError(1, 0, $Number)
    If $Number > 65 Then Return SetError(2, 0, -1)

    Local $iCnt, $iNumber = 1

    For $iCnt = 1 To $Number-1
        $iNumber *= ($iCnt+1)
    Next

    Return
SetError(0, 0, $iNumber)
EndFunc


266903582 24-01-2009 12:11 1017786

Цитата:

Цитата Creat0R
Сорри, не удержался.
Это долго... »

Я просто переделал выдранный кусок переборщика паролей (лет 5 назад писал на сях) и переписал на автоите. Самому катать мощный брутофорс сейчас практически нет смысла...
P. S. если на ночь оставить, то до 15-ти символов может добраться :)

Creat0R 24-01-2009 13:26 1017844

Цитата:

Цитата 266903582
если на ночь оставить, то до 15-ти символов может добраться »

Не доберётся вроде, в примере ведь только 10 циклов :)

Вот тут остаётся важный вопрос, возможно ли запустить заданное число (в переменной) рекурсивных циклов, т.е один выполняется в другом? Тогда можно было бы сделать функцию, и дать возможность указать число символов для гинерации (или подбора, если делать для перебора паролей).

Примерно вот так (это в теле последнего цикла):

Код:

For $j = 1 To $iMax_Pass_Chars
    $sChars
&= $aAlpha_Chars[Eval("i" & $j)]
Next

Где $sChars это текущая сгинерированная строка...

266903582 24-01-2009 14:01 1017883

Цитата:

Цитата Creat0R
Не доберётся вроде, в примере ведь только 10 циклов »

По тому, что мне лень было добавлять большее количество уровней, а из примера видно как расширить возможности и общий принцип работы ясен...
Цитата:

Цитата Creat0R
Вот тут остаётся важный вопрос, возможно ли запустить заданное число (в переменной) рекурсивных циклов »

Когда я последний раз думал об этом, то остановился на мысли о постоянно растущих объемах передаваемых и возвращаемых промежуточных параметров, что значительно снизит производительность перебора (+ ограничение глубины 5099 вызовами). По идее рекурсия будет малоэффективна, но на досуге можно подумать еще...

266903582 28-01-2009 17:23 1022510

На данный момент финальная версия такова:
Код:

HotKeySet("{esc}","es")
$file=FileOpen("comb.txt",2)
Dim $symb_array[69]
        $symb_array[0]=""
        $symb_array_start=$symb_array[0]
        $symb_array_end=68
$wlength=InputBox("","Введите максимальную длину перебираемых слов")
Dim $out[$wlength]
$outlength=$wlength-1
$c=1
for $i=48 To 57 Step 1
        afill($i)
Next
for $i=97 To 122 Step 1
        afill($i)
Next
for $i=224 to 255 Step 1
        afill($i)
Next
$n_up=0
For $i=0 To $outlength Step 1
        $out[$i]=$symb_array_start
Next
While 1
        $out[$outlength]=fpp($outlength)
        flwr()
        check();=1 Then Exit
WEnd
;~ ###################################################
Func es()
        if MsgBox(4,"&","Выходим?")=6 Then Exit
EndFunc
Func fpp($index)
        For $i=0 To $symb_array_end Step 1
                if $symb_array[$i]=$out[$index] Then Return $symb_array[$i+1]
        Next
EndFunc
Func flwr()
        $tofile=""
        For $j=0 To $outlength Step 1
                $tofile&=$out[$j]
        Next
        FileWrite($file,$tofile&@CRLF)
EndFunc
Func check()
        if $out[$outlength]=$symb_array[$symb_array_end] And $n_up=0 Then                ;
                $n_up+=1
                offset($outlength)
        EndIf
EndFunc
Func offset($i)
;~        MsgBox(0,"","offset($i)="&$i)
        if $i<1 Then Exit
        if $out[$i-1]<>$symb_array[$symb_array_end] Then
                $out[$i-1]=fpp($i-1)
                For $j=$i to $outlength Step 1
                        $out[$j]=$symb_array[1]
                        if $j=$outlength Then $out[$j]=$symb_array_start
                Next
        Else
                $n_up+=1
                offset($i-1);$n_up);+1)
        EndIf
        $n_up-=1
EndFunc
Func afill($char)
        $symb_array[$c]=Chr($char)
        $c+=1
EndFunc

Единственный недостаток - если нужно перебирать разнорегистробуквенные слова, то работать придется с кодами символов, а не с символами, т.к. для автоита А=а...

Creat0R 29-01-2009 00:37 1023005

Цитата:

Цитата 266903582
для автоита А=а »

Но зато не A==a ;)

morgan1991 29-01-2009 15:05 1023492

Спасибо всем! А как ещё изменить это:
Цитата:

Цитата 266903582
На данный момент финальная версия такова: »

Так чтобы генерировалось без русских букв?

266903582 29-01-2009 23:33 1023965

morgan1991, Без русских так:
Код:

HotKeySet("{esc}","es")
$file=FileOpen("comb.txt",2)
Dim $symb_array[37]
        $symb_array[0]=""
        $symb_array_start=$symb_array[0]
        $symb_array_end=36
$wlength=InputBox("","Введите максимальную длину перебираемых слов")
Dim $out[$wlength]
$outlength=$wlength-1
$c=1
for $i=48 To 57 Step 1
        afill($i)
Next
for $i=97 To 122 Step 1
        afill($i)
Next
$n_up=0
For $i=0 To $outlength Step 1
        $out[$i]=$symb_array_start
Next
While 1
        $out[$outlength]=fpp($outlength)
        flwr()
        check()
WEnd
;~ ###################################################
Func es()
        if MsgBox(4,"&","Выходим?")=6 Then Exit
EndFunc
Func fpp($index)
        For $i=0 To $symb_array_end Step 1
                if $symb_array[$i]=$out[$index] Then Return $symb_array[$i+1]
        Next
EndFunc
Func flwr()
        $tofile=""
        For $j=0 To $outlength Step 1
                $tofile&=$out[$j]
        Next
        FileWrite($file,$tofile&@CRLF)
EndFunc
Func check()
        if $out[$outlength]=$symb_array[$symb_array_end] And $n_up=0 Then                ;
                $n_up+=1
                offset($outlength)
        EndIf
EndFunc
Func offset($i)
        if $i<1 Then Exit
        if $out[$i-1]<>$symb_array[$symb_array_end] Then
                $out[$i-1]=fpp($i-1)
                For $j=$i to $outlength Step 1
                        $out[$j]=$symb_array[1]
                        if $j=$outlength Then $out[$j]=$symb_array_start
                Next
        Else
                $n_up+=1
                offset($i-1)
        EndIf
        $n_up-=1
EndFunc
Func afill($char)
        $symb_array[$c]=Chr($char)
        $c+=1
EndFunc



Время: 10:12.

Время: 10:12.
© OSzone.net 2001-