PDA

Просмотр полной версии : Вызов AddNetworkQueue


DaVilka
15.01.2017, 04:06
Хочу положить пакет в структуру, и отправить ее на клиент.
Заполняю структуру
byte gfg[8] = {0xC9, 0x29, 0x13, 0x10, 0x02, 0x00, 0x00, 0x00};
packetsend->id = 0x27;
packetsend->_padding1 = 0xF0;
packetsend->exid = 0xFF;
packetsend->_padding2 = 0xFF;
packetsend->size = 8;
packetsend->_padding3 = 0;
packetsend->data = gfg;


Передаю в функцию - получаю крит
General protection fault!

History: FMallocWindows::Free <- UNetworkHandler::Tick <- Function Name=SocialActionPac <- UGameEngine::Tick <- UpdateWorld <- MainLoop
Если в след за ней вызвать DispatchNetworkQueue передав ссылку на структуру, то крита нету, но ничего не происходит, как будто пакета и не было, а если вызвать UNetworkHandler::Tick, то можно узреть срабатывание функции, но через пару сек клиент просто зависате

Smwr
15.01.2017, 15:51
Если внимательно посмотреть на трейс, то валится при вызове FMallocWindows::Free.
Всё потому что, память под структуру и поле data должна быть выделена тем менеджером, который будет потом её освобождать.
Экземпляр менеджера экспортируется из core.dll.

namespace l2native {
class FMalloc {
public:
virtual void* Allocate(size_t size, int unk_zero) = 0;
private:
virtual void unk_0() = 0;
public:
virtual void Free(void* block) = 0;
};
}



Если в след за ней вызвать DispatchNetworkQueue передав ссылку на структуру, то крита нету, но ничего не происходит
Этот метод не так работает.

DaVilka
15.01.2017, 17:42
Если внимательно посмотреть на трейс, то валится при вызове FMallocWindows::Free.
Всё потому что, память под структуру и поле data должна быть выделена тем менеджером, который будет потом её освобождать.
Экземпляр менеджера экспортируется из core.dll.

namespace l2native {
class FMalloc {
public:
virtual void* Allocate(size_t size, int unk_zero) = 0;
private:
virtual void unk_0() = 0;
public:
virtual void Free(void* block) = 0;
};
}



Этот метод не так работает.
хм, получается мне нужно экспортировать функции из коре и выделять память под структуру через нее?

Smwr
15.01.2017, 18:27
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.

DaVilka
15.01.2017, 21:16
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.

А можно пример, или описание хода действий, чето не пойму:(

Добавлено через 1 час 51 минуту
Экспортируется только экземпляр, а не методы (они виртуальные, поэтому хватит определения что я дал выше).
Выделять/освобождать память под структуру пакета и буффер надо именно ими.

Что то я не могу найти в Core.dll FMallocWindows

supernewbie
16.01.2017, 07:41
DaVilka,

hCore:= GetModuleHandle('core.dll');
L2MemAlloc:= GetProcAddress(hCore, '?GMalloc@@3PAVFMalloc@@A');
...

function L2MemoryAllocNetPacket: PNetworkPacket; register;
asm
push NetPacket
push $0C
mov edx, L2MemAlloc
mov ecx, [edx]
mov eax, [ecx]
mov edx, [eax]
call edx
end;

function L2MemoryAllocNetCmd(len: integer): Pointer; register;
asm
push NetCmd
push len
mov edx, L2MemAlloc
mov ecx, [edx]
mov edx, [ecx]
mov eax, [edx]
call eax
end;


procedure L2MemoryFreeNetPacket(pck: PNetworkPacket); stdcall;
asm
lea edi, pck
mov edx, L2MemAlloc
mov ecx, [edx]
mov eax, [ecx]
mov edx, [edi]
mov edx, [edx+8]
push edx
mov eax, [eax+8]
call eax
mov ecx, L2MemAlloc
mov ecx, [ecx]
mov eax, [edi]
mov edx, [ecx]
push eax
mov edx, [edx+8]
call edx
end;

...

var
np: PNetworkPacket;
begin
np:= L2MemoryAllocNetPacket;
np.id:= pck[0];
np.res:= 0;
np.size:= len - 1;
np.res2:= 0;
np.id2:= -1;
np.data:= L2MemoryAllocNetCmd(len - 1);
Move(pck[1], np.data[0], len - 1);

AddNetworkQueue(np);

Smwr
16.01.2017, 10:15
DaVilka,

char payload[] = { 0xC9, 0x29, 0x13, 0x10, 0x02, 0x00, 0x00, 0x00 };
HMODULE hCore = GetModuleHandleA("Core.dll");
FMalloc* pMalloc = (FMalloc*)GetProcAddress(hCore, "?GMalloc@@3PAVFMalloc@@A");
NetworkPacket* packet = (NetworkPacket*)pMalloc->Allocate(sizeof(NetworkPacket), 0);
packet->Buffer = (uint8_t*)pMalloc->Allocate(sizeof(payload), 0);
std::memcpy(packet->Buffer, payload, sizeof(payload));
packet->Id = 0x27;
packet->Id2 = 0xFF;
packet->Size = sizeof(payload);
//do stuff

DaVilka
16.01.2017, 19:57
NetworkPacket* packet = (NetworkPacket*)pMalloc->Allocate(sizeof(NetworkPacket), 0);Вот здесь клиент падает, либа подключается, функцию находит хм

Smwr
19.01.2017, 14:03
потому что не стоит так бездумно списывать, я ведь могу опечататься ;)

FMalloc* pMalloc = *(FMalloc**)GetProcAddress(hCore, "?GMalloc@@3PAVFMalloc@@A");

DaVilka
19.01.2017, 16:41
не стоит так бездумно списыватья так и думал что трабла там, я пытался сделать по другому, но к приведению к классу чето не додумался, а вообще спасибо, вызвал )

nasta456
30.01.2019, 21:11
спасибо всем за ответы)