Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

АРХИВ ФОРУМА eXeL@B
https://exelab.ru/f/

   

Nitrogen action script рубит кто?


Nitrogen action script рубит кто?

сама проверка юзается так: decryptAndValidate(serial)

сам код:
// Action script...

// [Action in Frame 1]
function Crypto(front, game, base, factor)
{
this.front = front;
this.game = game;
this.base = base;
this.factor = factor;
} // End of the function
function reverse(str)
{
var newStr = "";
var i = 1;
while (i <= str.length)
{
newStr = newStr + str.substr(str.length - i, 1);
i++;
} // end while
return(newStr);
} // End of the function
function decryptAndValidate(toDecrypt)
{
var valid = false;
var enc = crypt.decrypt(toDecrypt, reverse(crypt.front) + crypt.front);
enc = enc.substr(crypt.game.length);
var num = Number(enc);
var mod = (num - crypt.base) % crypt.factor;
if (num > 1000000 && mod == 0)
{
valid = true;
} // end if
return(valid);
} // End of the function
Crypto.prototype.myescape = function (value)
{
if (value == "")
{
return("%00");
}
else
{
return(escape(value));
} // end if
};
Crypto.prototype.xor = function (aKey)
{
var retval = "";
var numberal;
var position = 0;
var i = 0;
while (i < this.source.length)
{
numberal = this.source[i].charCodeAt(0);
numberal = numberal ^ aKey.charCodeAt(position);
position = (position + 1) % aKey.length;
retval = retval.concat(String.fromCharCode(numberal));
i++;
} // end while
this.help = new Array();
var i = 0;
while (i < retval.length)
{
this.help[i] = retval.charAt(i);
i++;
} // end while
};
Crypto.prototype.encrypt = function (str, pass)
{
str = str.toString();
this.source = new Array();
var j = 0;
var i = 0;
while (i < str.length)
{
this.source[j] = str.charAt(i);
j++;
i++;
} // end while
this.xor(pass);
var result = "";
var i = 0;
while (i < this.help.length)
{
result = result.concat(this.myescape(this.help[i]));
i++;
} // end while
delete this["source"];
delete this["help"];
return(result);
};
Crypto.prototype.decrypt = function (str, pass)
{
this.source = new Array();
var j = 0;
var i = 0;
while (i < str.length)
{
if (str.charAt(i) == "%")
{
this.source[j] = str.charAt(i) + str.charAt(i + 1) + str.charAt(i + 2);
i = i + 2;
}
else
{
this.source[j] = str.charAt(i);
} // end if
this.source[j] = unescape(this.source[j]);
j++;
i++;
} // end while
this.xor(pass);
var result = "";
var i = 0;
while (i < this.help.length)
{
result = result.concat(this.help[i]);
i++;
} // end while
delete this["source"];
delete this["help"];
return(result);
};
crypt = new Crypto("bazylog", "eah", 1234567, 47);

RottingCorpse :: и в чем проблема.... выход резултата проверки сериала в

result = result.concat(this.help );
return(result);

Nitrogen :: RottingCorpse
«проблема» в том, что охото понять, как че крутится (ну не с-образное у меня мышление).. хотя в принципе понятно, но не до конца.. вообще цель - написать кг :)..

кстати ты не прав. проверка тут:

if (num › 1000000 && mod == 0)
{
valid = true;
} // end if
return(valid);

ладно был бы обычный FWS-файлик, а там CWS - он толи пакованый то ли хз.. вобщем запатчить не могу.. другую их игру запатчил без проблем

RottingCorpse :: Nitrogen пишет:
цитата:
кстати ты не прав. проверка тут:

if (num › 1000000 && mod == 0)
{
valid = true;
} // end if
return(valid);


Дык я про результат говорил :)

Кста, где ты такое чудо выкопал? :)

Nitrogen :: RottingCorpse
то что ты показываешь - вовращение результата _другой_ функции, а я показал именно то, что нужно.
игру ковыряю.. на eye.moof.ru пролетела ссылка с игрушкой airhockey.. вот ее скачал и ломаю :)..

Nitrogen :: up

неужели никто? это ж подобие C..

RideX :: Спецы по С молчат что-то :)

RideX ::
1.
function Crypto(front, game, base, factor)
{
this.front = front;
this.game = game;
this.base = base;
this.factor = factor;
} // End of the function
crypt = new Crypto("bazylog", "eah", 1234567, 47);

Это значит так:
const
front: String = 'bazylog';
game: String = 'eah';
base: integer = 1234567;
factor: integer = 47;

2.
function reverse(str)
{
var newStr = "";
var i = 1;
while (i <= str.length)
{
newStr = newStr + str.substr(str.length - i, 1);
i++;
} // end while
return(newStr);
} // End of the function

Это так:
function reverse(str: String): String;
var
newStr: String;
i: integer;
begin
newStr := '';
i := 0;
while i < Length(str) do begin
newStr := newStr + str[Length(str) - i];
inc(i);
end;
Result := newStr;
end;

3.
valid := False;

// crypt.decrypt(toDecrypt, reverse(crypt.front) + crypt.front);
//вот этот decrypt надо ещё, decrypt(serial, reverse(front) + front);

//enc = enc.substr(crypt.game.length);
enc := Copy(enc, Length(game), $FF);

//num = Number(enc);
num := StrToInt(enc);

//mod = (num - crypt.base) % crypt.factor;
//здесь % - просто модуль, но в Delphi mod работате только для целых чисел, для дробных можно заменить такой конструкцией:
_mod := (num - base) - int((num - base) / factor) * factor;

if (num < 1000000) and (_mod = 0) then
valid := True;

4. Надо ещё где-то найти функцию decrypt, в этом модуле её нет :(

DillerXX :: Тык, а как ты код-то получил? Чем?

Nitrogen :: RideX
вот же он (декрипт):

Crypto.prototype.decrypt = function (str, pass)
{
this.source = new Array();
var j = 0;
var i = 0;
while (i ‹ str.length)
{
if (str.charAt(i) == »%»)
{
this.source[j] = str.charAt(i) + str.charAt(i + 1) + str.charAt(i + 2);
i = i + 2;
}
else
{
this.source[j] = str.charAt(i);
} // end if
this.source[j] = unescape(this.source[j]);
j++;
i++;
} // end while

RideX :: Nitrogen
Да, я потом тоже увидел. В общем там придётся все функции переписывать, они все используются :( Ещё переписал decrypt и unescape. Для unescape аналога нет, она, в общем, преобразует URL-строку к нормальному виду («Hello,%20world!» = «Hello, world»).

function TForm1.decrypt(str, pass: String): String;
var
i: integer;
begin
i := 1; //var i = 0;

while i < Length(str) do begin // while (i < str.length)
if str[i] = '%' then begin //if (str.charAt(i) == "%")
//this.source[j] = str.charAt(i) + str.charAt(i + 1) + str.charAt(i + 2);
source := source + Copy(str, i, 3);
i := i + 2; //i = i + 2;
end else begin
source := source + Copy(str, i, 1);//this.source[j] = str.charAt(i);
end;//if

inc(i); //i++;
end; //while

//source[j] := unescape(source[j]);
source := unescape(source); //вынес из цикла, чтобы всю строку сразу обработать

// _xor(pass);
//...

Result := '';
i := 1; //var i = 0;
while i < Length(help) do begin //while (i < this.help.length)
result := result + help[i]; //result = result.concat(this.help[i]);
inc(i); //i++;
end; // while

end;

//********************************************

function TForm1.unescape(InputStr: String): String;
var
OutStr: String;
TmpStr: String;
i: integer;
begin
i := 1;
while i <= Length(InputStr) do begin
if InputStr[i] <> '%' then begin
OutStr := OutStr + InputStr[i];
inc(i);
end else begin
TmpStr := Copy(InputStr, i, 3);
TmpStr[1] := '$';
OutStr := OutStr + Chr(StrToInt(TmpStr));
inc(i,3);
end; //if
end; //for

Result := OutStr;
end;

//**********************************************

Ещё нужно xor и help сделать, обе в decrypt’е используются, ну может ещё чего...

P.S. скачал себе словарь Action Script, вот так и сижу с ним :)

RideX :: Вроде так, проверь:

//на форме два Edit', первый для ввода пароля (вроде должен состоять из
//заглавных букв) и кнопка.
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function reverse(str: String): String;
function decryptAndValidate(toDecrypt: String): Boolean;
function decrypt(str, pass: String): String;
function unescape(InputStr: String): String;
procedure _xor(aKey: String);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

const
front: String = 'bazylog';
game: String = 'eah';
base: integer = 1234567;
factor: integer = 47;

var
help: String = '';
source: String = '';

function TForm1.reverse(str: String): String;
var
newStr: String;
i: integer;
begin
newStr := '';
i := 0;
while i < Length(str) do begin
newStr := newStr + str[Length(str) - i];
inc(i);
end;
Result := newStr;
end;

function TForm1.decryptAndValidate(toDecrypt: String): Boolean;
var
enc: String;
num: integer;
_mod: real;
valid: boolean;
begin
valid := False;
num := 0;

// crypt.decrypt(toDecrypt, reverse(crypt.front) + crypt.front);
enc := decrypt(toDecrypt, reverse(front) + front);

//enc = enc.substr(crypt.game.length);
enc := Copy(enc, Length(game) + 1, $FF);

//num = Number(enc);
try //должно быть число, иначе не продолжаем
num := StrToInt(enc);
except end;

//_mod = (num - crypt.base) % crypt.factor;
_mod := (num - base) - int((num - base) / factor) * factor;
if (num < 1000000) and (_mod = 0) then
valid := True;
Result := valid;
end;

function TForm1.decrypt(str, pass: String): String;
var
i: integer;
begin
i := 1; //var i = 0;

while i <= Length(str) do begin // while (i < str.length)
if str[i] = '%' then begin //if (str.charAt(i) == "%")
//this.source[j] = str.charAt(i) + str.charAt(i + 1) + str.charAt(i + 2);
source := source + Copy(str, i, 3);
i := i + 2; //i = i + 2;
end else begin
source := source + Copy(str, i, 1);//this.source[j] = str.charAt(i);
end;//if

inc(i); //i++;
end; //while

source := unescape(source);

_xor(pass);

Result := help;
end;

procedure TForm1._xor(aKey: String);
var
retval: String;
numberal: integer;
position: integer;
i: integer;
begin
position := 1;
i := 1;

while i <= Length(source) do begin
numberal := Ord(source[i]);
numberal := numberal xor Ord(aKey[(position)]);
//position = (position + 1) % aKey.length;
position := (position + 1); //просто читаем символы по порядку
retval := retval + Chr(numberal);
inc(i);
end; //while

help := retval;
end;

function TForm1.unescape(InputStr: String): String;
var
OutStr: String;
TmpStr: String;
i: integer;
begin
i := 1;
while i <= Length(InputStr) do begin
if InputStr[i] <> '%' then begin
OutStr := OutStr + InputStr[i];
inc(i);
end else begin
TmpStr := Copy(InputStr, i, 3);
TmpStr[1] := '$';
OutStr := OutStr + Chr(StrToInt(TmpStr));
inc(i,3);
end; //if
end; //for

Result := OutStr;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if decryptAndValidate(Edit1.Text) = True then
Edit2.Text := 'Password is correct :)'
else
Edit2.Text := 'Invalid password :(';
end;

end.

бара :: что именно ломаешь хоть - CD_key что-ли ?

RideX :: Nitrogen
Здесь у меня опечатка:
if (num ‹ 1000000) and (_mod = 0) then

num должен быть БОЛЬШЕ, т.е.:
if (num › 1000000) and (_mod = 0) then

Ещё добавь в функцию TForm1.decrypt(str, pass: String): String;
одну строчку: source := ’’; после этой:
i := 1; //var i = 0;

Остальное вроде правильно. Если пасс аналогичен онлайн версии, то серийник должен состоять от $30 до $5A символов, хотя хз...

бара
Серийник на игру :)

Nitrogen :: RideX
10x теперь осталось написать кейген, ну или хотя бы подобрать один номер - мне был лишь поиграться ;).. а то 10 минут и не все игроки - плохо :)..

