2023-11-22 22:13:53 +01:00

124 lines
2.4 KiB
C++

#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include "game/game.hpp"
#include "console.hpp"
#include "game_module.hpp"
#include <utils/io.hpp>
#include <utils/hook.hpp>
namespace tls
{
namespace
{
DWORD get_tls_index()
{
const auto game = game_module::get_game_module();
const auto game_tls = reinterpret_cast<PIMAGE_TLS_DIRECTORY>(game.get_ptr() + game.get_optional_header()
->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress);
return *reinterpret_cast<DWORD*>(game_tls->AddressOfIndex);
}
void get_tls_stub(utils::hook::assembler& a)
{
std::uint8_t bytes[] = {0x65, 0x48, 0x8B, 0x04, 0x25, 0x58, 0x00, 0x00, 0x00}; // mov rax, gs:58h
a.embed(bytes, sizeof(bytes));
a.add(rax, get_tls_index() * 8);
a.ret();
}
}
class component final : public component_interface
{
public:
void post_unpack() override
{
// Add tls_index * 8 offset to tls access where it's missing (it was optimized away in the bnet code)
std::vector<std::size_t> address_list =
{
0x14004614C,
0x140047A85,
0x140048B4C,
0x140049A04,
0x140049DDE,
0x140049FA9,
0x14004A491,
0x14004A879,
0x14004AB34,
0x14004AFE0,
0x14004B305,
0x14004B846,
0x14004BC34,
0x14004C024,
0x14004C2CC,
0x14004C94A,
0x14004CBA1,
0x1400619E9,
0x1400A29CB,
0x1400A2AF7,
0x1400A2C23,
0x1400A2D4F,
0x1400A4A9F,
0x1400A4EC5,
0x1400A50CB,
0x1400A53A8,
0x1400A5618,
0x1400A58A2,
0x1400A5B08,
0x1400A5D52,
0x1400A5F44,
0x1400A9B94,
0x1400AA126,
0x1400AA8D0,
0x1400AACC6,
0x1400AAF87,
0x1400AB230,
0x1400AB565,
0x1400AB822,
0x1400ABA43,
0x1400ABCC9,
0x1400ABED1,
0x1400AC141,
0x1400AC65B,
0x1400AC833,
0x1400ACA66,
0x1400ACE27,
0x1400AD048,
0x1400AD51B,
0x1400AD719,
0x1400ADA2C,
0x1400ADCD7,
0x1400AE1B9,
0x1400AE722,
0x1400C795C,
0x1400E3C93,
0x1400E4165,
0x1400E43F7,
0x1400E46A7,
0x1400F4951,
0x1400F4BA6,
0x1400F4DFF,
0x140100938,
0x140193761,
0x1401DA392,
0x1401FEA2A,
0x1402039BB,
0x14020C5A3,
};
const auto tls_stub_ptr = utils::hook::assemble(get_tls_stub);
for (const auto& address : address_list)
{
utils::hook::nop(address, 0x9);
utils::hook::far_call<BASE_ADDRESS>(address, tls_stub_ptr);
}
}
};
}
REGISTER_COMPONENT(tls::component)