-
AutoIt
(
http://forum.oszone.net/forumdisplay.php?f=103)
morgan1991 |
23-01-2009 21:43 1017278 |
Генерация комбинаций
Скажите пожалуйста, можно ли средствами автоита сгенереровать .тхт документ с всеми возможными комбинациями клавиатуры от 6 до 20 символов, на каждой новой строчке новая комбинация?
|
Цитата:
Цитата morgan1991
можно ли средствами автоита сгенереровать .тхт документ с всеми возможными комбинациями клавиатуры от 6 до 20 символов »
|
Можно. Но как понимать «возможными комбинациями клавиатуры от 6 до 20 символов»? Можно пример подобной комбинации?
|
morgan1991 |
23-01-2009 23:35 1017444 |
Цитата:
Цитата Creat0R
Можно пример подобной комбинации? »
|
;ijd;gjj
;jnx;dgnh
jdjjdkgkkrtjh
kdjfngjj
лорир
жлдовар
54524енкнеан5
Обсалютно любые комбинации, на обоих языках.
|
Можно попробовать так.
Код:
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 |
Спасибо
|
Сорри, не удержался.
Это долго...
Для начала вот функция гинерирующая строку от 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
|
Вообщем задача не на скорую руку, вот пример используя функцию выше, у меня на 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
|
Цитата:
Цитата Creat0R
Сорри, не удержался.
Это долго... »
|
Я просто переделал выдранный кусок переборщика паролей (лет 5 назад писал на сях) и переписал на автоите. Самому катать мощный брутофорс сейчас практически нет смысла...
P. S. если на ночь оставить, то до 15-ти символов может добраться :)
|
Цитата:
Цитата 266903582
если на ночь оставить, то до 15-ти символов может добраться »
|
Не доберётся вроде, в примере ведь только 10 циклов :)
Вот тут остаётся важный вопрос, возможно ли запустить заданное число (в переменной) рекурсивных циклов, т.е один выполняется в другом? Тогда можно было бы сделать функцию, и дать возможность указать число символов для гинерации (или подбора, если делать для перебора паролей).
Примерно вот так (это в теле последнего цикла):
Код:
For $j = 1 To $iMax_Pass_Chars
$sChars &= $aAlpha_Chars[Eval("i" & $j)]
Next
Где $sChars это текущая сгинерированная строка...
|
Цитата:
Цитата Creat0R
Не доберётся вроде, в примере ведь только 10 циклов »
|
По тому, что мне лень было добавлять большее количество уровней, а из примера видно как расширить возможности и общий принцип работы ясен...
Цитата:
Цитата Creat0R
Вот тут остаётся важный вопрос, возможно ли запустить заданное число (в переменной) рекурсивных циклов »
|
Когда я последний раз думал об этом, то остановился на мысли о постоянно растущих объемах передаваемых и возвращаемых промежуточных параметров, что значительно снизит производительность перебора (+ ограничение глубины 5099 вызовами). По идее рекурсия будет малоэффективна, но на досуге можно подумать еще...
|
На данный момент финальная версия такова:
Код:
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
Единственный недостаток - если нужно перебирать разнорегистробуквенные слова, то работать придется с кодами символов, а не с символами, т.к. для автоита А=а...
|
morgan1991 |
29-01-2009 15:05 1023492 |
Спасибо всем! А как ещё изменить это:
Цитата:
Цитата 266903582
На данный момент финальная версия такова: »
|
Так чтобы генерировалось без русских букв?
|
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.
© OSzone.net 2001-