d2jsp
Log InRegister
d2jsp Forums > Off-Topic > International > Русский > короч опять на пг > я пошёл на пг
Prev1234568Next
Add Reply New Topic New Poll
Member
Posts: 31,910
Joined: Sep 25 2009
Gold: Locked
Aug 15 2016 07:35am
Quote (AjaxVS @ Aug 15 2016 01:22pm)
по слухам, у них свой варден, который спокойно детектит запущенные процессы и всё палит. насколько это правда - хз.


тогда можно смело сказать что в самой д2 есть встроенный динамический язык программирования\интерпритатор))

нет конешно, там лишь прога, палящяя геймы, и чёткие админы, которые пм делают тебе - не ответил, твои проблемы)
Member
Posts: 17,338
Joined: Oct 3 2006
Gold: 82,640.00
Aug 15 2016 09:24am
зачем интерпретатор?

афаик, варден работает так:
1. во время игры сервер шлет пакет клиенту д2 - качай варден.
2. д2 качает mpq с dll без заголовков. клиент подключает mpq как обычно, допиливает dll с подсказками сервера и получает доступ к функциям из dll - явная компановка или как там это теперь называется.
3. код вардена делает что угодно в рамках прав самой Game.exe. в "честном" случае - только сканирует адреса из памяти d2, проверяя, не изменены ли они на значения, которых быть не должно. по итогам скана составляет хэш, который отсылается назад на сервер.
4. если хэш не верный или ответа нет в течении ~минуты, связь рвется сервером, тебе ставят флаг.

чего не знаю - меняли ли варден-dll программеры пг и что туда могли насовать. и есть ли в пвпгн вообще такой механизм.
Member
Posts: 31,910
Joined: Sep 25 2009
Gold: Locked
Aug 15 2016 10:08am
Ну явно утверждать не могу как создали д2нт и ему подобные. (да и за д2 тоже не берусь говорить, ибо капать этот лес мне не по кайфу, т.к. не профитно^^)
Но, зачем же менять значения? Сидят они там и сидят себе, 3-ей программе лишь нужно их считать, а уже дальнейшие манипуляции уходят за пределы game.exe

Варден качает mpq/dll, клёва, значит там набор функций, которые должны быть вызваны с соответствующими прототипами, без динамики как их вызывать? - Если только они все как на подбор без args, и нужные args берутся из внутренних изначальных функций самой игры или статических адресов, что нить в этом духе, если нет - то тогда "явная компановка" будет подразумевать наличие динамической базы в самой игре.
Member
Posts: 17,338
Joined: Oct 3 2006
Gold: 82,640.00
Aug 15 2016 10:38am
хз о чем ты, вариантов конкретной реализации много. args, не args, это всё мелочи. никаких проблем не вижу.
главное - что алгоритм, выдающий значение-ответ серверу, содержится в коде, приходящим с сервера. и он спокойно вызывается. и хер его обманешь кстати (варден имеет сотни разных генерируемых dll для клиентов. даже расшифровав один, ничего не изменишь).

но копать д2 действительно не по кайфу, проще почитать фидбеки пострадавших. невинных жертв варденов и несправедливых админов офк, как в Эрефии принято :)

This post was edited by AjaxVS on Aug 15 2016 10:38am
Member
Posts: 31,910
Joined: Sep 25 2009
Gold: Locked
Aug 15 2016 01:35pm
Quote (AjaxVS @ Aug 15 2016 08:38pm)
хз о чем ты, вариантов конкретной реализации много. args, не args, это всё мелочи. никаких проблем не вижу.
главное - что алгоритм, выдающий значение-ответ серверу, содержится в коде, приходящим с сервера. и он спокойно вызывается. и хер его обманешь кстати (варден имеет сотни разных генерируемых dll для клиентов. даже расшифровав один, ничего не изменишь).

но копать д2 действительно не по кайфу, проще почитать фидбеки пострадавших. невинных жертв варденов и несправедливых админов офк, как в Эрефии принято :)


мелочи? у тебя в DLLке лежит набор функций, неправильно вызвал функцию/подал аргументы - error + memory leak. Статически функции скорее всего не вызываются, поэтому нужно точно знать прототип, а это уже раздел динамики - реализация которой требует наличия интерпритатора как минимум.
Member
Posts: 17,338
Joined: Oct 3 2006
Gold: 82,640.00
Aug 15 2016 01:54pm
Quote (Arhimond @ 15 Aug 2016 22:35)
раздел динамики - реализация которой требует наличия интерпритатора как минимум.

ноуп.
ну например, такой вот вызов произвольной функции с произвольным параметром из произвольной библиотеки:

Code
HINSTANCE h = LoadLibrary("bnetWardenLibrary.dll");
void (* dllFun) (char * s) = (void (*) (char * s)) GetProcAddress(h, "bnetWardenFunctionName");
dllFun("wardenInputCode");
Member
Posts: 31,910
Joined: Sep 25 2009
Gold: Locked
Aug 15 2016 04:05pm
Quote (AjaxVS @ Aug 15 2016 11:54pm)
dllFun("wardenInputCode");[/CODE]


GetProcAddress - лишь указатель на точку входа функции.
А вот вызов функции (dllFun) у тебя вообще без аргументов и без возвратного значения.
В С++ подобное не прокатит, dynCALL создана специально для таких целей, и если ты статически не прописываеш прототипы, то только через эту либу, т.е. ты начинаеш класть в стек (вот тут я не очень шарю, в стек ли) те типы аргументов и их размеры - которые необходимы. Если ты ошибся - то необессудь, ты либо получиш не правильный результат вычbслений, либо полный Error, и не известно чем он обернётся в дальнейшем. (обычный memory leak - это самый простой испуг, но есть вероятность и чего то более серьёзного)
Member
Posts: 17,338
Joined: Oct 3 2006
Gold: 82,640.00
Aug 15 2016 04:18pm
всё прокатит. с аргументами. с возвращаемыми значениями, если нужно. даже если либа или функция по какой-то причине не будет найдена, простая проверка результатов LoadLibrary() и GetProcAddress() позволит избежать error-ов. и разумеется, никаких memory leak-ов.
короче, rtfm: http://citforum.ck.ua/book/cook/dll0.shtml
это же основы основ :)
Member
Posts: 31,910
Joined: Sep 25 2009
Gold: Locked
Aug 15 2016 04:44pm
Quote (AjaxVS @ Aug 16 2016 02:18am)
всё прокатит. с аргументами. с возвращаемыми значениями, если нужно. даже если либа или функция по какой-то причине не будет найдена, простая проверка результатов LoadLibrary() и GetProcAddress() позволит избежать error-ов. и разумеется, никаких memory leak-ов.
короче, rtfm: http://citforum.ck.ua/book/cook/dll0.shtml
это же основы основ :)


Про GetProcAddress я ничего и не говорю, проверка на ошибку само собой разумеется.
Я говорю про прототип функции.

Либо так: __declspec(dllexport) void Demo(char *str)
Либо так: DllFunc=(void (*) (char *str)) GetProcAddress(h,"Demo");

А у нас, как было выше сказано - нет никаких подключаемых заголовков. Dllки - не дают прототипы!
Можно извлечь через name mangling (иль как там, я забыл, в общем если правильно DLL'ка сделана) имена функций, но не прототип.

А раз у нас нет заголовка (headers), то без DynCall, т.е. работы со стеком не обойтись (как это в DynCALL реализованно я без понятия, предположительно что тупо type_id вводится в кучу\стек, и уже только через эту тему вызывается функция).

Есть конешно такая тема:
Quote

template<typename... Args>
int Fcall( void * fun, Args ... args)
{
using Ftype = int( _stdcall *)( Args... ); // выведем тип функции по ее аргументам
return ( (Ftype)fun ) ( args... );
}
...
ret = Fcall(fPtr, (HWND)NULL, "Hello World", "Tmsg", (UINT)NULL );

Только эта тема в Run-Time не пашет, а тут у нас именно Run-Time.
Member
Posts: 17,338
Joined: Oct 3 2006
Gold: 82,640.00
Aug 15 2016 04:50pm
всё-таки надеюсь, что ты не тролль, хотя с каждым сообщением вероятность всё меньше :)

DLL:
Code
// myfirstdll.c
#include <stdio.h>

// Ключевое слово __declspec(dllexport)
// делает функцию экспортируемой
__declspec(dllexport) void Demo(char *str)
{
// Выводим на экран переданную функции Demo строку
printf(str);
}


Экзешник, вызывающий эту DLL:
Code
// DynCall.c
#include <stdio.h>
#include <windows.h>

main()
{
// Дескриптор загружаемой dll
HINSTANCE h;

// Объявление указателя на функцию, вызываемой из DLL
// Обратите внимание – имена объявляемой функции и
// функции, вызываемой из DLL, могут и не совпадать,
// т.к. за выбор вызываемой функции отвечает
// GetProcAddress
void (*DllFunc) (char *str);

// Загружаем MyFirstDLL
h=LoadLibrary("MyFirstDLL.dll");

// Контроль ошибок – если загрузка прошла успешно,
// функция вернет что-то отличное от нуля
if (!h)
{
printf("Ошибка - не могу найти MyFirstDLL.dll\n");
return;
}

// Вызовом GetProcAddress получаем адрес функции Demo
// и присваиваем его указателю DllFunc с явным
// приведением типов. Это необходимо т.к.
// GetProcAddress возвращает бестиповой far-указатель
DllFunc=(void (*) (char *str))
GetProcAddress(h,"Demo");

// Контроль ошибок – если вызов функции GetProcAddress
// завершился успешно, она вернет ненулевой указатель
if (!DllFunc)
{
printf("Ошибка! В MyFirstDLL "
"отсутствует ф-ция Demo\n");
return;
}

// Вызов функции Demo из DLL
DllFunc("Test");

// Выгрузка динамической библиотеки из памяти
FreeLibrary(h);
}


автор примера: Касперски К., Издано: 2003, BHV.
гл.
Go Back To Русский Topic List
Prev1234568Next
Add Reply New Topic New Poll