Use ASLR patched binaries

This commit is contained in:
quaK 2022-05-28 13:12:29 +03:00
parent da8696132b
commit d1aa645033
2 changed files with 38 additions and 4 deletions

View File

@ -60,9 +60,9 @@ namespace game_module
DWORD __stdcall get_module_file_name_a(HMODULE hmodule, const LPSTR filename, const DWORD size)
{
if (!hmodule)
if (!hmodule || utils::nt::library(hmodule) == get_game_module())
{
hmodule = get_game_module();
hmodule = get_host_module();
}
return file_name_a_hook.invoke<DWORD>(hmodule, filename, size);
@ -70,9 +70,9 @@ namespace game_module
DWORD __stdcall get_module_file_name_w(HMODULE hmodule, const LPWSTR filename, const DWORD size)
{
if (!hmodule)
if (!hmodule || utils::nt::library(hmodule) == get_game_module())
{
hmodule = get_game_module();
hmodule = get_host_module();
}
return file_name_w_hook.invoke<DWORD>(hmodule, filename, size);

View File

@ -40,6 +40,38 @@ launcher::mode detect_mode_from_arguments()
return launcher::mode::none;
}
bool apply_dslr_patch(std::string* data)
{
if (data->size() < 0x1EE || (data->at(0x1EE) != static_cast<char>(0x60) && data->at(0x1EE) != static_cast<char>(0x20)))
{
// what the fuck is wrong with this binary data?
return false;
}
data->at(0x1EE) = static_cast<char>(0x20);
return true;
}
void get_aslr_patched_binary(std::string* binary, std::string* data)
{
std::string patched_binary = "h1-mod\\" + *binary;
if (!apply_dslr_patch(data))
{
throw std::runtime_error(utils::string::va(
"Could not create aslr patched binary!\n(%s)",
*binary->data()
));
}
if (!utils::io::file_exists(patched_binary))
{
utils::io::write_file(patched_binary, *data, false);
}
*binary = patched_binary;
}
FARPROC load_binary(const launcher::mode mode, uint64_t* base_address)
{
loader loader;
@ -87,6 +119,8 @@ FARPROC load_binary(const launcher::mode mode, uint64_t* base_address)
binary.data()));
}
get_aslr_patched_binary(&binary, &data);
#ifdef INJECT_HOST_AS_LIB
return loader.load_library(binary, base_address);
#else