Skip to content

Commit

Permalink
Use signature utils
Browse files Browse the repository at this point in the history
  • Loading branch information
alicealys committed Mar 26, 2022
1 parent 2ab7caa commit c1212d6
Show file tree
Hide file tree
Showing 13 changed files with 224 additions and 7,518 deletions.
2 changes: 1 addition & 1 deletion src/component/scripting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ namespace scripting
const auto file_id = atoi(filename);
if (file_id)
{
current_file = scripting::file_list[file_id];
current_file = scripting::find_file(file_id);
}

process_script_hook.invoke<void>(filename);
Expand Down
95 changes: 95 additions & 0 deletions src/component/signatures.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#include <stdinc.hpp>
#include "signatures.hpp"
#include <utils/hook.hpp>

#define PAYLOAD_SIZE 0x20000000

namespace signatures
{
size_t load_image_size()
{
MODULEINFO info{};
GetModuleInformation(GetCurrentProcess(),
GetModuleHandle("plutonium-bootstrapper-win32.exe"), &info, sizeof(MODULEINFO));
return info.SizeOfImage;
}

size_t get_image_size()
{
static const auto image_size = load_image_size();
return image_size;
}

void load_function_tables()
{
static const auto ptr = *reinterpret_cast<size_t*>(0x56CBDC + 0x1) + 0x56CBDC + 0x5;
static const auto function_table = *reinterpret_cast<size_t*>(0x56C8EB + 0x3);
static const auto method_table = *reinterpret_cast<size_t*>(ptr + 0xA);

game::plutonium::function_table.set(function_table);
game::plutonium::method_table.set(method_table);
}

size_t find_string_ptr(const std::string& string)
{
const char* string_ptr = nullptr;
std::string mask(string.size(), 'x');
utils::hook::signature signature(PAYLOAD_SIZE, get_image_size() - PAYLOAD_SIZE);

signature.add({
string,
mask,
[&](char* address)
{
string_ptr = address;
}
});

signature.process();
return reinterpret_cast<size_t>(string_ptr);
}

size_t find_string_ref(const std::string& string)
{
char bytes[4] = {0};
const auto string_ptr = find_string_ptr(string);
memcpy(bytes, &string_ptr, sizeof(size_t));
return find_string_ptr(bytes);
}

bool process_maps()
{
const auto string_ref = find_string_ref("Couldn't resolve builtin function id for name '%s'!");
if (!string_ref)
{
return false;
}

const auto map_ptr = *reinterpret_cast<size_t*>(string_ref - 0x3A);
game::plutonium::function_map_rev.set(map_ptr);
game::plutonium::method_map_rev.set(map_ptr + 0x20);
game::plutonium::file_map_rev.set(map_ptr + 0x40);
game::plutonium::token_map_rev.set(map_ptr + 0x60);
return true;
}

bool process_printf()
{
const auto string_ref = find_string_ref("A critical exception occured!\n");
if (!string_ref)
{
return false;
}

const auto offset = *reinterpret_cast<size_t*>(string_ref + 5);
game::plutonium::printf.set(string_ref + 4 + 5 + offset);
return true;
}

bool process()
{
load_function_tables();
process_printf();
return process_maps();
}
}
6 changes: 6 additions & 0 deletions src/component/signatures.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#pragma once

namespace signatures
{
bool process();
}
13 changes: 9 additions & 4 deletions src/dllmain.cpp
Original file line number Diff line number Diff line change
@@ -1,22 +1,27 @@
#include <stdinc.hpp>
#include "loader/component_loader.hpp"

#include "component/signatures.hpp"

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
const auto value = *reinterpret_cast<DWORD*>(0x21B00000);
if (value != 0x64AA1902)
if (!signatures::process())
{
MessageBoxA(NULL,
"This version of iw5-script is outdated.\n" \
"Download the latest dll from here: https://github.com/fedddddd/iw5-script/releases",
"Download the latest dll from here: https://github.com/fedddddd/iw5-gsc-utils/releases",
"ERROR", MB_ICONERROR);

return FALSE;
}

utils::hook::jump(reinterpret_cast<uintptr_t>(&printf), game::plutonium::printf);
if (game::plutonium::printf.get() != nullptr)
{
utils::hook::jump(reinterpret_cast<uintptr_t>(&printf), game::plutonium::printf);
}

component_loader::post_unpack();
}

Expand Down
5 changes: 5 additions & 0 deletions src/game/game.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ namespace game
return dedi_;
}

void set(const size_t dedi)
{
this->dedi_ = reinterpret_cast<T*>(dedi);
}

operator T* () const
{
return this->get();
Expand Down
Loading

0 comments on commit c1212d6

Please sign in to comment.