-
Автор темы
- #1
PostReceivedNetMessage new idx?
Индекс 71, сигнатура:PostReceivedNetMessage new idx?
48 83 EC 48 8B 44 24 78
а чо он не экзекьютиться?Индекс 71, сигнатура:
48 83 EC 48 8B 44 24 78
Бля, реально не вызываетсяа чо он не экзекьютиться?
Вчера смотрел в классе CNetChan 71 индекс брякнув его на локалке, функция не вызывалась.
Вот и я сижу ломаю голову уже второй вечер.Бля, реально не вызывается
Я думал это я проебланил индекс, но функция-то та же
CNetChan::ProcessPackets:
...
this->PostReceivedNetMessage(blablabla);
...
CNetChan::PostReceivedNetMessage
this->in_network_queue.PushItem(blablabla)
CNetChan::ProcessPackets:
...
this->in_network_queue.PushItem(blablabla)
...
Ну я так и понял, хотел написать, что перешёл в ту сабку, что была в ПостРесиве и там всё вызывается, но не стал.потому что PostReceivedNetMessage виртуальная функа нихуя не делает она токо вызывает CTSQueue<CNetworkMessageSignalQueue<CEventIDManager_NetChan,BogusType_t>::QueuedMessage_t,false>::PushItem
которая нынче просто напрямую вызывается вместо вызова PostReceivedNetMessage
(ну т.е. если у гейба раньше был код в стиле условно
то щас он сталC++:CNetChan::ProcessPackets: ... this->PostReceivedNetMessage(blablabla); ... CNetChan::PostReceivedNetMessage this->in_network_queue.PushItem(blablabla)
)C++:CNetChan::ProcessPackets: ... this->in_network_queue.PushItem(blablabla) ...
ну можно хукнуть что-нибудь повыше и самому in_network_queue эту обрабатывать(это linked-list-like структурка замкнутая/кольцевая(вместо нуллптр в последнем элементе там указатель на саму структуру))(там есть CNetworkSerializerPB и само сообщение), на CNetChan + 0xF0 вроде она(PostReceivedNetMessage просто в нее добавляет)Ну я так и понял, хотел написать, что перешёл в ту сабку, что была в ПостРесиве и там всё вызывается, но не стал.
Ну ничего, как-нибудь там хукнём что-то ещё, либо забью на чит из-за этого.
если кому-то надо,Либо использовать фильтры. Ниже PostRecieveeNetMsg по виртуалкам есть функция что регает листнера. Он возвращает bool (Может блочить получение опр мсг например)
class INetworkMessageProcessingPreFilter
{
enum EFilterResult : bool
{
ALLOW_MESSAGE,
DROP_MESSAGE,
};
virtual EFilterResult FilterMessage(CNetworkSerializerPB*, google::protobuf::Message*, CNetChan*) = 0;
}
А еще есть CGameMessages через которые можно фильтровать. Весь трафик вальв можно фильтровать без хуков. Листнеры онли. Включая GC.если кому-то надо,
CNetChan::InstallMessageFilter(INetworkMessageProcessingPreFilter *)
только она не ниже а выше на две(69 индекс) PostReceivedNetMsg
Посмотреть вложение 277294
C++:class INetworkMessageProcessingPreFilter { enum EFilterResult : bool { ALLOW_MESSAGE, DROP_MESSAGE, }; virtual EFilterResult FilterMessage(CNetworkSerializerPB*, google::protobuf::Message*, CNetChan*) = 0; }
template<typename T = void>
static T* GetInterface(const char* dllName, const char* interfaceName) {
auto CreateInterface = GetExport(dllName, "CreateInterface");
return (T*)CreateInterface(interfaceName, nullptr);
}
static auto networksystemMgr = GetInterface <VClass>("networksystem.dll", "CNetChan");
networksystemMgr ->GetVFunc< 69 >()
===================
HERE IS MY VCLASS
===================
public:
virtual void dummy_fn() = 0; // so that classes have a vtable
template<typename T>
T&Field(int offset) const {
if (!IsValidReadPtr((uintptr_t)this + offset))
throw "VClass::Field access violation";
return [I](T[/I])((uintptr_t)this + offset);
}
template<typename T>
T Member(int offset/[I], T defaultValue = T{}[/I]/) const {
if (!IsValidReadPtr((uintptr_t)this + offset))
return T{};
return [I](T[/I])((uintptr_t)this + offset);
}
// Gets a pointer to a type via the offset but does not dereference it
template<typename T>
T* MemberInline(int offset) const {
return (T*)((uintptr_t)this + offset);
}
Function GetVFunc(int index) const
{
return Function(([I](uintptr_t*[/I])this)[index]);
}
template<uint32_t index, typename RET = void*, typename ...T>
RET CallVFunc(T... t) {
return GetVFunc(index).Call<RET>(this, t...);
}
};
CNetChan is neither an interface nor a singleton https://yougame.biz/threads/312511/#post-3115952so i need to do something like this one
did i get everything right?cpp:template<typename T = void> static T* GetInterface(const char* dllName, const char* interfaceName) { auto CreateInterface = GetExport(dllName, "CreateInterface"); return (T*)CreateInterface(interfaceName, nullptr); } static auto networksystemMgr = GetInterface <VClass>("networksystem.dll", "CNetChan"); networksystemMgr ->GetVFunc< 69 >() =================== HERE IS MY VCLASS =================== public: virtual void dummy_fn() = 0; // so that classes have a vtable template<typename T> T&Field(int offset) const { if (!IsValidReadPtr((uintptr_t)this + offset)) throw "VClass::Field access violation"; return [I](T[/I])((uintptr_t)this + offset); } template<typename T> T Member(int offset/[I], T defaultValue = T{}[/I]/) const { if (!IsValidReadPtr((uintptr_t)this + offset)) return T{}; return [I](T[/I])((uintptr_t)this + offset); } // Gets a pointer to a type via the offset but does not dereference it template<typename T> T* MemberInline(int offset) const { return (T*)((uintptr_t)this + offset); } Function GetVFunc(int index) const { return Function(([I](uintptr_t*[/I])this)[index]); } template<uint32_t index, typename RET = void*, typename ...T> RET CallVFunc(T... t) { return GetVFunc(index).Call<RET>(this, t...); } };
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz