Сейчас на форуме: rtsgreg1989, zds, _MBK_ (+5 невидимых)

 eXeL@B —› Основной форум —› Пытаюсь написать бутфорс, для нахождения всех валидный серийников.
Посл.ответ Сообщение


Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 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;





Ранг: 155.4 (ветеран)
Активность: 0.140
Статус: Участник
Робо-Алкаш

Создано: 22 августа 2007 15:40
· Личное сообщение · #2

//Оффтоп
AVE пишет:
Пытаюсь написать бутфорс, для нахождения всех валидный серийников.

Зачем?

-----
Researcher





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 22 августа 2007 15:50 · Поправил: Hellspawn
· Личное сообщение · #3

ну вообще говоря так рипать нельзя...
[EBP-xx] - насколько я помню это локальные переменные в процедуре, дык у тебя там что????

поробуй ввсети новые переменные EBP_8,EBP_10 ... заполнить их начальными значениями
и смотреть))) я ваще хз как это у тебя работает...

-----
[nice coder and reverser]





Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 22 августа 2007 16:30
· Личное сообщение · #4

Hellspawn пишет:
ну вообще говоря так рипать нельзя...

Согласен. Похоже, что брут неправильно отрипан.
AVE
Попробуй напиши в Ольке, передав управление на свой брут где-нибудь в свободном месте кода. С первого раза не получится, но прога вывалится с сообщением об ошибке. Затем надо будет проанализировать используемые переменные в процедуре генерации ключа и т. д. Все зависит от конкретной проги в итоге...
Да и вообще, дописав код брута непосредственно в саму программу, можно будет гораздо быстрее локализовать источник ошибки ИМХО.

-----
Программист SkyNet





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 22 августа 2007 19:18
· Личное сообщение · #5

2overwriter мне так хочется.

2all Все здесь правильно отрипано. В значениях EBP-8.... Хранятся отдельные цифры введенного серийника. Серийник раскидывается в первом цикле этого кода после ксора.

Я поэтому коду реализовал бутфорс на делфях, на перебор всех вариантов уходит гдето 19 секунд.
С таким кодом думаю быстрее будет.

Уже спортивный интерес просто.....

Запустите эту процдуру в проекте, и подскажите что за ошибка




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 22 августа 2007 19:21
· Личное сообщение · #6

ты не понял... ну а в чём проблема если отрипано правильно???
в дельфе есть встроенный отладчик, в зубы и вперёд с песней...

-----
[nice coder and reverser]





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 22 августа 2007 20:44
· Личное сообщение · #7

Ну вообщем завел новые переменные EBP_8,EBP_10 ...
Отладил, работает.
Теперь находит все серийники за 49 секунд

2Hellspawn в дельфе есть встроенный отладчик, в зубы и вперёд с песней...

ну дык я понять не могу все верно, а чо делфе то не нравиться




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 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





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 23 августа 2007 11:36
· Личное сообщение · #9

Chingachguk ничо не понялл....




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 23 августа 2007 13:36
· Личное сообщение · #10

Ну я подумал что тебя интересует почему работает медленно... Нет?

-----
The one derivative you manage is the one I abhore (c) Slipknot





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 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]);


все работает




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 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 )) - чтобы строка была длиной 7 ;)
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





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 24 августа 2007 20:08
· Личное сообщение · #13

2Chingachguk
Что эта за строка:

for j:=1 to 7 do tmpSerial[j]:=Serial[j]-'0'




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 24 августа 2007 20:48 · Поправил: Archer
· Личное сообщение · #14

AVE
Переводит цифру из чара в байт, полагаю. Было X, значит serial[j]=X. Под Х подразумеваеццо любая цифра.




Ранг: 113.0 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 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





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 25 августа 2007 10:36
· Личное сообщение · #16

Делфя жалуется на эту строку
for j:=1 to 7 do tmpSerial[j]:=Serial[j]-'0'

говорит:
E2015 Operator not applicable to this operand type



Ранг: 72.4 (постоянный), 33thx
Активность: 0.050.03
Статус: Участник

Создано: 25 августа 2007 11:01
· Личное сообщение · #17

-'0'?



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 25 августа 2007 12:59
· Личное сообщение · #18

ValdikSS, -30h

-----
Shalom ebanats!





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 27 августа 2007 11:43 · Поправил: PE_Kill
· Личное сообщение · #19

SLV в делфе хекс символом $ обозначается а не h

-----
Yann Tiersen best and do not fuck





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 28 августа 2007 19:52
· Личное сообщение · #20

в делфе хекс символом $ обозначается а не h

Хоть как обозначай, все равно не работает




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 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]





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 29 августа 2007 10:18
· Личное сообщение · #22

Вообщем разобрался.

Если кому интесно, находит все за 13 секунд.


 eXeL@B —› Основной форум —› Пытаюсь написать бутфорс, для нахождения всех валидный серийников.
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати