feat(GetLabelText): Added hook for getlabeltext

This commit is contained in:
Yimura 2021-02-04 18:39:20 +01:00
parent 35c2e9f41d
commit 7d077dc9f7
No known key found for this signature in database
GPG Key ID: 3D8FF4397E768682
9 changed files with 87 additions and 1 deletions

View File

@ -0,0 +1,35 @@
#include "custom_text.hpp"
namespace big
{
custom_text::custom_text()
{
g_custom_text = this;
}
custom_text::~custom_text()
{
g_custom_text = nullptr;
}
void custom_text::add_text(Hash hash, const char* text)
{
auto size = strlen(text) + 1;
auto buffer = std::make_unique<char[]>(size);
std::copy_n(text, size, buffer.get());
this->m_text_map.emplace(hash, std::move(buffer));
}
const char* custom_text::get_text(Hash hash)
{
if (auto it = this->m_text_map.find(hash); it != m_text_map.end())
return it->second.get();
return nullptr;
}
void custom_text::remove_text(Hash hash)
{
this->m_text_map.erase(hash);
}
}

View File

@ -0,0 +1,20 @@
#pragma once
namespace big
{
class custom_text
{
public:
explicit custom_text();
~custom_text();
void add_text(Hash hash, const char* text);
const char* get_text(Hash hash);
void remove_text(Hash hash);
private:
std::unordered_map<Hash, std::unique_ptr<char[]>> m_text_map;
};
inline custom_text* g_custom_text{};
}

View File

@ -13,6 +13,7 @@ namespace big::functions
using error_screen = void(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background); using error_screen = void(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background);
using increment_stat_event = bool(uint64_t net_event_struct, int64_t sender, int64_t a3); using increment_stat_event = bool(uint64_t net_event_struct, int64_t sender, int64_t a3);
using get_event_data = bool(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount); using get_event_data = bool(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount);
using get_label_text = const char*(void* unk, const char* label);
using get_player_name = char*(Player player); using get_player_name = char*(Player player);
using get_net_player = int(Player player); using get_net_player = int(Player player);
using script_event_handler = bool(void* events, CNetGamePlayer* sourcePlayer, CNetGamePlayer* targetPlayer); using script_event_handler = bool(void* events, CNetGamePlayer* sourcePlayer, CNetGamePlayer* targetPlayer);

View File

@ -40,6 +40,7 @@ namespace big
m_convert_thread_to_fiber_hook("ConvertThreadToFiber", memory::module("kernel32.dll").get_export("ConvertThreadToFiber").as<void*>(), &hooks::convert_thread_to_fiber), m_convert_thread_to_fiber_hook("ConvertThreadToFiber", memory::module("kernel32.dll").get_export("ConvertThreadToFiber").as<void*>(), &hooks::convert_thread_to_fiber),
m_get_event_data("Get Event Data", g_pointers->m_get_event_data, &hooks::get_event_data), m_get_event_data("Get Event Data", g_pointers->m_get_event_data, &hooks::get_event_data),
m_get_label_text("Get Label Text", g_pointers->m_get_label_text, &hooks::get_label_text),
m_error_screen_hook("Disable Warning/Error Screen", g_pointers->m_error_screen, &hooks::error_screen), m_error_screen_hook("Disable Warning/Error Screen", g_pointers->m_error_screen, &hooks::error_screen),
m_increment_stat_hook("Increment Stat Event", g_pointers->m_increment_stat_event, &hooks::increment_stat_event), m_increment_stat_hook("Increment Stat Event", g_pointers->m_increment_stat_event, &hooks::increment_stat_event),
m_script_event_hook("Script Event Handler", g_pointers->m_script_event_handler, &hooks::script_event_handler), m_script_event_hook("Script Event Handler", g_pointers->m_script_event_handler, &hooks::script_event_handler),
@ -70,6 +71,7 @@ namespace big
// New hooks enable // New hooks enable
m_get_event_data.enable(); m_get_event_data.enable();
m_get_label_text.enable();
m_error_screen_hook.enable(); m_error_screen_hook.enable();
m_increment_stat_hook.enable(); m_increment_stat_hook.enable();
m_script_event_hook.enable(); m_script_event_hook.enable();
@ -91,6 +93,7 @@ namespace big
// New hooks disable // New hooks disable
m_get_event_data.disable(); m_get_event_data.disable();
m_get_label_text.disable();
m_error_screen_hook.disable(); m_error_screen_hook.disable();
m_increment_stat_hook.disable(); m_increment_stat_hook.disable();
m_script_event_hook.disable(); m_script_event_hook.disable();

View File

@ -23,6 +23,7 @@ namespace big
// New Hook Definitions // New Hook Definitions
static bool get_event_data(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount); static bool get_event_data(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount);
static const char* get_label_text(void* unk, const char* label);
static void error_screen(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background); static void error_screen(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background);
static bool increment_stat_event(uint64_t net_event_struct, CNetGamePlayer* sender, int64_t a3); static bool increment_stat_event(uint64_t net_event_struct, CNetGamePlayer* sender, int64_t a3);
static bool script_event_handler(std::int64_t NetEventStruct, CNetGamePlayer* net_game_player); static bool script_event_handler(std::int64_t NetEventStruct, CNetGamePlayer* net_game_player);
@ -58,6 +59,7 @@ namespace big
// New Detour Hook Definitions // New Detour Hook Definitions
detour_hook m_get_event_data; detour_hook m_get_event_data;
detour_hook m_get_label_text;
detour_hook m_error_screen_hook; detour_hook m_error_screen_hook;
detour_hook m_increment_stat_hook; detour_hook m_increment_stat_hook;
detour_hook m_script_event_hook; detour_hook m_script_event_hook;

View File

@ -0,0 +1,15 @@
#include "features/custom_text.hpp"
#include "hooking.hpp"
#include "natives.hpp"
namespace big
{
const char* hooks::get_label_text(void* unk, const char* label)
{
if (g_running)
if (auto text = g_custom_text->get_text(rage::joaat(label)))
return text;
return g_hooking->m_get_label_text.get_original<decltype(&get_label_text)>()(unk, label);
}
}

View File

@ -1,5 +1,6 @@
#include "common.hpp" #include "common.hpp"
#include "features.hpp" #include "features.hpp"
#include "features/custom_text.hpp"
#include "fiber_pool.hpp" #include "fiber_pool.hpp"
#include "gui.hpp" #include "gui.hpp"
#include "logger.hpp" #include "logger.hpp"
@ -45,6 +46,9 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
auto hooking_instance = std::make_unique<hooking>(); auto hooking_instance = std::make_unique<hooking>();
LOG(INFO) << "Hooking initialized."; LOG(INFO) << "Hooking initialized.";
auto custom_text_instance = std::make_unique<custom_text>();
LOG(INFO) << "Custom Text Initialized.";
g_settings.load(); g_settings.load();
LOG(INFO) << "Settings Loaded."; LOG(INFO) << "Settings Loaded.";

View File

@ -133,10 +133,15 @@ namespace big
m_ptr_to_handle = ptr.as<decltype(m_ptr_to_handle)>(); m_ptr_to_handle = ptr.as<decltype(m_ptr_to_handle)>();
}); });
main_batch.add("Send Info To Lobby", "44 8D 47 78 48 8D 54 24 ? 48 8B CB E8", [this](memory::handle ptr) main_batch.add("Send Net Info To Lobby", "44 8D 47 78 48 8D 54 24 ? 48 8B CB E8", [this](memory::handle ptr)
{ {
m_send_net_info_to_lobby = ptr.add(13).rip().as<PVOID>(); m_send_net_info_to_lobby = ptr.add(13).rip().as<PVOID>();
}); });
main_batch.add("Get Label Text", "75 ? E8 ? ? ? ? 8B 0D ? ? ? ? 65 48 8B 04 25 ? ? ? ? BA ? ? ? ? 48 8B 04 C8 8B 0C 02 D1 E9", [this](memory::handle ptr)
{
m_get_label_text = ptr.sub(19).as<decltype(m_get_label_text)>();
});
main_batch.run(memory::module(nullptr)); main_batch.run(memory::module(nullptr));

View File

@ -40,6 +40,7 @@ namespace big
functions::error_screen* m_error_screen{}; functions::error_screen* m_error_screen{};
functions::get_event_data* m_get_event_data{}; functions::get_event_data* m_get_event_data{};
functions::get_label_text* m_get_label_text{};
functions::get_player_name* m_get_player_name{}; functions::get_player_name* m_get_player_name{};
functions::get_net_player* m_get_net_game_player{}; functions::get_net_player* m_get_net_game_player{};
functions::increment_stat_event* m_increment_stat_event{}; functions::increment_stat_event* m_increment_stat_event{};