Вопрос PostReceivedNetMessage new idx?

Пользователь
Статус
Оффлайн
Регистрация
20 Янв 2022
Сообщения
182
Реакции[?]
40
Поинты[?]
25K
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
а чо он не экзекьютиться?
Вчера смотрел в классе CNetChan 71 индекс брякнув его на локалке, функция не вызывалась.
Бля, реально не вызывается
Я думал это я проебланил индекс, но функция-то та же
 
Пользователь
Статус
Оффлайн
Регистрация
20 Янв 2022
Сообщения
182
Реакции[?]
40
Поинты[?]
25K
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
потому что 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)
...
)
 
Ревёрсер среднего звена
Пользователь
Статус
Оффлайн
Регистрация
24 Ноя 2022
Сообщения
303
Реакции[?]
108
Поинты[?]
57K
потому что 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)
...
)
Ну я так и понял, хотел написать, что перешёл в ту сабку, что была в ПостРесиве и там всё вызывается, но не стал.
Ну ничего, как-нибудь там хукнём что-то ещё, либо забью на чит из-за этого.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Ну я так и понял, хотел написать, что перешёл в ту сабку, что была в ПостРесиве и там всё вызывается, но не стал.
Ну ничего, как-нибудь там хукнём что-то ещё, либо забью на чит из-за этого.
ну можно хукнуть что-нибудь повыше и самому in_network_queue эту обрабатывать(это linked-list-like структурка замкнутая/кольцевая(вместо нуллптр в последнем элементе там указатель на саму структуру))(там есть CNetworkSerializerPB и само сообщение), на CNetChan + 0xF0 вроде она(PostReceivedNetMessage просто в нее добавляет)
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
Либо использовать фильтры. Ниже PostRecieveeNetMsg по виртуалкам есть функция что регает листнера. Он возвращает bool (Может блочить получение опр мсг например)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
Либо использовать фильтры. Ниже PostRecieveeNetMsg по виртуалкам есть функция что регает листнера. Он возвращает bool (Может блочить получение опр мсг например)
если кому-то надо,
CNetChan::InstallMessageFilter(INetworkMessageProcessingPreFilter *)
только она не ниже а выше на две(69 индекс) PostReceivedNetMsg
1716313581635.png
C++:
class INetworkMessageProcessingPreFilter
{
    enum EFilterResult : bool
    {
        ALLOW_MESSAGE,
        DROP_MESSAGE,
    };
    virtual EFilterResult FilterMessage(CNetworkSerializerPB*, google::protobuf::Message*, CNetChan*) = 0;
}
 
🤡
Пользователь
Статус
Оффлайн
Регистрация
28 Апр 2014
Сообщения
127
Реакции[?]
163
Поинты[?]
21K
если кому-то надо,
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;
}
А еще есть CGameMessages через которые можно фильтровать. Весь трафик вальв можно фильтровать без хуков. Листнеры онли. Включая GC.
Сурс2 позволяет сделать полностью хак на листнерах и тому подобному, не знаю кто еще юзает хуки для с2.

Про индекс проебался. сорян, я уставший ласт неделю и иногда мозг вмирает полностью.
 
Начинающий
Статус
Оффлайн
Регистрация
11 Фев 2023
Сообщения
40
Реакции[?]
0
Поинты[?]
0
so i need to do something like this one

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...);
    }
};
did i get everything right?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
781
Реакции[?]
331
Поинты[?]
63K
so i need to do something like this one

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...);
    }
};
did i get everything right?
CNetChan is neither an interface nor a singleton https://yougame.biz/threads/312511/#post-3115952
and the index is currently 67 not 69
 
Сверху Снизу