т.е ты думаешь что серийник из множества [0..9]&[A..Z]?

Nitrogen :: RideX
мегагритсы тебе! :)

кейген оказываетсяза минуту пишется :)

procedure TForm1.Button2Click(Sender: TObject);
var
i,x,num:integer;
cc,str2,str3:string;
begin
randomize;
x:=random(180000);
num:=x*47+1234567;
cc:=’yzabbazylog’;
str3:=inttostr(num);
str2:=’TSR’;
for i:=1 to length(str3) do
str2:=str2+ chr(ord(str3 ) xor ord (cc ));
edit2.Text:=str2;

сернум: TSRKJRQRTJ

толи на асме переписать, толи спать пойти :)

Nitrogen :: ser0 db «TSR»
ser1 db «1234567»,0,0,0,0

cc db «yzabbazylog»,0
_format db »%lu»,0

@e:
invoke random,180000
imul eax,eax,47
add eax,1234567
cmp eax,1000000
jl @e
invoke wsprintf,addr ser1,addr _format,eax
lea esi,ser1
lea edi,cc
@l:
mov al,byte ptr[esi]
mov bl,byte ptr[edi]
test al,al
jz @s
xor al,bl
cmp al,’A’
jl @e
cmp al,’Z’
jg @e
mov byte ptr[esi],al
inc esi
inc edi
jmp short @l
@s:

invoke SetDlgItemTextA, _hwnd, IDC_EDIT4, addr ser0

Nitrogen :: mov al,byte ptr[esi]
mov bl,byte ptr[edi]
ниче что я source с destination путаю ;).. всегда я так :)

RideX :: Nitrogen
Всё получилось! Отлично сработали :)






   
Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS