PDA

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


Страницы : 1 2 [3]

Yegor
21.02.2012, 17:26
Дак получилось? А чего esp-4 ? Я же писал что данные в [esp+4]

tiranosaur
22.02.2012, 00:34
перепутал когда ответ писал. да получплось. спс. щас сажусь писать перехват, а потом уже графику буду делать. не умею с графой я работать(

tiranosaur
13.04.2012, 10:47
Господа, назрел вопрос при переходе с ил на хф. Как запустить в олли дебаггере l2.bin если он без апдейтера не запускается? при аттаче виснет. просто запускаю в оле норм но, нет коннекта к серверу. Зараннее спасибо за помощ

Demion
04.05.2012, 22:33
кто трет мои сообщения?

qwm
04.05.2012, 22:37
Похоже, форум глюкнул, так как пропало сразу несколько сообщений, включая и сообщение xkor'a.
По поводу твоего вопроса - можно попробовать найти статический адрес указателя на объект через несколько дампов, сравнивая значение с тем, что выловишь в ecx. Правда, решение не наилучшее, но хоть какое-то.
Ещё вариант - сдампить сотню байт сверху от места из которого был вызван твой хук, дизассемблить и поглядеть, откуда заполняется ecx.
Отпиши хоть, я правильно твою задачу понял, или вообще не в ту степь?

Demion
04.05.2012, 23:42
Да правильно, спасибо за идеи. Я пытался использовать брутфорсный метод. Определил область памяти engine.dll и пытался просканить всю память на совпадение с адресом обьекта. Но приложение просто зависало при таком методе. (не смотря на то, что делал в отдельном потоке)

qwm
04.05.2012, 23:58
Первое моё предложение - это то же, что ты и делал, только это вовсе не обязательно делать в приложении. Узнай, что лежит в ecx, а далее отдельным приложением снапшотами найди интересующий тебя модуль (базу и размер) и постранично (4096 байт) считывай ReadProcessMemory. Ну, я думаю, переменная выровнена в памяти align 4, так что можешь чуть ускорить процесс сверки, не проверяя побайтно. Если со спец. софтинами для дампа дружишь, то конечно не обязательно самому так извращаться.
Либо второй метод, но это - если ты с асмом дружишь. Адрес возврата в хуке из стека вытащишь и по нему прочитаешь память. А дальше - дизасм и долгое ковыряние.
Пиши, если какие подводные камни будут.

Upd:
не помню, для какого сервера ты спрашивал значение, но на сервере Дефо (там вроде хай-файв 5) эта переменная видимо лежит по rva 0x0077ed80. При этом сама engine.dll не имеет релоков и грузится по адресу 0x20000000, т.е. адрес всегда 0x2077ed80.
на руофе rva 0x008986d4, дллка имеет релоки.
// если кому-то интересно - это адреса, по которым лежат указатели на объект UNetworkHandler.

qwm
10.05.2012, 17:30
Кто-нибудь в курсе, как на Winx32 получить хендл процесса ла2 руофа из юзер-мода? Он себя прячет, походу хукая соответствующие функции в ssdt из кернел-мода.
Вот как-то глупо получается, что я в него свою длл могу подгрузить самым банальным образом через SetWindowsHookEx, а получить хендл процесса - никак, только через дрова.

Morfik
10.05.2012, 17:51
qwm, тебе изнутри процесса получить (из длл подгруженной) хендл надо? GetCurrentProcess()

Ну а по другому не вырубая драйвер фроста или не восстанавливая то что нахукал драйвер не выйдет

qwm
10.05.2012, 17:56
Изнутри-то - не проблема. Изнутри он и не нужен - годится -1 (INVALID_HANDLE_VALUE). Как раз снаружи кумекаю, можно ли его обдурить.
В принципе, csrss должен иметь хендлы ко всем процессам, можно его там найти и сдупликатить. Но я пока не разобрался, какой объектный тип отвечает хендлам процессов

tureh012
24.05.2012, 17:55
Да это же не реально. Он же стоит нереально много.

Mlex
22.08.2012, 00:41
Привет всем. Есть вопрос по поводу перехвата UNetworkHandler::DispatchNetworkQueue(NetworkPacke t * *)
Я не могу понять как работать с "NetworkPacket * *" что значат две звездочки? указатель на указатель?
и как получить доступ к пакету если указатель на указатель? делаю так:

UNetworkHandler_DispatchNetworkQueue_hook(UNetwork Handler* This, int fEDX, NetworkPacket** packet)
{
UNH = This;

if (mSocket.Connected())
{
SendToBot(BOT_PKTTYPE_FROM_SERVER, (*packet)->id, (*packet)->subId, (*packet)->size, (*packet)->data);
}

return (*UNetworkHandler_DispatchNetworkQueue)(UNH, fEDX, packet);
}

Клиент критует, если убрать отсылку пакета боту(закомментить IF блок) то все работает нормально. Т.е. получается перехват работает, а доступ к пакету - критует. Что не так - не могу понять подскажите?

ЗЫ: ошибки в методе SendToBot быть не может, проверяю отправку через перехваченную функцию UNetworkHandler_AddNetworkQueue_hook(UNetworkHandl er* This, int fEDX /*edx*/, NetworkPacket* packet) все отлично работает, но юзать эту функцию не хочу т.к. палится.

Yegor
22.08.2012, 00:58
Mlex, что ты такое уже мутишь?

Mlex
22.08.2012, 01:28
Привет, Yegor :)
Улучшаю познания С++ :))) а вообще пытаюсь обойти защиту на одном сервачке HF5 :confused:

ЗЫ: Модернизировал ту длл исходники которой ты мне давал(для внедрения в клиент), прям пашет на ура 2мя способами перехвата - но оба палятся, на чистом клиенте - работают без проблем)
ЗЫ2: так же пытаюсь написать защиту :))))

maxilam
22.08.2012, 08:46
Я не могу понять как работать с "NetworkPacket * *" что значат две звездочки? указатель на указатель?


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

Yegor
22.08.2012, 12:45
Mlex, пиши в аську.

Mlex
24.08.2012, 10:15
maxilam, спасибо - было дело - перечитывал тему. С пакетом разобрался - просто не всегда указатель указывает на указатель - иногда на 0 :) Ведь функция вызывается в цикле потока и не всегда есть пакет который нужно обрабатывать :) все оказалось проще.

Nmap
01.11.2014, 10:43
тут была ересь..

goodvin1709
06.12.2014, 15:46
Прошло много времени уже после обсуждения, может остались у кого примеры, исходки , и всякие ништяки, хочу снова посидеть с клиентом ладвы, как раньше, просто уже сменил комп, место жительства, и исходки остались где то на старом харде которого я уже никогда не увижу.

Yegor
09.12.2014, 19:34
goodvin1709, ты из ДНР, ЛНР что ли вырвался?

goodvin1709
10.12.2014, 04:36
Yegor, Так точно

Yegor
10.12.2014, 08:13
Так а какие наработки нужны? Тут на форуме куча всего готового есть для загрузки.

goodvin1709
12.12.2014, 22:39
Для начала компоненты, для хука ( помню был модуль там была процедура "ХукПроцес" , и минимальный хук любой функции, желательно с перехватом nh)

Yegor
13.12.2014, 12:58
На Delphi?

goodvin1709
13.12.2014, 15:56
Да, ну хотя я и другие языки знаю, но на делфи делал раньше, будет легче понять.

Yegor
13.12.2014, 16:20
Если нужен хук с последующим использованием апи функций клиента то лучше с++.

goodvin1709
14.12.2014, 03:08
Ну я и С++ немного знаю, так что думаю разберусь.Главное бы примерчик в исходке, с коментами минимальными)

Yegor
14.12.2014, 17:39
Вот исходники защиты RGuard. Возьми в нем код от dsetup.dll.
Написано на с++. Там есть все необходимые базовые методы для написания бота на его основе (перехват пакетов от сервера, нахождение sendAdress, использование api функций, формирование пакетов и т.п.)

goodvin1709
15.12.2014, 04:40
Как я посидел и посмотрел, там куча хлама который не нужен, хуков процедур как таковы нету кроме AddNetworkQueue, я так понимаю тут перехват пакета идет?
Еще нашел bool SetHooks(void)
Жаль нет коментов к коду(
Не понял еще зачем ето?

unsigned int GetSendPacketAddress(void)
{
HMODULE hEngine = LoadLibraryA("engine.dll");

unsigned int startVMT = (unsigned int) hEngine + 0x51F658;
unsigned int AddNetworkQueue = (unsigned int) GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z");
unsigned int currVMT = startVMT;

if (AddNetworkQueue == 0)
{
return 0;
}

while (true)
{
if (*(unsigned int*) currVMT == AddNetworkQueue)
{
return *(unsigned int*) (currVMT - 0xA4);
}

currVMT++;
if (currVMT - startVMT > 10000)
{
return 0;
}
}
return 0;
}

И что это за дрянь?
typedef struct _IDENTIFY_DATA
{
USHORT GeneralConfiguration;
USHORT NumberOfCylinders;
USHORT Reserved1;
USHORT NumberOfHeads;
USHORT UnformattedBytesPerTrack;
USHORT UnformattedBytesPerSector;
USHORT SectorsPerTrack;
USHORT VendorUnique1[3];
USHORT SerialNumber[10];
USHORT BufferType;
USHORT BufferSectorSize;
USHORT NumberOfEccBytes;
USHORT FirmwareRevision[4];
USHORT ModelNumber[20];
UCHAR MaximumBlockTransfer;
UCHAR VendorUnique2;
USHORT DoubleWordIo;
USHORT Capabilities;
USHORT Reserved2;
UCHAR VendorUnique3;
UCHAR PioCycleTimingMode;
UCHAR VendorUnique4;
UCHAR DmaCycleTimingMode;
USHORT TranslationFieldsValid:1;
USHORT Reserved3:15;
USHORT NumberOfCurrentCylinders;
USHORT NumberOfCurrentHeads;
USHORT CurrentSectorsPerTrack;
ULONG CurrentSectorCapacity;
USHORT CurrentMultiSectorSetting;
ULONG UserAddressableSectors;
USHORT SingleWordDMASupport : 8;
USHORT SingleWordDMAActive : 8;
USHORT MultiWordDMASupport : 8;
USHORT MultiWordDMAActive : 8;
USHORT AdvancedPIOModes : 8;
USHORT Reserved4 : 8;
USHORT MinimumMWXferCycleTime;
USHORT RecommendedMWXferCycleTime;
USHORT MinimumPIOCycleTime;
USHORT MinimumPIOCycleTimeIORDY;
USHORT Reserved5[2];
USHORT ReleaseTimeOverlapped;
USHORT ReleaseTimeServiceCommand;
USHORT MajorRevision;
USHORT MinorRevision;
USHORT Reserved6[50];
USHORT SpecialFunctionsEnabled;
USHORT Reserved7[128];
} IDENTIFY_DATA, *PIDENTIFY_DATA;
Пример то замечательный,но очень трудно его вкурить для начала.

Добавлено через 2 часа 5 минут
Не знаю, будет ли пахать у меня такой код:
еще не поставил билдера под сишку(скачивает) а хочу спросить уже))
#include <winsock2.h>
#include <windows.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <time.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <icmpapi.h>
#include <io.h>

#include "hook.h"
#include "blowfish.h"
#include "resource.h"
#include "Obfuscator.h"

#include "stdafx.h"
#include "ThemidaSDK.h"
#include "splash.h"

#pragma comment(lib, "User32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "psapi.lib")


struct TNetworkPacket
{
unsigned char id, p1;
unsigned short int subid, size, p2;
unsigned char *data;
};


#pragma pack(1)
typedef struct _IDENTIFY_DATA
{
USHORT GeneralConfiguration;
USHORT NumberOfCylinders;
USHORT Reserved1;
USHORT NumberOfHeads;
USHORT UnformattedBytesPerTrack;
USHORT UnformattedBytesPerSector;
USHORT SectorsPerTrack;
USHORT VendorUnique1[3];
USHORT SerialNumber[10];
USHORT BufferType;
USHORT BufferSectorSize;
USHORT NumberOfEccBytes;
USHORT FirmwareRevision[4];
USHORT ModelNumber[20];
UCHAR MaximumBlockTransfer;
UCHAR VendorUnique2;
USHORT DoubleWordIo;
USHORT Capabilities;
USHORT Reserved2;
UCHAR VendorUnique3;
UCHAR PioCycleTimingMode;
UCHAR VendorUnique4;
UCHAR DmaCycleTimingMode;
USHORT TranslationFieldsValid:1;
USHORT Reserved3:15;
USHORT NumberOfCurrentCylinders;
USHORT NumberOfCurrentHeads;
USHORT CurrentSectorsPerTrack;
ULONG CurrentSectorCapacity;
USHORT CurrentMultiSectorSetting;
ULONG UserAddressableSectors;
USHORT SingleWordDMASupport : 8;
USHORT SingleWordDMAActive : 8;
USHORT MultiWordDMASupport : 8;
USHORT MultiWordDMAActive : 8;
USHORT AdvancedPIOModes : 8;
USHORT Reserved4 : 8;
USHORT MinimumMWXferCycleTime;
USHORT RecommendedMWXferCycleTime;
USHORT MinimumPIOCycleTime;
USHORT MinimumPIOCycleTimeIORDY;
USHORT Reserved5[2];
USHORT ReleaseTimeOverlapped;
USHORT ReleaseTimeServiceCommand;
USHORT MajorRevision;
USHORT MinorRevision;
USHORT Reserved6[50];
USHORT SpecialFunctionsEnabled;
USHORT Reserved7[128];
} IDENTIFY_DATA, *PIDENTIFY_DATA;
#pragma pack()


typedef int (__fastcall *_AddNetworkQueue) (unsigned int This, unsigned int EDX, TNetworkPacket *NetworkPacket);
_AddNetworkQueue true_AddNetworkQueue;

typedef void (__cdecl *_SendPacket) (unsigned int This, char *Format, ...);
_SendPacket true_SendPacket;

HWND hWND;

unsigned int hEngineStart, hEngineEnd, mainThread, lastPing = 0, KiUserExceptDispADR, hNtDllStart, hNtDllEnd;
HANDLE ghMutex;




int __fastcall new_AddNetworkQueue(unsigned int This, unsigned int EDX, TNetworkPacket *NetworkPacket)
{

return true_AddNetworkQueue(This, EDX, NetworkPacket);
}


void __cdecl new_SendPacket(unsigned int This, char *Format, ...)
{

unsigned char buf[10240];
int size = 0, len;
wchar_t *wstr;

va_list args;
va_start(args, Format);

while (*Format != 0)
{
switch (*Format)
{
case 'c':
*(unsigned char*) (buf + size) = va_arg(args, unsigned char);
size++;
break;
case 'h':
*(unsigned short int*) (buf + size) = va_arg(args, unsigned short int);
size += 2;
break;
case 'd':
*(unsigned int*) (buf + size) = va_arg(args, unsigned int);
size += 4;
break;
case 'Q':
*(unsigned __int64*) (buf + size) = va_arg(args, unsigned __int64);
size += 8;
break;
case 'b':
len = va_arg(args, unsigned int);
memcpy(buf + size, va_arg(args, void*), len);
size += len;
break;
case 'S':
wstr = va_arg(args, wchar_t*);
if (wstr == 0)
{
len = 2;
*(unsigned short int*) (buf + size) = 0;
}
else
{
len = wcslen(wstr) * 2 + 2;
memcpy(buf + size, wstr, len);
}
size += len;
break;

}
Format++;
}
va_end(args);
true_SendPacket(This, "b", size, (int)buf);
}



unsigned int GetSendPacketAddress(void)
{
HMODULE hEngine = LoadLibraryA("engine.dll");

unsigned int startVMT = (unsigned int) hEngine + 0x51F658;
unsigned int AddNetworkQueue = (unsigned int) GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z");
unsigned int currVMT = startVMT;

if (AddNetworkQueue == 0)
{
return 0;
}

while (true)
{
if (*(unsigned int*) currVMT == AddNetworkQueue)
{
return *(unsigned int*) (currVMT - 0xA4);
}

currVMT++;
if (currVMT - startVMT > 10000)
{
return 0;
}
}
return 0;
}


bool SetHooks(void)
{
FARPROC addr;
HMODULE hEngine = LoadLibraryA("engine.dll"), hNtDlll = LoadLibraryA("ntdll.dll");
MODULEINFO modinfo;

GetModuleInformation(GetCurrentProcess(), hEngine, &modinfo, sizeof(MODULEINFO));

hEngineStart = (unsigned int) hEngine;
hEngineEnd = hEngineStart + modinfo.SizeOfImage - 1;

GetModuleInformation(GetCurrentProcess(), hNtDlll, &modinfo, sizeof(MODULEINFO));

hNtDllStart = (unsigned int) hNtDlll;
hNtDllEnd = hNtDllStart + modinfo.SizeOfImage - 1;

if ((KiUserExceptDispADR = (unsigned int) GetProcAddress(LoadLibraryA("ntdll.dll"), "KiUserExceptionDispatcher")) == 0)
return false;

if (*(unsigned char*) (KiUserExceptDispADR) == 0xFC)
KiUserExceptDispADR++;


if ((addr = GetProcAddress(hEngine, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z")) == 0)
return false;

true_AddNetworkQueue = (_AddNetworkQueue) splice((unsigned char*) addr, new_AddNetworkQueue);

if ((addr = (FARPROC) GetSendPacketAddress()) == 0)
return false;

true_SendPacket = (_SendPacket) splice((unsigned char*) addr, new_SendPacket);

return true;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if (fdwReason == DLL_PROCESS_ATTACH)
{

DisableThreadLibraryCalls(hinstDLL);


if (!SetHooks())
{
Sleep(INFINITE);
}
}

return true;
}

Yegor
15.12.2014, 08:00
Лишнее выкинь.

unsigned int GetSendPacketAddress(void) - вычисление SendAddr (адрес неэкспортируемой функции для отправки пакетов серверу, это если слать без апи напрямую)



typedef struct _IDENTIFY_DATA - структура для получения инфо о HDD, для вычисления HWID, тебе не нужно.

Это проект для VisualStudio. Под билдер скорее всего придется дорабатывать.

goodvin1709
15.12.2014, 11:42
Yegor, т.е в SendAdrr мы уже можем слать пакеты в чистом виде, в подальшем они будут шифроватся.?
KiUserExceptDispADR
KiUserExceptionDispatcher
Так и не понял зачем это и что оно делает?

Yegor
15.12.2014, 13:32
Yegor, т.е в SendAdrr мы уже можем слать пакеты в чистом виде, в подальшем они будут шифроватся.?


Да. Там есть пример формирования пакета.


KiUserExceptDispADR
KiUserExceptionDispatcher
Так и не понял зачем это и что оно делает?

Это для защиты можно вырезать.

goodvin1709
16.12.2014, 03:15
Yegor, если поставить хук на сенд адрес и логировать , то будем получать пакеты которые клиент шлет серву? А адднеткюери от серва клиенту?

Добавлено через 13 часов 6 минут
Если есть ася/Скайп хотел бы задать тебе пару вопросов лично

Yegor
16.12.2014, 14:00
Отписал в ЛС

goodvin1709
18.12.2014, 00:00
Yegor, я не могу почему то инектировать в ла2((

Smwr
14.07.2016, 23:27
Может быть кто вкурсе каким образом можно получить баффлист/скилллист/инвентарь?
Может быть есть простой способ получить их, используя апи, по аналогии с GetNextCreature(), или же в памяти по статическому адресу?
Не очень хочется хукать InventoryUpdate и подобные.

skameykin
04.08.2017, 07:54
И как решили вопрос?

rdxx
15.04.2020, 14:23
Привет из 2020. Помогите! Как вызвать UNetworkHandler::MTL?
Говорят, что это избитая тема, но я уже неделю ищу инфу по ней, почти ничего нет, особенно на C++.

Объявил функцию:
typedef void(__thiscall* f_MTL)(int this_UNetworkHandler, int Actor1, float x_to, float y_to, float z_to, float x_from, float y_from, float z_from, int Actor2, int unk0, int unk1, int unk2);
f_MTL call_MTL = reinterpret_cast<f_MTL>(0x203D8970);

Пытаюсь вызвать:

if (GetAsyncKeyState(VK_NUMPAD9))
{
int pUser = GetMyUserClass();

int AActor1 = *(int*)(pUser + 0x2B4);
int AActor2 = *(int*)(AActor1 + 0x40);

float x_from = *(float*)(AActor1 + 0x1B4);
float y_from = *(float*)(AActor1 + 0x1B8);
float z_from = *(float*)(AActor1 + 0x1BC);

call_MTL(UNetworkHandler_this, AActor1, x_from+100, y_from+100, z_from, x_from, y_from, z_from, AActor2, 0, 0, 0);
}

При вызове клиент просто закрывается без какой-либо реакции. В чем трабл может быть?
UNetworkHandler::GetUser к примеру, работает четко. А эта не хочет..

ScythLab
19.04.2020, 00:50
Не помню как себя поведет __thiscall в подобном варианте, поэтому попробуй объявить:

typedef void(__fastcall* f_MTL)(int this_UNetworkHandler, int Dummy, int Actor1, float x_to, float y_to, float z_to, float x_from, float y_from, float z_from, int Actor2, int zero);
так гарантированно будет верный вызов. При этом Actor2 можно передавать 0.
По остальному коду нужно смотреть где именно у тебя валится клиент, т.к. ошибка может быть в любой строчке (и не забудь проверить правильные ли ты получаешь координаты).

В зависимости от места ошибки можно будет двигаться дальше.

injenik
09.03.2022, 19:45
Как вызывать функции у которых в аргументе передается класс L2ParamStack?
Функцию определяю так:
typedef void (__thiscall* dRequestMagicSkillUse)(int thisUnetworkHandler, class L2ParamStack&);
dRequestMagicSkillUse callMagicSkillUse = reinterpret_cast<dRequestMagicSkillUse>(engineBase + 0x9264);
а как правильно определить класс?