PDA

Просмотр полной версии : Решение критов перса


MorfeyTH
01.11.2009, 00:32
Тему никто не создавал а может быть очень полезно))

Решение проблем с критом персонажей БЕСЛАПТНО


Итак все знают что есть проблема при частом нажатии кнопки применить и что есть решение. Для меня было достаточно сложно его усвоить,так как нигде не было подробных инструкций,что делать. Я постараюсь их сделать.
Итак во первых качаем программу WP тут _[Ссылки могут видеть только зарегистрированные и активированные пользователи]
2.Запускаем ее.
3. Заходим во вкладку Multi Injector
там снизу слева жмем кнопочку MI панель.
Создаем в MI панели l2.bin так как на картинке
_[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Жмем галочку возле новой "записи"(у меня она под номером 6)
Включаем Multi injector(Щелкнуть по солнышку) чтоб появилась надпись On
С этой частью окончено.
4. Переходим во вкладку ProxyPC
Включаем первый прокси (опять же щелкаем по солнышку)

Входим в PPC панель.
Жмем кнопку добавить
Создаем запись своего сервера
_[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Это для атебальта,для других серверов ТОЛЬКО другой ИП,остальное так-же.

Далее для каждой записи можно создавать скрипты(на скрине у меня они называются крит 3 и крит 2)

Скрипты можно сохранять через script tester.

Текст скрипта крит3:



// грязный хак для декодирования GS->C руофа
// 'demo_la2-endecGS-6.fsc' Пример ручного декодирования LA2 GS пакетов. Стандартный алгоритм.
// внутреннее автоопределение и автодекодирование НЕ ИСПОЛЬЗУЕТСЯ, оно отключается (в скрипте).
//
// определение трафика и де/кодирование GS полностью на скрипте.
//
// используются события-функции 'OnDeCode' и 'OnEnCode'
//
// (для работы скрипта необходим WP657F или выше)
// в примере используется ручная де/кодировка GS пакетов C4/C5/Interlude стандартным алгоритмом.
// скрипт FS
//
//

var // будем использовать локальные ключи, а не внутренние (хотя можно любые, без разницы)
Kci : string;// - для пакетов пришедших с клиента.
Kco : string;// - для пакетов уходящих на клиент.
Ksi : string;// - для пакетов пришедших с сервера.
Kso : string;// - для пакетов уходящих на сервер.
s,s1 : string;
scode : boolean;
le : integer;
ID : integer;
CharName : string;

Procedure OnCreate; // функция-событие на старт скрипта.
// эта ф-ция вызывается автоматически при старте скрипта (еще до первого пакета)
// ф-ция не обязательна и может отсутствовать в скриптах ...
begin
//
// Поотключаем все АВТОопределения и АВТОдекодирования:
//
gSys.TrafType := 0; // отключим внутреннее автоопределение трафика
gSys.tPDecode := 0; // отключим внутреннее автодекодирование
gSys.tKeyType := 0; // отключим начальное автоопределение ключа
gSys.Protocol := -1; // протокол соединения (у LS и GS разные ! обычно говорят о протоколе GS)
gSys.isGS := 0;
gSys.isLS := 0;
gSys.tParse := 0; // тип парсинга пакетов (двухбайтовый размер в начале пакета)
//
scode := false; // флаг де/кодирования GS
Kci := ''; Kco := ''; Ksi := ''; Kso := '';
//
CharName := '';
end;

Procedure OnDestroy; // функция-событие на закрытие скрипта и соединения.
// эта ф-ция вызывается автоматически при закрытие соединения
// ф-ция не обязательна и может отсутствовать в скриптах ...
begin
end;

procedure _DecGS(var bf : string;var ke : string; tk : integer); // декодируем пакет GS, это обычная ф-ция
var i,j,b,i1,sz,sk : integer;
begin
// стандартный алгоритм XOR декодирования GS la2
sz := length(bf);
sk := length(ke);
if sk = 0 then exit;
b := 0; j := 1;
for i := 3 to sz do begin
i1 := ord(bf[i]);
bf[i] := chr(i1 xor ord(ke[j]) xor b);
b := i1;
Inc(j,1);
if j > sk then j := 1;
end;
case tk of
1: PInt(ke,GInt(ke,1,4)+sz-2,1,4);
2: PInt(ke,GInt(ke,1,8)+sz-2,1,8);
3: PInt(ke,GInt(ke,9,8)+sz-2,9,8);
end;
end;

// on parse part
function OnParse: boolean;
var
l, pl : integer;
begin
result := false;
if _dFromServ then begin


pl := GInt(_dParseBuff, 1, 2);
l := Length(_dParseBuff);


// writelogln(format('buffer length %d packet length %d',[l, pl]));
if pl < l then begin
// writelogln('slicing packet');
_dParsePck := Copy(_dParseBuff, 1, pl);
_dParseBuff := Copy(_dParseBuff, pl + 1, l - pl);
end else begin
if pl = l then begin
_dParsePck := _dParseBuff;
_dParseBuff := '';
end else begin
writelogln('partial packet detected');

end;
end;

end else begin

_dParsePck := _dParseBuff;
_dParseBuff := '';

end;
end;


procedure _EncGS(var bf : string;var ke : string; tk : integer); // кодируем пакет GS, это обычная ф-ция
var i,j,b,i1,sz,sk : integer;
begin
// стандартный алгоритм XOR кодирования GS la2
sz := length(bf);
sk := length(ke);
if sk = 0 then exit;
i1 := 0; j := 1;
for i := 3 to sz do begin
bf[i] := chr(ord(bf[i]) xor ord(ke[j]) xor i1);
i1 := ord(bf[i]);
Inc(j,1);
if j > sk then j := 1;
end;
case tk of
1: PInt(ke,GInt(ke,1,4)+sz-2,1,4);
2: PInt(ke,GInt(ke,1,8)+sz-2,1,8);
3: PInt(ke,GInt(ke,9,8)+sz-2,9,8);
end;
end;

Procedure Trafic_Detector;
var _s : string;
begin
// Определим тип трафика и тип сервера.
// Внимание! при необходимости, определение трафика можно дополнить новыми вариантами =)
//
le := length(_dBuff); // _dBuff - входной пакет (так как эта ф-ция вызвана из OnDeCode)
//
// Определим тип трафика (в этом примере нас интересует только LA2)
//

if (gSys.TrafType = 0) and (_gAbsNumPkt = 1) then begin
case le of
$0B,$9B,$AB,$BA: begin
gSys.TrafType := 2; // LA2
gSys.isLS := 1; // LS
if le = $0B then gSys.tKeyType := 1 else gSys.tKeyType := 2; // это для LS, пока не потребуется
end;
$107: begin
gSys.TrafType := 2; // LA2
gSys.isGS := 1; // GS
end;
$07: begin
gSys.TrafType := 2; // LA2
gSys.isGS := 2; // GS
end;
else if le >= $107 then begin // более надежный способ определить LA2 GS
if pos(HStr('05 52 05 54 07 51 51 55 07 02 53 53 00 52 05 52'),_dBuff) <> 0 then begin
// если найдена строчка '.R.T.QQU..SS.R.R' (древний рим епть =) тогда это гейм сервер ла2.
gSys.TrafType := 2; // LA2
gSys.isGS := 2; // GS
end;

if StrCmp(copy(_dBuff, 3, 5), HStr('0E 3C 03 00 00')) then begin
writelogln('CT1 traffic detected');
gSys.TrafType := 2; // LA2
gSys.isGS := 3; // GS CT1
end;

writelogln(format('le = %x, prot = %x',[le, GInt(_dBuff, 4, 2)]));

if (le = $10B) and (GInt(_dBuff, 4, 2) = $57) then begin
writelogln('setting....');
gSys.TrafType := 2;
gSys.Protocol := 971; // fake protocol number for $53 protocol auto decoding
gSys.isGS := 3;
gSys.tKeyType := 3;
end;


end;
end;
//
//if gSys.TrafType = 2 then gSys.SetIDposlen(3,1); // ID в пакетах LA2 находится в третьем байте, размер 1 байт.
if gSys.TrafType = 2 then SetIDpos(3,4);// ID в пакетах LA2 находится в третьем, subID в четвертом байтах
if gSys.isGS > 0 then gSys.Protocol := gInt(_dBuff,4,4); // берем номер протокола GS

// продублим протоколы CT1
if gSys.Protocol >= 828 then gSys.isGS := 3; // GS CT1

end;
//
// определим ключ GS:
//
if (_gAbsNumPkt = 2) then
if (gSys.TrafType = 2) and (gSys.isGS > 0) and _dFromServ then begin
if (le = 12) then gSys.tKeyType := 1; // 12 байтный пакет - тип 1. GSDecodeJ (90% l2j)
if (le = 16) then gSys.tKeyType := 2; // 16 байтный пакет - тип 2. GSDecode (sub-off servers)
if (le = $1A) then gSys.tKeyType := 3; // часть фри серверов Interlude
if (le = $1C) then gSys.tKeyType := 3; // часть фри серверов Interlude
if (le = $15) then gSys.tKeyType := 3; // официальные сервера Interlude (на данный момент)
if (le = $14) then gSys.tKeyType := 3; // часть фри серверов Kamael (псевдо Hellbound)
if (le = $19) then gSys.tKeyType := 3; // руоф, только для просмотра
if gSys.tKeyType > 0 then begin
s := copy(_dBuff,5,16);
if gSys.tKeyType < 3 then s := copy(s,1,4)+Hstr('A1 6C 54 87'); // C4/C5/псевдо интерлюд.
if gSys.tKeyType = 3 then s := copy(s,1,8)+Hstr('C8 27 93 01 A1 6C 31 97'); // интерлюд.
Kci := s; Kco := s; Ksi := s; Kso := s;
scode := true; // запустим де/кодирование GS
writelogln('key:');writeloghexb(s);
end else writelogln('неопознанный ключевой пакет GS LA2 протокола')
end;
//
end;

Procedure OnDeCode; // функция-событие на декодирование пакета.
// эта ф-ция вызывается при получении пакета, ДО автоматического декодирования (если включено) и ДО записей в автологгер основных пакетов
// ф-ция не обязательна и может отсутствовать в скриптах ...
// входной буфер '_dBuff', выходной '_dOutBuff', флаг направления '_dFromServ' (не перепутайте)
begin
//writelogln('OnDeCode ..');

// _dBuff - входной пакет для декодирования
if _gAbsNumPkt < 6 then Trafic_Detector; // определим трафик и тип сервера (в пределах 5 первых пакетов, для LA2 этого хватит)
//
if scode and (_gAbsNumPkt > 2) then begin
// декодируем пакет, ручная реализация стандартного алгоритма.
if _dFromServ then
_DecGS(_dBuff,Ksi,gSys.tKeyType);
// else
// _DecGS(_dBuff,Kci,gSys.tKeyType);
_dOutBuff := _dBuff;
end;
end;

Procedure OnEnCode; // функция-событие на кодирование пакета.
// эта ф-ция вызывается перед отсылкой пакета, после записи в автологгер основных пакетов и после автоматического кодирования (если включено)
// так же ф-ция вызывается автоматически при использовании gSys.EnSendC и gSys.EnSendS
// !! Внимание !!
// в OnEnCode запрещено использовать ф-ции gSys.EnSendC и gSys.EnSendS во избежание замкнутой рекурсии
// ф-ция не обязательна и может отсутствовать в скриптах ...
// входной буфер '_dBuff', выходной '_dOutBuff', флаг направления '_dFromServ' (не перепутайте)
begin
//writelogln('OnEnCode ..');

if scode and (_gAbsNumPkt > 2) then begin
// кодируем пакет, ручная реализация стандартного алгоритма
if _dFromServ then
_EncGS(_dBuff,Kco,gSys.tKeyType);
// else
// _EncGS(_dBuff,Kso,gSys.tKeyType);
_dOutBuff := _dBuff;

//if _dFromServ then gSys.EnSendC(_dBuff) else gSys.EnSendS(_dBuff);
//gBlockPacket;
end;
end;

procedure SendMsg(msg : string); // ф-ция для вывода любого сообщения в чат клиента (другим не видно)
begin
if (gSys.isGS > 0) and (gSys.TrafType = 2) then // проверка на трафик LA2 GS
gSys.EnSendC(FormatPck('%cddss',[#$4A,0,10,#0,msg+#0]));
end;

BEGIN
// Тело скрипта
// вызывается при получении пакета прошедшего все декодировоки и автодекодировки
// как обычно, здесь пакет приходит в _gBuff и если его надо изменить, то пишем в _gOutBuff
// ...

if length(_gBuff) < 3 then exit;
ID := gInt(_gBuff,3,1);
//if (ID = $FE) or (ID = $D0) then ID := gInt(_gBuff,3,2);
//
// в качестве примера
if ID = $15 then begin // возьмем имя выбранного персонажа
//GetAnsiStr(copy(_gBuff,4,
ScanPck5(_gBuff,4,'s',CharName, null, null, null, null);
CharName := trim(CharName);
Writelogln('Выбранный перс: '+CharName);
end;
//





// ... далее пакет логируется и уходит на автокодировку затем на кодировку (OnEnCode) и отправляется.
END.

Вот текст скрипта Крит2:

Код:

// save us ver 2.0

BEGIN
if _gFromServ and hStrCmp(_gBuff,3,2,'FE 70') then gBlockPacket;
END.

Вместо скрипта Крит3 можно использовать этот(у меня лично он не пошел)

Код:

// corrector-3e.fsc n~e^?e`i"o` a"e"y" e^i^??a*e^o`i'i^a~i^ e`a~i'i^?e`?i^a^a`i'e`y" c,a`?e`o^?i^a^a`i'i'u^o~ C->S i"a`e^a*o`i^a^ i"?e` i"a`?n~e`i'a~a* i'a` ?o'i^o^a*
//
// ?a`n~?e`o^?i^a^e^a` o`?a`o^o^e`e^a` N~lient->GameServer i'a* i"?i^e`n~o~i^a"e`o`,
// e^a`e^a`y" e"e`a'i^ a*a~i^ i`i^a"e`o^e`e^a`o"e`y" - i'a* i"i^a"a"?a*??e`a^a`a*o`n~y"

var

ignore_cs : boolean;
temp : string;

Procedure OnCreate;
begin
ignore_cs := false;
gSys.tparse := 2;
end;

function OnParse: boolean;

begin
if ignore_cs then begin
if _dFromServ then begin
result := true;
end else begin
temp := _dParseBuff;
_dParsePck := _dParseBuff;
_dParseBuff := '';
result := false;
end;
end else begin
result := true;
end;

if not _dFromServ and (_gAbsNumPkt = 0) then begin
if (Length(_dParseBuff) = $10B) and (GInt(_dParseBuff, 4, 2) = $57) and (GInt(_dParseBuff, 4, 2) <> 0) then begin
writelogln('ruof proto detected - setting fake init');
temp := _dParseBuff;
_dParseBuff := HStr('0B010E7B0300000B00545603090B0107025454560700 02555600510053570407550854010701530056555601060504 51030851085156045406550802095156015306550453005656 53010902090151545109555609030407055504065504060904 51010808060552060401075403065255065555510102045403 55540157515505520554075151550702535300520552070154 00030505080605050603000D08010709035103075309510607 540A5056025204055551025300085404525606020900080353 5601050055060856040D0607520607040A0601045404000502 045400095253050401040505015251520D065108095453000D 01020354530105030856540702540B06115D1F60');
ignore_cs := true;
end;
end;
end;

procedure OnEncode;
begin
if ignore_cs and (not _dFromserv) then begin
_dOutBuff := temp;
temp := '';
end;
end;

begin
end.


Для того чтоб выбрать скрит по записи щелкаем по записи(athebalt в моем случае) Щелкаем по строке снизу(там где у меня выбраны крит 3 и крит2) , Жмем под настройками записи значек [..] и Выбираем скрипт. Далее Запускаем клиент игры(я лично это делаю через программу asi и без ГГ ,так у меня точно проходит)

Далее открываем после захода на чара настройки там клавиши чтото быстро меняем и жмем применить. У меня чара при wp включенном дисконнектит в течение минуты так что у меня такой срок успеть это тыкнуть.

После проделанных операций можно на чара беспрепятственно заходить без крит ошибок.

Огромное спасибо ShadeOfNothing -у за консультации и предоставленные скрипты, я до всего этого сам бы в жизни не додумался

p.s. у меня windows vista.
p.p.s если в чемто ошибся-пишите,отредактирую.

Mest
02.11.2009, 01:13
у меня в волкерах валяються куча подобных скриптов декадировщиков, знать бы еще для чего и в каких случаях их применить:info:

wolkve
12.01.2010, 20:42
если что, его аська 564-435-928