diff --git a/memory-external/memory-external.vcxproj b/memory-external/memory-external.vcxproj
index 9f314e2..7aeb126 100644
--- a/memory-external/memory-external.vcxproj
+++ b/memory-external/memory-external.vcxproj
@@ -177,12 +177,14 @@
NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
true
stdcpp20
+ true
+ MultiThreaded
Console
true
true
- true
+ false
gdiplus.lib;wininet.lib;%(AdditionalDependencies)
@@ -195,12 +197,14 @@
NDEBUG;_UC;_CONSOLE;%(PreprocessorDefinitions)
true
stdcpp20
+ MultiThreaded
+ true
Console
true
true
- true
+ false
gdiplus.lib;wininet.lib;%(AdditionalDependencies)
diff --git a/memory-external/memory/memory.hpp b/memory-external/memory/memory.hpp
index baf8bd0..8704b50 100644
--- a/memory-external/memory/memory.hpp
+++ b/memory-external/memory/memory.hpp
@@ -9,6 +9,21 @@
#include
#include
+typedef NTSTATUS(WINAPI* pNtReadVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToRead, PULONG NumberOfBytesRead);
+typedef NTSTATUS(WINAPI* pNtWriteVirtualMemory)(HANDLE ProcessHandle, PVOID BaseAddress, PVOID Buffer, ULONG NumberOfBytesToWrite, PULONG NumberOfBytesWritten);
+
+class pMemory {
+
+public:
+ pMemory() {
+ pfnNtReadVirtualMemory = (pNtReadVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtReadVirtualMemory");
+ pfnNtWriteVirtualMemory = (pNtWriteVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtWriteVirtualMemory");
+ }
+
+ pNtReadVirtualMemory pfnNtReadVirtualMemory;
+ pNtWriteVirtualMemory pfnNtWriteVirtualMemory;
+};
+
struct ProcessModule
{
uintptr_t base, size;
@@ -50,7 +65,9 @@ public:
bool read_raw(uintptr_t address, void* buffer, size_t size)
{
SIZE_T bytesRead;
- if (ReadProcessMemory(this->handle_, reinterpret_cast(address), buffer, size, &bytesRead))
+ pMemory cMemory;
+
+ if (cMemory.pfnNtReadVirtualMemory(this->handle_, (PVOID)(address), buffer, static_cast(size), (PULONG)&bytesRead))
{
return bytesRead == size;
}
@@ -60,20 +77,24 @@ public:
template
void write(uintptr_t address, T value)
{
- WriteProcessMemory(handle_, (void*)address, &value, sizeof(T), 0);
+ pMemory cMemory;
+ cMemory.pfnNtWriteVirtualMemory(handle_, (void*)address, &value, sizeof(T), 0);
}
template
T read(uintptr_t address)
{
T buffer{};
- ReadProcessMemory(handle_, (void*)address, &buffer, sizeof(T), 0);
+ pMemory cMemory;
+
+ cMemory.pfnNtReadVirtualMemory(handle_, (void*)address, &buffer, sizeof(T), 0);
return buffer;
}
void write_bytes(uintptr_t addr, std::vector patch)
{
- WriteProcessMemory(handle_, (void*)addr, &patch[0], patch.size(), 0);
+ pMemory cMemory;
+ cMemory.pfnNtWriteVirtualMemory(handle_, (void*)addr, &patch[0], patch.size(), 0);
}
uintptr_t read_multi_address(uintptr_t ptr, std::vector offsets)
diff --git a/offsets/update_offsets.py b/offsets/update_offsets.py
index 568d86b..91baf31 100644
--- a/offsets/update_offsets.py
+++ b/offsets/update_offsets.py
@@ -33,10 +33,10 @@ if dest_data["build_number"] == int(build_number):
dest_data["build_number"] = int(build_number)
-dest_data["dwBuildNumber"] = source_data["Engine2Dll"]["data"]["dwBuildNumber"]["value"]
-dest_data["dwLocalPlayer"] = source_data["ClientDll"]["data"]["dwLocalPlayerPawn"]["value"]
-dest_data["dwEntityList"] = source_data["ClientDll"]["data"]["dwEntityList"]["value"]
-dest_data["dwViewMatrix"] = source_data["ClientDll"]["data"]["dwViewMatrix"]["value"]
+dest_data["dwBuildNumber"] = source_data["engine2_dll"]["data"]["dwBuildNumber"]["value"]
+dest_data["dwLocalPlayer"] = source_data["client_dll"]["data"]["dwLocalPlayerPawn"]["value"]
+dest_data["dwEntityList"] = source_data["client_dll"]["data"]["dwEntityList"]["value"]
+dest_data["dwViewMatrix"] = source_data["client_dll"]["data"]["dwViewMatrix"]["value"]
with open(dest_path, 'w') as dest_file:
json.dump(dest_data, dest_file, indent=4)