Skip to content

Commit

Permalink
Compatability patch
Browse files Browse the repository at this point in the history
  • Loading branch information
yobson1 committed May 14, 2023
1 parent f8278d1 commit 6d91f7a
Show file tree
Hide file tree
Showing 10 changed files with 152 additions and 93 deletions.
52 changes: 51 additions & 1 deletion shared/sdk/Memory.cpp
Expand Up @@ -87,5 +87,55 @@ void deallocate(void* ptr) {

deallocate_fn(ptr);
}
BOOL IsBadMemPtr(BOOL write, void* ptr, size_t size) {
MEMORY_BASIC_INFORMATION mbi;
BOOL ok;
DWORD mask;
BYTE* p = (BYTE*)ptr;
BYTE* maxp = p + size;
BYTE* regend = NULL;

if (size == 0) {
return FALSE;
}

if (p == NULL) {
return TRUE;
}

if (write == FALSE) {
mask = PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY;
} else {
mask = PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY;
}

do {
if (p == ptr || p == regend) {
if (VirtualQuery((LPCVOID)p, &mbi, sizeof(mbi)) == 0) {
return TRUE;
} else {
regend = ((BYTE*)mbi.BaseAddress + mbi.RegionSize);
}
}

ok = (mbi.Protect & mask) != 0;

if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) {
ok = FALSE;
}

if (!ok) {
return TRUE;
}

if (maxp <= regend) {
return FALSE;
} else if (maxp > regend) {
p = regend;
}
} while (p < maxp);

return FALSE;
}
}
}
}
6 changes: 5 additions & 1 deletion shared/sdk/Memory.hpp
@@ -1,8 +1,12 @@
#include <Windows.h>

#pragma once

namespace sdk {
namespace memory {
void* allocate(size_t size);
void deallocate(void* ptr);
BOOL IsBadMemPtr(BOOL write, void* ptr, size_t size);

}
}
}
11 changes: 5 additions & 6 deletions shared/sdk/REContext.cpp
@@ -1,6 +1,7 @@
#include <shared_mutex>
#include <spdlog/spdlog.h>

#include "Memory.hpp"
#include "utility/Scan.hpp"
#include "utility/Module.hpp"

Expand Down Expand Up @@ -100,7 +101,7 @@ namespace sdk {

std::optional<Address> ref{};
const CtxPattern* context_pattern{nullptr};

for (const auto& pattern : patterns) {
ref = {};
references.clear();
Expand Down Expand Up @@ -136,7 +137,7 @@ namespace sdk {
for (auto i = 0; i < 0x20000; i += sizeof(void*)) {
auto ptr = *(sdk::RETypeDB**)((uintptr_t)*s_global_context + i);

if (ptr == nullptr || IsBadReadPtr(ptr, sizeof(void*)) || ((uintptr_t)ptr & (sizeof(void*) - 1)) != 0) {
if (ptr == nullptr || sdk::memory::IsBadMemPtr(false, ptr, sizeof(void*)) || ((uintptr_t)ptr & (sizeof(void*) - 1)) != 0) {
continue;
}

Expand Down Expand Up @@ -231,11 +232,11 @@ namespace sdk {
return;
}
}

std::unique_lock _{s_pointers_mtx};

spdlog::info("Locating funcs");

// Version 1
//auto ref = utility::scan(g_framework->getModule().as<HMODULE>(), "48 83 78 18 00 74 ? 48 89 D9 E8 ? ? ? ? 48 89 D9 E8 ? ? ? ?");

Expand Down Expand Up @@ -517,5 +518,3 @@ namespace sdk {
return VM::get_invoke_table();
}
}


11 changes: 6 additions & 5 deletions shared/sdk/REGlobals.cpp
Expand Up @@ -2,6 +2,7 @@

#include <spdlog/spdlog.h>

#include "Memory.hpp"
#include "utility/Scan.hpp"
#include "utility/Module.hpp"

Expand Down Expand Up @@ -44,7 +45,7 @@ REGlobals::REGlobals() {
continue;
}

if (IsBadReadPtr((void*)ptr, sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, (void*)ptr, sizeof(void*))) {
continue;
}

Expand All @@ -53,7 +54,7 @@ REGlobals::REGlobals() {
if (m_objects.find(obj_ptr) != m_objects.end()) {
continue;
}

m_objects.insert(obj_ptr);
m_object_list.push_back(obj_ptr);
}
Expand Down Expand Up @@ -108,7 +109,7 @@ std::vector<REManagedObject*> REGlobals::get_objects() {

if (!m_object_list.empty()) {
for (auto obj_ptr : m_object_list) {
if (*obj_ptr != nullptr) {
if (*obj_ptr != nullptr && !sdk::memory::IsBadMemPtr(false, *obj_ptr, sizeof(void*))) {
out.push_back(*obj_ptr);
}
}
Expand Down Expand Up @@ -209,7 +210,7 @@ void REGlobals::refresh_natives() {
if (t == nullptr) {
continue;
}

if (!utility::re_type::is_singleton(t)) {
continue;
}
Expand All @@ -232,7 +233,7 @@ void REGlobals::refresh_map() {
continue;
}

if (IsBadReadPtr(obj, sizeof(REManagedObject))) {
if (sdk::memory::IsBadMemPtr(false, obj, sizeof(REManagedObject))) {
continue;
}

Expand Down
35 changes: 18 additions & 17 deletions shared/sdk/REManagedObject.cpp
@@ -1,5 +1,6 @@
#include <spdlog/spdlog.h>

#include "Memory.hpp"
#include "utility/Scan.hpp"
#include "utility/Module.hpp"

Expand All @@ -12,7 +13,7 @@ void add_ref(REManagedObject* object) {
if (object == nullptr) {
return;
}

static void (*add_ref_func)(::REManagedObject*) = nullptr;

if (add_ref_func == nullptr) {
Expand Down Expand Up @@ -128,7 +129,7 @@ std::vector<::REManagedObject*> deserialize(const uint8_t* data, size_t size, bo
deserialize_func(nullptr, arr, data, size);

std::vector<::REManagedObject*> result{};

for (auto object : arr) {
if (object != nullptr) {
if (add_references) {
Expand Down Expand Up @@ -194,19 +195,19 @@ bool is_managed_object(Address address) {
return false;
}

if (IsBadReadPtr(address.ptr(), sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, address.ptr(), sizeof(void*))) {
return false;
}

auto object = address.as<::REManagedObject*>();

if (object->info == nullptr || IsBadReadPtr(object->info, sizeof(void*))) {
if (object->info == nullptr || sdk::memory::IsBadMemPtr(false, object->info, sizeof(void*))) {
return false;
}

auto class_info = object->info->classInfo;

if (class_info == nullptr || IsBadReadPtr(class_info, sizeof(void*))) {
if (class_info == nullptr || sdk::memory::IsBadMemPtr(false, class_info, sizeof(void*))) {
return false;
}

Expand All @@ -215,7 +216,7 @@ bool is_managed_object(Address address) {

if ((uintptr_t)td->managed_vt != (uintptr_t)object->info) {
// This allows for cases when a vtable hook is being used to replace this pointer.
if (IsBadReadPtr(td->managed_vt, sizeof(void*)) || *(sdk::RETypeDefinition**)td->managed_vt != td) {
if (sdk::memory::IsBadMemPtr(false, td->managed_vt, sizeof(void*)) || *(sdk::RETypeDefinition**)td->managed_vt != td) {
return false;
}
}
Expand All @@ -224,17 +225,17 @@ bool is_managed_object(Address address) {
return false;
}

if (IsBadReadPtr(td->type, sizeof(REType)) || td->type->name == nullptr) {
if (sdk::memory::IsBadMemPtr(false, td->type, sizeof(REType)) || td->type->name == nullptr) {
return false;
}

if (IsBadReadPtr(td->type->name, sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, td->type->name, sizeof(void*))) {
return false;
}
#elif TDB_VER > 49
if (class_info->parentInfo != object->info) {
// This allows for cases when a vtable hook is being used to replace this pointer.
if (IsBadReadPtr(class_info->parentInfo, sizeof(void*)) || class_info->parentInfo->classInfo != class_info) {
if (sdk::memory::IsBadMemPtr(false, class_info->parentInfo, sizeof(void*)) || class_info->parentInfo->classInfo != class_info) {
return false;
}
}
Expand All @@ -243,11 +244,11 @@ bool is_managed_object(Address address) {
return false;
}

if (IsBadReadPtr(class_info->type, sizeof(REType)) || class_info->type->name == nullptr) {
if (sdk::memory::IsBadMemPtr(false, class_info->type, sizeof(REType)) || class_info->type->name == nullptr) {
return false;
}

if (IsBadReadPtr(class_info->type->name, sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, class_info->type->name, sizeof(void*))) {
return false;
}
#else
Expand All @@ -257,25 +258,25 @@ bool is_managed_object(Address address) {
return false;
}

if (IsBadReadPtr(info->type, sizeof(REType)) || info->type->name == nullptr) {
if (sdk::memory::IsBadMemPtr(false, info->type, sizeof(REType)) || info->type->name == nullptr) {
return false;
}

if (IsBadReadPtr(info->type->name, sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, info->type->name, sizeof(void*))) {
return false;
}

if (info->type->super != nullptr && IsBadReadPtr(info->type->super, sizeof(REType))) {
if (info->type->super != nullptr && sdk::memory::IsBadMemPtr(false, info->type->super, sizeof(REType))) {
return false;
}

if (info->type->classInfo != nullptr && IsBadReadPtr(info->type->classInfo, sizeof(REObjectInfo))) {
if (info->type->classInfo != nullptr && sdk::memory::IsBadMemPtr(false, info->type->classInfo, sizeof(REObjectInfo))) {
return false;
}

static auto vm = sdk::VM::get();
const auto tdef = (sdk::RETypeDefinition*)info->classInfo;

if (&vm->types[tdef->get_index()] != (regenny::via::clr::VM::Type*)object->info) {
return false;
}
Expand Down Expand Up @@ -433,7 +434,7 @@ uint32_t get_size(::REManagedObject* object) {
default:
break;
}

return size;
}

Expand Down
9 changes: 5 additions & 4 deletions shared/sdk/RETypes.cpp
@@ -1,5 +1,6 @@
#include <spdlog/spdlog.h>

#include "Memory.hpp"
#include "utility/Scan.hpp"
#include "utility/Module.hpp"

Expand Down Expand Up @@ -77,7 +78,7 @@ RETypes::RETypes() {
spdlog::info("Could not find alternative reference for types, filling types from TDB instead");
fill_types_from_tdb();
}

return;
}

Expand Down Expand Up @@ -110,7 +111,7 @@ RETypes::RETypes() {
}

spdlog::info("Initial ref: {:x}", (uintptr_t)*ref);

m_raw_types = (TypeList*)(utility::calculate_absolute(*ref + types_offset));
spdlog::info("Initial TypeList: {:x}", (uintptr_t)m_raw_types);

Expand Down Expand Up @@ -208,7 +209,7 @@ void RETypes::fill_types_from_tdb() {
if (tdb == nullptr) {
return;
}

spdlog::info("Filling types from TDB");

for (auto i = 0; i < tdb->get_num_types(); ++i) {
Expand Down Expand Up @@ -241,7 +242,7 @@ void RETypes::refresh_map() {
for (auto i = 0; i < typeList.numAllocated; ++i) {
auto t = (*typeList.data)[i];

if (t == nullptr || IsBadReadPtr(t, sizeof(REType)) || ((uintptr_t)t & (sizeof(void*) - 1)) != 0) {
if (t == nullptr || sdk::memory::IsBadMemPtr(false, t, sizeof(REType)) || ((uintptr_t)t & (sizeof(void*) - 1)) != 0) {
continue;
}

Expand Down
12 changes: 7 additions & 5 deletions shared/sdk/REVTableHook.cpp
Expand Up @@ -4,6 +4,8 @@

#include "REVTableHook.hpp"

#include "Memory.hpp"

namespace sdk {
REVTableHook::REVTableHook(::REManagedObject* target)
: m_object{target}
Expand Down Expand Up @@ -43,7 +45,7 @@ uint32_t REVTableHook::calculate_vtable_size(void** vtable) const {
uint32_t size{0};

for (auto i = 0; i < 512; ++i) {
if (IsBadReadPtr(vtable + i, sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, vtable + i, sizeof(void*))) {
return size;
}

Expand All @@ -66,7 +68,7 @@ bool REVTableHook::hook() {
if (m_original_object_info == nullptr) {
return false;
}

m_original_vtable = *(void***)((uintptr_t)m_original_object_info - 0x10);

if (m_original_vtable == nullptr) {
Expand All @@ -80,7 +82,7 @@ bool REVTableHook::hook() {
for (uint32_t i = 0; i < 0x1000; i += sizeof(void*)) {
const auto ptr = (void**)((uintptr_t)m_original_object_info - i);

if (IsBadReadPtr(ptr, sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, ptr, sizeof(void*))) {
break;
}

Expand All @@ -96,7 +98,7 @@ bool REVTableHook::hook() {
for (uint32_t i = 0; i < 0x1000; i += sizeof(void*)) {
const auto ptr = (void**)((uintptr_t)m_original_object_info + i);

if (IsBadReadPtr(ptr, sizeof(void*))) {
if (sdk::memory::IsBadMemPtr(false, ptr, sizeof(void*))) {
break;
}

Expand Down Expand Up @@ -154,4 +156,4 @@ bool REVTableHook::hook_method(uint32_t index, void* destination) {
m_new_vtable[index] = destination;
return true;
}
}
}

0 comments on commit 6d91f7a

Please sign in to comment.