Сейчас на форуме: rtsgreg1989, zds, _MBK_ (+5 невидимых) |
![]() |
eXeL@B —› Основной форум —› Пытаюсь написать бутфорс, для нахождения всех валидный серийников. |
Посл.ответ | Сообщение |
|
Создано: 22 августа 2007 15:29 · Личное сообщение · #1 Здравствуйте, имею кусой ключеделки, на Делфях. Процедура производит вычисления над введенным серийником и над именем, потом эти значения сравниваются, если они равны, серийник верный. Пытаюсь написать бутфорс, для нахождения всех валидный серийников. После прохождения цикла FOR на третий раз программа падает. Помогите разобраться почему? И как выйти из цикла FOR получив правильный серийник, тоесть как его сохранить Memo, например? Процедура: procedure TForm1.Button3Click(Sender: TObject); label L009,L016,L026,l045,L052,L089; var Name : string; Serial : string; i : longint; begin For i:= 1000000 to 9999999 do // серийник должен состаять мин. из 7 чисел begin Serial := IntToStr(i); Name := 'Rip'; //Serial :='1000030'; //ближайший реальный серийник на имя Rip asm pushad MOV EBX,DWORD PTR SS:[Serial] MOV ECX,DWORD PTR SS:[Name] XOR EAX,EAX L009: MOVSX EDX,BYTE PTR DS:[EBX+EAX] ADD EDX,-$30 MOV DWORD PTR SS:[EBP+EAX*4-$1C],EDX CMP DWORD PTR SS:[EBP+EAX*4-$1C],$0 CMP DWORD PTR SS:[EBP+EAX*4-$1C],$9 L026: INC EAX CMP EAX,$7 JL L009 IMUL EAX,DWORD PTR SS:[EBP-$C],$3E8 IMUL EDX,DWORD PTR SS:[EBP-$14],$64 ADD EAX,EDX MOV EDX,DWORD PTR SS:[EBP-$4] ADD EDX,EDX LEA EDX,DWORD PTR DS:[EDX+EDX*4] ADD EAX,EDX ADD EAX,DWORD PTR SS:[EBP-$1C] IMUL ESI,EAX,$0D MOV EAX,ESI MOV ESI,$0C5 CDQ IDIV ESI MOV ESI,EDX XOR EDI,EDI XOR EAX,EAX L045: CMP BYTE PTR DS:[ECX+EAX],0 JE L052 MOVSX EDX,BYTE PTR DS:[ECX+EAX] ADD EDI,EDX INC EAX CMP EAX,$50 JL L045 L052: MOV EAX,ESI PUSH ECX MOV ECX,$0A CDQ IDIV ECX POP ECX ADD EAX,EDI MOV EDI,$64 CDQ IDIV EDI MOV EDI,EDX MOV EAX,ESI MOV ESI,$0A CDQ IDIV ESI MOV EAX,EDI ADD EAX,EAX LEA EAX,DWORD PTR DS:[EAX+EAX*4] ADD EDX,EAX MOV ESI,EDX IMUL EAX,DWORD PTR SS:[EBP-$10],$64 MOV EDX,DWORD PTR SS:[EBP-$18] ADD EDX,EDX LEA EDX,DWORD PTR DS:[EDX+EDX*4] ADD EAX,EDX ADD EAX,DWORD PTR SS:[EBP-$8] CMP EAX,ESI //сравнение значений popad end end; end; ![]() |
|
Создано: 22 августа 2007 15:40 · Личное сообщение · #2 |
|
Создано: 22 августа 2007 15:50 · Поправил: Hellspawn · Личное сообщение · #3 |
|
Создано: 22 августа 2007 16:30 · Личное сообщение · #4 Hellspawn пишет: ну вообще говоря так рипать нельзя... Согласен. Похоже, что брут неправильно отрипан. ![]() AVE Попробуй напиши в Ольке, передав управление на свой брут где-нибудь в свободном месте кода. С первого раза не получится, но прога вывалится с сообщением об ошибке. Затем надо будет проанализировать используемые переменные в процедуре генерации ключа и т. д. Все зависит от конкретной проги в итоге... Да и вообще, дописав код брута непосредственно в саму программу, можно будет гораздо быстрее локализовать источник ошибки ИМХО. ----- Программист SkyNet ![]() |
|
Создано: 22 августа 2007 19:18 · Личное сообщение · #5 2overwriter мне так хочется. 2all Все здесь правильно отрипано. В значениях EBP-8.... Хранятся отдельные цифры введенного серийника. Серийник раскидывается в первом цикле этого кода после ксора. Я поэтому коду реализовал бутфорс на делфях, на перебор всех вариантов уходит гдето 19 секунд. С таким кодом думаю быстрее будет. Уже спортивный интерес просто..... Запустите эту процдуру в проекте, и подскажите что за ошибка ![]() |
|
Создано: 22 августа 2007 19:21 · Личное сообщение · #6 |
|
Создано: 22 августа 2007 20:44 · Личное сообщение · #7 |
|
Создано: 23 августа 2007 01:41 · Поправил: Chingachguk · Личное сообщение · #8 > за 49 секунд Имхо, тормозит из-за: Serial := IntToStr(i); Ты перебираешь i, потом преобразуешь в строку, затем уже из строки делаешь массив: L009: MOVSX EDX,BYTE PTR DS:[EBX+EAX] ADD EDX,-$30 MOV DWORD PTR SS:[EBP+EAX*4-$1C],EDX ; CMP DWORD PTR SS:[EBP+EAX*4-$1C],$0 ; CMP DWORD PTR SS:[EBP+EAX*4-$1C],$9 L026: INC EAX CMP EAX,$7 JL L009 Сделай перебор массива - те Serial[7] должен пробегать значения: Serial[7]={0,0,0,0,0,0,0} Serial[7]={1,0,0,0,0,0,0} Serial[7]={2,0,0,0,0,0,0} ... Serial[7]={0,1,0,0,0,0,0} Те вместо старого внешнего цикла по i... ----- The one derivative you manage is the one I abhore (c) Slipknot ![]() |
|
Создано: 23 августа 2007 11:36 · Личное сообщение · #9 |
|
Создано: 23 августа 2007 13:36 · Личное сообщение · #10 |
|
Создано: 23 августа 2007 18:12 · Личное сообщение · #11 Chingachguk Ну это канечно тоже интересует, но больше меня интерусует почему первый код не работает, тоесть он работает, но ошибка возникает уже в процессе, когда цикл уже прошел несколько раз. Когда сделал Serial := IntToStr(i); Name := Edit1.Text; ebp4:=StrToInt(Serial[7]); ebp8:=StrToInt(Serial[6]); ebpC:=StrToInt(Serial[5]); ebp10:=StrToInt(Serial[4]); ebp14:=StrToInt(Serial[3]); ebp18:=StrToInt(Serial[2]); ebp1C:=StrToInt(Serial[1]); все работает ![]() ![]() |
|
Создано: 23 августа 2007 18:51 · Личное сообщение · #12 Да ты не мучайсо с входным куском на асме - перепиши (начало) на Делфи, see: For i:= 1000000 to 9999999 do // серийник должен состаять мин. из 7 чисел begin Serial := IntToStr(i); asm ; DWORD tmpSerial[7] equ [EBP-$1C] // from [ebp-1Ch] to [ebp-04h] ; 0Ch,14h,04h,1Ch, pushad MOV EBX,DWORD PTR SS:[Serial] MOV ECX,DWORD PTR SS:[Name] XOR EAX,EAX L009: MOVSX EDX,BYTE PTR DS:[EBX+EAX] ADD EDX,-$30 MOV DWORD PTR SS:[EBP+EAX*4-$1C],EDX CMP DWORD PTR SS:[EBP+EAX*4-$1C],$0 CMP DWORD PTR SS:[EBP+EAX*4-$1C],$9 L026: INC EAX CMP EAX,$7 JL L009 Это начало твоего кода. Что тут делаетсо? // Сначала перебирается переменная i (почему от 1000000 кста?) For i:= 1000000 to 9999999 do // серийник должен состаять мин. из 7 чисел begin // Затем локальная переменная Serial заполняется изображением (строкой) числа... // ааа, я понял почему у тебя i от 1000000 ![]() Serial := IntToStr(i); // Далее (уже на асме) эта строка (Serial) преобразуеццо в массив, пусть его назовем tmpSerial[7]: pushad MOV EBX,DWORD PTR SS:[Serial] MOV ECX,DWORD PTR SS:[Name] XOR EAX,EAX L009: MOVSX EDX,BYTE PTR DS:[EBX+EAX] ADD EDX,-$30 MOV DWORD PTR SS:[EBP+EAX*4-$1C],EDX L026: INC EAX CMP EAX,$7 JL L009 Перепишем это на Делфи: var Serial:string; tmpSerial:array [1..7] of longint; j: integer; ... begin For i:= 1000000 to 9999999 do // серийник должен состаять мин. из 7 чисел begin Serial:= IntToStr(i); for j:=1 to 7 do tmpSerial[j]:=Serial[j]-'0'; // Если только с индексами не напутал // Далее у тебя уже идет работа с элементами этого массива: // Изначально массив занимал адреса: // from [ebp-1Ch] to [ebp-04h] - что соответствует tmpSerial[1]...tmpSerial[7] // Поэтому: // IMUL EAX,DWORD PTR SS:[EBP-$C],$3E8 ; x1000 // Переписываем как: imul eax,DWORD PTR tmpSerial[+10h],1000 // =tmpSerial[4] // И далее: // IMUL EDX,DWORD PTR SS:[EBP-$14],$64 ; x100 imul edx,DWORD PTR tmpSerial[+8h],100 ; =tmpSerial[3] ADD EAX,EDX // Те все считаем от смещения -1Ch, например далее: // MOV EDX,DWORD PTR SS:[EBP-$4] mov edx,dword ptr tmpSerial[+18h] ; =tmpSerial[7] ADD EDX,EDX LEA EDX,DWORD PTR DS:[EDX+EDX*4] ; x5 Теперь по поводу выхода из цикла, просто объяви переменную типа boolean/int, и: ADD EAX,EDX // Опять-таки это ссылка на tmpSerial, надо исправить: ADD EAX,DWORD PTR SS:[EBP-$8] mov Flag,false CMP EAX,ESI //сравнение значений jnz @@NotValid mov Flag,true @@NotValid: popad Flag объяви как-нить типа Flag: boolean; Итого ты - когда это заработает - увидишь что на самом деле можно перебирать СРАЗУ tmpSerial - а не мучаццо с преобразованиями i->строка->tmpSerial. ----- The one derivative you manage is the one I abhore (c) Slipknot ![]() |
|
Создано: 24 августа 2007 20:08 · Личное сообщение · #13 |
|
Создано: 24 августа 2007 20:48 · Поправил: Archer · Личное сообщение · #14 |
|
Создано: 24 августа 2007 22:46 · Поправил: Chingachguk · Личное сообщение · #15 Не софсем (как я полагаю). Сначала ты преобразуешь i в строку, а затем из строки делаешь tmpSerial. Поскольку в строке могут быть только цифры ("0".."9"), то X быть не может... Вот примерно что делаетсо: var Serial:string; tmpSerial:array [1..7] of longint; j: integer; tmpSum, tmpSumName, tmpESI: longint; ... begin For i:= 1000000 to 9999999 do // серийник должен состаять мин. из 7 чисел begin Serial:= IntToStr(i); for j:=1 to 7 do tmpSerial[j]:=Serial[j]-'0'; // Если только с индексами не напутал // Далее у тебя уже идет работа с элементами этого массива: // Изначально массив занимал адреса: // from [ebp-1Ch] to [ebp-04h] - что соответствует tmpSerial[1]...tmpSerial[7] // Поэтому: tmpSum:=tmpSerial[5]*1000; // =tmpSerial[5] inc(tmpSum,tmpSerial[3]*100); // =tmpSerial[3] inc(tmpSum,tmpSerial[7]*10); //=tmpSerial[7] inc(tmpSum,tmpSerial[1]); // Здесь нужно взять остаток от деления на 197, не помню как это будет... mod? tmpSum=(tmpSum*13) mod 197; // <-esi tmpESI:=tmpSum; // Далее считаем CRC от Name, max длина 80(?) tmpSumName:=0; // EDI for j:=1 to lenght(Name) do inc(tmpSumName,Name[j]); tmpSum:=(tmpSum/10)+tmpSumName; // EAX tmpSum:=tmpSum mod 100; // EDI tmpESI=tmpESI mod 10; // EDX tmpSum=tmpSum*10; // EAX inc(tmpSum,tmpESI); // ESI Flag:=false; if tmpSum = ((tmpSerial[4]*100)+tmpSerial[2]+tmpSerial[6]) then Flag:=true; end; // end перебора i Это общий вид алгоритма, разумеется я не проверял перевод из ASM на PAS. Видно, что тормозок - IntToStr, перебирать можно было сразу tmpSerial. ----- The one derivative you manage is the one I abhore (c) Slipknot ![]() |
|
Создано: 25 августа 2007 10:36 · Личное сообщение · #16 |
|
Создано: 25 августа 2007 11:01 · Личное сообщение · #17 |
|
Создано: 25 августа 2007 12:59 · Личное сообщение · #18 |
|
Создано: 27 августа 2007 11:43 · Поправил: PE_Kill · Личное сообщение · #19 |
|
Создано: 28 августа 2007 19:52 · Личное сообщение · #20 |
|
Создано: 28 августа 2007 20:23 · Поправил: Hellspawn · Личное сообщение · #21 AVE пишет: Хоть как обозначай, все равно не работает rtfm = Serial:string; tmpSerial:array [1..7] of longint; кодить ещё не умеем, а лезем в кейгены... for j:=1 to 7 do tmpSerial[j]:=ord(Serial[j])-ord('0'); так откомпилиться, но правильно ли будет работать кейген это - хз... ----- [nice coder and reverser] ![]() |
|
Создано: 29 августа 2007 10:18 · Личное сообщение · #22 |
![]() |
eXeL@B —› Основной форум —› Пытаюсь написать бутфорс, для нахождения всех валидный серийников. |
Эта тема закрыта. Ответы больше не принимаются. |