У меня еще не сформировались четко вопросы, но все-таки попробую изложить их.
Да, все замечательно, у нас есть дамп и тулза для проверки алгоритма шифрации, т.е. остается дело за "малым" - угадать его.
Мне кажется что такой подход совсем не гарантирует конечный результат и может поглотить бесконечное кол-во времени. Отсюда вопросы.
1. xkor - как ты догадался, что надо перехватывать API вызов connect? Как можно догадаться какими функциями посылаются и принимаются пакеты? Это send и recv или другие?
2. Что посоветуете почитать про отладку процессов и дизассемблирование? С чего начать?
Т.е. мне не нравится "угадывать" я хочу "знать" алгоритм. Для этого придется разбираться с хакерством. На ассемблере я программировал но чуть-чуть. Посоветуйте куда копать?
ммм екзешник и длл-ки в л2 упакованы Themida одной из последих версий, а это, как говорят, один из лучших крипторов на данный момент (конечно это не значит что абсолютно непреодолимый). И если все же у тебя получается снимать РАБОЧИЙ (aka Осмысленный, а не команды для VM) дамп с этих файлов , не мог бы ты выложить тутор по дампированию?
ммм екзешник и длл-ки в л2 упакованы Themida ... если у тебя получается снимать РАБОЧИЙ (aka Осмысленный, а не команды для VM)
Я начал копать эту тему только сегодня. Бегло поглядев на исходники inject.dll я вроде как понял, что эта либа находит в памяти обращение к API шной ф-ции connect и переставляет его на вызов себя. Я конечно могу ошибаться. Так что мне кажется, что в момент вызова send или recv код отвечающий за "шифрование" уже загружен в память и должен быть "виден" в каком-нибудь отладчике. Повторю еще раз это мои гипотезы. Видимо ты более сведущ в этих вопросах. С удовольствие выслушаю твои соображения.
P.S. Админы ведь как-то меняют стандартную шифрацию? Не думаю, чтобы у них был исходный код клиента.
Последний раз редактировалось MHz, 24.06.2008 в 23:03.
Причина: еще подумалось
P.S. Админы ведь как-то меняют стандартную шифрацию? Не думаю, чтобы у них был исходный код клиента.
Обычно покупают готовый пакет защиты и все, т.е. сами практически ничего неделают. По поводу "более сведущ в этих вопросах" повторюсь: я работаю слесарем, к программированию не имею абсолютно никакого отношения. Просто попытки уже были
Ну если тебе ето поможет.. то раньше там было так:
Код:
library newxor;
uses
windows,
Coding in 'Coding.pas';
type
TXorCoding = class(TCodingClass)
private
keyLen: Byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Boolean = False);override;
procedure DecryptGP(var Data; const Size: Word);override;
procedure EncryptGP(var Data; const Size: Word);override;
end;
TXorCodingOut = class(TCodingClass)
private
keyLen: Byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Boolean = False);override;
procedure DecryptGP(var Data; const Size: Word);override;
procedure EncryptGP(var Data; const Size: Word);override;
end;
function CreateCoding(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCoding.Create;
except
Result:=-1;
Value^:=nil;
end;
end;
function CreateCodingOut(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCodingOut.Create;
except
Result:=-1;
Value^:=nil;
end;
end;
exports CreateCoding, CreateCodingOut;
{ TXorCoding }
constructor TXorCoding.Create();
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
End;
procedure TXorCoding.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
for k:=size-1 downto 1 do
pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
Inc(PLongWord(@GKeyR[0])^,size);
PLongWord(@GKeyR[4])^:=PLongWord(@GKeyR[4])^ xor PLongWord(@GKeyR[0])^;
end;
procedure TXorCoding.EncryptGP(var Data; const Size: Word);
var
i:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
if size<>0 then pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do
pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];
Inc(PLongWord(@GKeyS[keyLen-7])^,size);
PLongWord(@GKeyS[4])^:=PLongWord(@GKeyS[4])^ xor PLongWord(@GKeyS[0])^;
end;
procedure TXorCoding.InitKey(const XorKey; Interlude: Boolean = False);
var key2:array[0..15] of Byte;
begin
keyLen:=7;
Move(XorKey,key2,4);
key2[0]:=key2[0]xor $82;
key2[1]:=key2[1]xor $93;
key2[4]:=key2[2]xor $1a;
key2[5]:=key2[3]xor $41;
key2[2]:=0;
key2[3]:=0;
key2[6]:=0;
key2[7]:=0;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;
{ TXorCodingOut }
constructor TXorCodingOut.Create;
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
end;
procedure TXorCodingOut.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
b: Integer;
begin
for k:=size-1 downto 1 do
pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
b:=0;
for k:=1 to size-1 do b:=b+pck[k];
if size>1 then begin
GKeyR[0]:=GKeyR[0] xor b;
if (b<=$FF) then GKeyR[1]:=GKeyR[1] xor (b+size)
else GKeyR[1]:=GKeyR[1] xor (b shr 8);
PLongWord(@GKeyR[4])^:=PLongWord(@GKeyR[4])^ xor PLongWord(@GKeyR[0])^;
if (b<=$ff) and ((b+size)>$FF) then GKeyR[2]:=GKeyR[2] xor 1;
if(b<=$ff)then GKeyR[5]:=GKeyR[5] xor (size + b);
end;
end;
procedure TXorCodingOut.EncryptGP(var Data; const Size: Word);
var
i:integer;
pck:array[0..$4FFF] of Byte absolute Data;
b: Integer;
begin
b:=0;
for i:=1 to size-1 do b:=b+pck[i];
if size<>0 then pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do
pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];
if size>1 then begin
GKeyS[0]:=GKeyS[0] xor b;
if(b<=$FF)then GKeyS[1]:=GKeyS[1] xor (b+size)
else GKeyS[1]:=GKeyS[1] xor (b shr 8);
PLongWord(@GKeyS[4])^:=PLongWord(@GKeyS[4])^ xor PLongWord(@GKeyS[0])^;
if(b<=$ff)and(b+size>$FF)then GKeyS[2]:=GKeyS[2] xor 1;
if(b<=$ff)then GKeyS[5]:=GKeyS[5] xor (size + b);
end;
end;
procedure TXorCodingOut.InitKey(const XorKey; Interlude: Boolean);
var key2:array[0..15] of Byte;
begin
keyLen:=7;
Move(XorKey,key2,4);
key2[0]:=key2[0]xor $82;
key2[1]:=key2[1]xor $93;
key2[4]:=key2[2]xor $1a;
key2[5]:=key2[3]xor $41;
key2[2]:=0;
key2[3]:=0;
key2[6]:=0;
key2[7]:=0;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;
begin
end.
они оставили входящий траф без изменения.. способ вычисления начального ключа- тоже не тронули.. изменился тока алгоритм шифрации исходящего трафика..
сломать его- для меня непосильная задача покачто... буду рад услышать что у тебя что то получилось..
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
Я не один, с нами nezabudkin Уберите название серва)
из наблюдений за исходящим трафиком обнаружил лиш то что лог однобайтового пакета константа- значит ключ не меняется при однобайтовом исходящем пакете.. больше мыслей нету-(((
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
это в чат "1" много раз подряд (40). смущает [0]=D7=[16]=[32]=[48]....пока отбросим в сторону [0]. Имею мнение: 1)мб ключ не 8 байт, а больше? 2) скорее всего ключ (8 байт) при длине рск>8 изменяется и происходит чтото типа "ключ"="ключ"+"модифиключ"...вариаций до кучи( Размер такого пакета = 9 + (кол-во 1)*2, последние 7 байт 0, при условии что пишем в общаг
Равенство поледнего байта - первому - совпадение
Последний раз редактировалось Breadfan, 28.06.2008 в 19:33.
это в чат "1" много раз подряд (40). смущает [0]=D7=[16]=[32]=[48]....пока отбросим в сторону [0]. Имею мнение: 1)мб ключ не 8 байт, а больше? 2) скорее всего ключ (8 байт) при длине рск>8 изменяется и происходит чтото типа "ключ"="ключ"+"модифиключ"...вариаций до кучи( Размер такого пакета = 9 + (кол-во 1)*2, последние 7 байт 0, при условии что пишем в общаг
головой думать надо.. и бональнве вопромы ты сам себя подтвердить можеш.. ключ 8 байтов* почему? да потомучто 3-й пакет и 4-й пакет коректно расшифровываются...
(с использованием моей длл исходники для которой я дал..)
8 байтов полюбасу... но вот как ключ меняется? алшоритм нужен
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
головой думать надо.. и бональнве вопромы ты сам себя подтвердить можеш.. ключ 8 байтов* почему? да потомучто 3-й пакет и 4-й пакет коректно расшифровываются...
(с использованием моей длл исходники для которой я дал..)
8 байтов полюбасу... но вот как ключ меняется? алшоритм нужен
Голова уже просто неработает абсолютно, щас все подряд перебираю....Админы - отсыпьте блин.....
ИТАК! СОЗДАН ПОДРАЗДЕЛ!
в етом разделе создаем темы в названии которых будет указываться СЕРВЕР и сайт....
будем людей объединять по интересам....
для общих вопросов создан и приклеен етот топик
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами