PDA

Просмотр полной версии : L2PacketHack 3.1.8 AE (Advanced Edition)


QaK
10.07.2008, 09:24
Итак после ряда терзаний мозга и т.д. получилось сваять ПНХ с поддержкой длл, более-менне стабильно. Разработано совместно с Гринчем. Итак приступим:

Теперь в ПНХ (весия 3.1.8) исть 2 штуки для работы с длл - процедура и функция. Обо всем по-порядку:

Процедура: CallPr
Исходный текст: if MethodName = 'CALLPR' then begin
@TestProc := nil;
@TestProc := GetProcAddress(Cardinal(Params[0]),PAnsiChar(VarToStr(Params[1])));
if @TestProc <> nil then begin
Count := Params[2];
setLength(popa,count);
for i:=0 to Count-1 do
popa[i]:=PChar(VarToStr(Params[3][i]));
TestProc(popa);
end;
@TestProc:=nil;
end else
//еще в раздел переменных функции TL2PacketHackMain.CallMethod добавить
//TestProc: procedure (ar:array of PChar);stdcall;
Добавление метода в фаст скрипт:
fsScript.AddMethod('procedure CallPr(LibHandle:integer;FunctionName:String;Count :Integer;Params:array of variant)',CallMethod);

Функция: CallFnc
Исходный текст:
if MethodName = 'CALLFNC' then begin
@TestFunc := nil;
@TestFunc := GetProcAddress(Cardinal(Params[0]),PAnsiChar(VarToStr(Params[1])));
if @TestFunc <> nil then begin
Count := Params[2];
setLength(popa,count);
for i:=0 to Count-1 do
popa[i]:=PChar(VarToStr(Params[3][i]));
Result:=StrPas(TestFunc(popa));
end;
@TestFunc:=nil;
end else
//еще в раздел переменных функции TL2PacketHackMain.CallMethod добавить
//TestFunc: function (ar:array of PChar):Pchar;stdcall;
Добавление метода в фаст скрипт:
fsScript.AddMethod('function CallFnc(LibHandle:integer;FunctionName:String;Coun t:Integer;Params:array of variant):string',CallMethod);

использование: при создании дллки описание должно выглядеть
для процедуры

procedure MyNazvanie(s:array of PChar);stdcall;export;
var param1:integer;
param2:string;
begin param1:=StrToInt(StrPas(s[0]));
param2:=StrPas(s[1]);
end;

для функции

function MyNazvanie(s:array of PChar):PChar;stdcall;export;
var param1:integer;
param2:string;
begin param1:=StrToInt(StrPas(s[0]));
param2:=StrPas(s[1]);
Result:=PChar(IntToStr(param1)+' '+param2);
end;

З.Ы. CallFnc возвращает string;

З.Ы.Ы. TestDLL - тестовая дллка и скрипт для передачи/приема различных данных, Temp_Project - для передачи пакета в дллку (полностью) и разбор пакета уже непосредственно в дллке.

З.Ы.Ы.Ы. в ПНХ добавлена функция StrToHex, чтоб посылать пакет в дллку нужно обязательно его в хекс перевести иначе возникает проблемма в преобразовании типов и пакет передается не полностью.

З.Ы.Ы.Ы.Ы. Большое спасибо модерам и админу за помощь в создании сего продукта =) Гринч, выкинь сюда весь исходник и перекомпиленную пнх, последнюю, ну ты знаешь какую =)

Emocean
13.07.2008, 14:59
В TestDll и в Temp_Project лежит один и тот же проект. Так и должно быть?..

QaK
14.07.2008, 08:48
Упс, мой косяк =) Щас поправлю.

Добавлено через 5 минут
Перезалил TestDll.

QaK
17.07.2008, 11:15
От нечего делать в Temp_Project дописал процедурки Write, аналогичные пнх. Если кого-то интересует - могу выложить обновленный Temp_Project. И вообще вопрос, кто-то юзает эту версию пнх для работы с дллками, и если юзают, то что конкретно пытаетесь реализовать?

Добавлено через 1 час 43 минуты
В общем залил новый Temp_project.

Grinch
17.07.2008, 18:04
короче говоря я ток компилил в личку не пишите ) для меня ет тёмный лес пока что ) жду бота )

PanAm
18.07.2008, 18:13
А с 3.2.0 можете это сделать? Пожалуста.
PS. И еще, ну очень нехватает функции посылки нажатий клавишь в окно. )))

QaK
19.07.2008, 20:41
А с 3.2.0 можете это сделать? Пожалуста.
PS. И еще, ну очень нехватает функции посылки нажатий клавишь в окно. )))что тебя в 3.1.8 не устраивает? Посылка нажатий клавишь в окно - это не к пнх, существует ряд программ, зачем тебе посылать нажатие клавиши,для какой цели. Теоретичеки сам можешь добавить в 3.2.0 эти функции/процедуры, в первом посте приведен исходный код, и куда его пихать. Просто у меня нет дельфи 2007й =)

NLObP
24.07.2008, 00:27
З.Ы.Ы.Ы. в ПНХ добавлена функция StrToHex, чтоб посылать пакет в дллку нужно обязательно его в хекс перевести иначе возникает проблемма в преобразовании типов и пакет передается не полностью.

Выложи main.pas, чтобы я сделал 3.2.0. Мне не хватает определения для функции StrToHex
Вот пока без нее:

QaK
24.07.2008, 08:38
В CallMethod добавить
if MethodName = 'STRTOHEX' then Result:=StringToHex(Params[0],'') else
В RefreshPrecompile добавить
fsScript.AddMethod('function StrToHex(Str:String):String',CallMethod);

NLObP
26.07.2008, 06:48
Выложил в разделе файлов скомпилированную версию 3.2.1 и 3.1.8 с поддержкой ДЛЛ.

ЗЫЖ В закладке Скрипты по ctrl+s сохраняет скрипт, плюс еще немного незначительных изменений.

PanAm
26.07.2008, 14:57
СенксPS. И еще, ну очень нехватает функции посылки нажатий клавишь в окно. )))Отпало, пошел тупо - нашел алгоритм шифрации от клиента...

xkor
26.07.2008, 16:08
ЗЫЖ В закладке Скрипты по ctrl+s сохраняет скриптблин я это хотел сделать уже хз скока но так руки и не доходили), молодца!!!

NLObP
26.07.2008, 16:45
блин я это хотел сделать уже хз скока но так руки и не доходили), молодца!!!

Исправил маленькую s на большую S и сразу заработало.
// добавили комбинацию клавиш 'сохранить файл' - ctrl+s
if(Key=Ord('S'))and(Shift=[ssCtrl]) then Button20Click(Sender);

alexsl
27.07.2008, 07:18
еще бы вставить процедурку, чтоб из скрипта можно было изменять ключ, думаю оч нужная фича была бы.
будет ли так работать?

var
stmp: string;
<---cut--->
if MethodName = 'INITKEYS2' then
begin
stmp:=Params[0];
b:=TfsScript(Integer(Params[1])).Variables['ConnectID'];
Thread[Integer(Params[1])].xorS.InitKey2(stmp,Thread[b].isInterlude);
// log('initkeys2:'+stmp);
end
else
if MethodName = 'INITKEYC2' then
begin
stmp:=Params[0];
b:=TfsScript(Integer(Params[1])).Variables['ConnectID'];
Thread[Integer(Params[1])].xorC.InitKey2(stmp,Thread[b].isInterlude);
end
<---cut--->

NLObP
28.07.2008, 01:50
еще бы вставить процедурку, чтоб из скрипта можно было изменять ключ, думаю оч нужная фича была бы.
будет ли так работать?

Пример скрипта можно для теста?
Я так понял так имелось в виду?
procedure InitKeyS(key: string);
procedure InitKeyС(key: string);

Скомпилил, только названия без двойки: InitKeyS, InitKeyC

alexsl
28.07.2008, 07:35
чтоб не заморачиватся с разгадкой генерации начального ключа, была мысль использовать какойнить пакет,в частном случае, известно, что 3 пакет от клиента это выбор чара 0D=CharacterSelected:d(CharSlot) 0D 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...., после которого следовало вычислить ключ и изменить оный.

в скрипте имхо так:
if FromClient and PckCount=3 then
begin
// key:=танцы с бубном получения ключа
InitKeyS(key)
end;


чтоб это работало, нужно :
добавить функцию для скриптов возвращ. номер пакета PckCount.
и программе добавить новую процедуру InitKey2 котороя инициализирует все 8 байт.


procedure TXorCoding.InitKey2(const XorKey; Interlude: Boolean = False);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;

// Move(XorKey,key2,4);
// тут меняю ключ 8 байт
Move(XorKey,key2,8);
// Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;


зы: еще идейка, чтоб при загрузке нерасшифрованных (сохраненных как есть) пакетов из текстового файла они проходили через процедуру расшифровки/шифровки заново, т.е. удобно подбирать(или тестировать длл невхор) алгоритм, смотря в логах что получилось, т.к. большую часть времени нет возможности запускать линейку.

зы: в общем как всегда желания не совпадают с возможностями :D
зыы: в системном программирования я "не взуб ногой" больше прикладник.

QaK
29.07.2008, 16:29
Выложил в разделе файлов скомпилированную версию 3.2.1 и 3.1.8 с поддержкой ДЛЛ.т.е. ты в 3.2 тож добавил callpr и callfnc?

NLObP
30.07.2008, 01:05
т.е. ты в 3.2 тож добавил callpr и callfnc?

Да, мне Grinch давал main.pas, я от туда взял и вставил в 3.2.0.

PanAm
04.08.2008, 18:28
эх, к вашему проекту очень нехватает модуля с функциями для работы с array of PChar, аналогов ReadX(i) и WriteX. Может у кого есть готовый?

NLObP
04.08.2008, 20:20
эх, к вашему проекту очень нехватает модуля с функциями для работы с array of PChar, аналогов ReadX(i) и WriteX. Может у кого есть готовый?

По подробнее можно? Чего это такое?

PanAm
06.08.2008, 16:39
Имею ввиду просто текстовый модуль функций, для подключения к проекту.
Ну или просто объясните как оптимальней прочитать integer из array of PChar или дописать integer в конец массива.

xkor
07.08.2008, 00:23
PanAm, integer из массива нуль-терминированных строк это как? :confused: