Skip to content

Commit 4040a0a

Browse files
committed
refactor: use Memory::Patch
still a pretty weird way to do this but at least the original data isn't hardcoded (except in the sigs) also a few other miscellaneous changes
1 parent 401e6a4 commit 4040a0a

File tree

5 files changed

+27
-30
lines changed

5 files changed

+27
-30
lines changed

src/Modules/Engine.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,9 @@ DETOUR(Engine::PurgeUnusedModels) {
468468
return result;
469469
}
470470

471+
Memory::Patch *g_ReadCustomDataPatch = nullptr;
472+
Memory::Patch *g_ReadConsoleCommandPatch = nullptr;
473+
471474
DETOUR(Engine::ReadCustomData, int *callbackIndex, char **data) {
472475
auto size = Engine::ReadCustomData(thisptr, callbackIndex, data);
473476
if (callbackIndex && data && *callbackIndex == 0 && size > 8) {
@@ -1127,20 +1130,20 @@ bool Engine::Init() {
11271130
Cmd_ExecuteCommand_Hook.SetFunc(g_Cmd_ExecuteCommand);
11281131
InsertCommand_Hook.SetFunc(g_InsertCommand);
11291132

1130-
this->readCustomDataInjectAddr = Memory::Scan(this->Name(), Offsets::readCustomDataInjectSig, Offsets::readCustomDataInjectOff);
1131-
this->readConsoleCommandInjectAddr = Memory::Scan(this->Name(), Offsets::readConsoleCommandInjectSig, Offsets::readConsoleCommandInjectOff);
1132-
if (this->readCustomDataInjectAddr && this->readConsoleCommandInjectAddr) {
1133-
// Pesky memory protection doesn't want us overwriting code - we
1134-
// get around it with a call to mprotect or VirtualProtect
1135-
Memory::UnProtect((void *)this->readCustomDataInjectAddr, 4);
1136-
Memory::UnProtect((void *)this->readConsoleCommandInjectAddr, 4);
1137-
1138-
// It's a relative call, so we have to do some weird fuckery lol
1139-
Engine::ReadCustomData = reinterpret_cast<_ReadCustomData>(*(uint32_t *)this->readCustomDataInjectAddr + (this->readCustomDataInjectAddr + 4));
1140-
*(uint32_t *)this->readCustomDataInjectAddr = (uint32_t)&ReadCustomData_Hook - (this->readCustomDataInjectAddr + 4); // Add 4 to get address of next instruction
1133+
g_ReadCustomDataPatch = new Memory::Patch();
1134+
auto readCustomDataInjectAddr = Memory::Scan(this->Name(), Offsets::readCustomDataInjectSig, Offsets::readCustomDataInjectOff);
1135+
if (readCustomDataInjectAddr) {
1136+
Engine::ReadCustomData = (_ReadCustomData)Memory::Read(readCustomDataInjectAddr);
1137+
auto ReadCustomDataInject = (uint32_t)&ReadCustomData_Hook - (readCustomDataInjectAddr + 4);
1138+
g_ReadCustomDataPatch->Execute(readCustomDataInjectAddr, (unsigned char *)&ReadCustomDataInject, 4);
1139+
}
11411140

1142-
Engine::ReadConsoleCommand = (_ReadConsoleCommand)Memory::Read(this->readConsoleCommandInjectAddr);
1143-
*(uint32_t *)this->readConsoleCommandInjectAddr = (uint32_t)&ReadConsoleCommand_Hook - (this->readConsoleCommandInjectAddr + 4);
1141+
g_ReadConsoleCommandPatch = new Memory::Patch();
1142+
auto readConsoleCommandInjectAddr = Memory::Scan(this->Name(), Offsets::readConsoleCommandInjectSig, Offsets::readConsoleCommandInjectOff);
1143+
if (readConsoleCommandInjectAddr) {
1144+
Engine::ReadConsoleCommand = (_ReadConsoleCommand)Memory::Read(readConsoleCommandInjectAddr);
1145+
auto ReadConsoleCommandInject = (uint32_t)&ReadConsoleCommand_Hook - (readConsoleCommandInjectAddr + 4);
1146+
g_ReadConsoleCommandPatch->Execute(readConsoleCommandInjectAddr, (unsigned char *)&ReadConsoleCommandInject, 4);
11441147
}
11451148

11461149
if (auto debugoverlay = Interface::Create(this->Name(), "VDebugOverlay004", false)) {
@@ -1229,15 +1232,10 @@ void Engine::Shutdown() {
12291232
Interface::Delete(this->g_physCollision);
12301233

12311234
// Reset to the offsets that were originally in the code
1232-
if (this->readCustomDataInjectAddr && this->readConsoleCommandInjectAddr) {
1233-
#ifdef _WIN32
1234-
*(uint32_t *)this->readCustomDataInjectAddr = 0x50E8458D;
1235-
*(uint32_t *)this->readConsoleCommandInjectAddr = 0x000491E3;
1236-
#else
1237-
*(uint32_t *)this->readCustomDataInjectAddr = 0x08244489;
1238-
*(uint32_t *)this->readConsoleCommandInjectAddr = 0x0008155A;
1239-
#endif
1240-
}
1235+
g_ReadCustomDataPatch->Restore();
1236+
g_ReadConsoleCommandPatch->Restore();
1237+
SAFE_DELETE(g_ReadCustomDataPatch)
1238+
SAFE_DELETE(g_ReadConsoleCommandPatch)
12411239

12421240
#ifdef _WIN32
12431241
MH_UNHOOK(Engine::ParseSmoothingInfo_Mid);

src/Modules/EngineDemoRecorder.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,7 @@ DETOUR_COMMAND(EngineDemoRecorder::record) {
348348

349349
bool EngineDemoRecorder::Init() {
350350
auto disconnect = engine->cl->Original(Offsets::Disconnect);
351-
void *demorecorder;
352-
demorecorder = Memory::DerefDeref<void *>(disconnect + Offsets::demorecorder);
351+
auto demorecorder = Memory::DerefDeref<void *>(disconnect + Offsets::demorecorder);
353352
if (this->s_ClientDemoRecorder = Interface::Create(demorecorder)) {
354353
this->s_ClientDemoRecorder->Hook(EngineDemoRecorder::SetSignonState_Hook, EngineDemoRecorder::SetSignonState, Offsets::SetSignonState);
355354
this->s_ClientDemoRecorder->Hook(EngineDemoRecorder::StartRecording_Hook, EngineDemoRecorder::StartRecording, Offsets::StartRecording);

src/Offsets/INFRA 6905.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,7 @@ SIGSCAN_WINDOWS(GetChapterProgress, "")
110110
// Engine
111111
SIGSCAN_WINDOWS(Host_AccumulateTime, "55 8B EC F3 0F 10 05 ? ? ? ? F3 0F 58 45")
112112
SIGSCAN_WINDOWS(readCustomDataInjectSig, "8D 4D E8 51 8D 55 BC 52 8D 4F 04 E8 ? ? ? ? 8B 4D BC 83 F9 FF")
113-
OFFSET_WINDOWS(readCustomDataInjectOff, 12)
114113
SIGSCAN_WINDOWS(readConsoleCommandInjectSig, "8B 55 F4 52 68 13 05 00 00 68 ? ? ? ? 8D 4D 90 E8 ? ? ? ? 8D 4F 04 E8")
115-
OFFSET_WINDOWS(readConsoleCommandInjectOff, 26)
116114
SIGSCAN_WINDOWS(Cmd_ExecuteCommand, "55 8B EC 57 8B 7D ? 8B 07 85 C0")
117115
SIGSCAN_WINDOWS(InsertCommand, "55 8B EC 56 57 8B 7D ? 8B F1 81 FF FF 01 00 00")
118116

@@ -121,6 +119,7 @@ SIGSCAN_WINDOWS(InsertCommand, "55 8B EC 56 57 8B 7D ? 8B F1 81 FF FF 01 00 00")
121119
SIGSCAN_WINDOWS(ViewPunch, "55 8B EC A1 ? ? ? ? 8B 50 ? 83 EC 0C 56 8B F1")
122120
SIGSCAN_WINDOWS(FindClosestPassableSpace, "53 8B DC 83 EC 08 83 E4 F0 83 C4 04 55 8B 6B ? 89 6C 24 ? 8B EC A1 ? ? ? ? 8B 50 ? 81 EC 88 02 00 00")
123121
SIGSCAN_WINDOWS(CheckStuck_FloatTime, "FF 15 ? ? ? ? D9 5D ? 8B 4E")
122+
SIGSCAN_EMPTY(FloorReportalBranch)
124123

125124

126125
// Steam API

src/Offsets/Portal 2 4554.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ SIGSCAN_WINDOWS(FindElementSig, "55 8B EC 53 8B 5D ? 56 57 8B F1 33 FF")
120120
OFFSET_WINDOWS(m_szLevelName, 36)
121121
OFFSET_WINDOWS(m_bLoadGame, 440)
122122

123+
SIGSCAN_WINDOWS(readCustomDataInjectSig, "8D 45 ? 50 8D 4D ? 51 8D 4F ? E8 ? ? ? ? 8B 4D")
123124
SIGSCAN_WINDOWS(readConsoleCommandInjectSig, "8B 45 F4 50 68 ? 04 00 00 68 ? ? ? ? 8D 4D 90 E8 ? ? ? ? 8D 4F 04 E8") // needed to mask one byte
124125

125126
OFFSET_WINDOWS(net_time, 21) // found

src/Offsets/Portal 2 9568.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ OFFSET_DEFAULT(GetRecordingTick, 1, 1)
126126
OFFSET_DEFAULT(SetSignonState, 3, 3)
127127
OFFSET_DEFAULT(StartRecording, 2, 2)
128128
OFFSET_DEFAULT(StopRecording, 7, 7)
129-
OFFSET_DEFAULT(RecordCustomData, 14, 14)
129+
OFFSET_DEFAULT(RecordCustomData, 14, 14) // "IEngineClient::RecordDemoCustomData(): Not recording a demo.\n" xref -> vtable call using params 2 and 3
130130
OFFSET_DEFAULT(RecordCommand, 8, 8)
131131
OFFSET_DEFAULT(m_szDemoBaseName, 1344, 1344)
132132
OFFSET_DEFAULT(m_bRecording, 1606, 1606)
@@ -440,8 +440,8 @@ SIGSCAN_DEFAULT(Host_AccumulateTime, "55 8B EC 51 F3 0F 10 05 ? ? ? ? F3 0F 58 4
440440
"83 EC 1C 8B 15 ? ? ? ? F3 0F 10 05 ? ? ? ? F3 0F 58 44 24 20 F3 0F 11 05 ? ? ? ? 8B 02 8B 40 24 3D ? ? ? ? 0F 85 41 03 00 00") // "-tools" -> function with 2 references -> Host_AccumulateTime
441441
SIGSCAN_DEFAULT(_Host_RunFrame_Render, "A1 ? ? ? ? 85 C0 75 1B 8B 0D ? ? ? ? 8B 01 8B 50 40 68 ? ? ? ? FF D2 A3 ? ? ? ? 85 C0 74 0D 6A 02 6A F6 50 E8 ? ? ? ? 83 C4 0C",
442442
"55 89 E5 57 56 53 83 EC 1C 8B 1D ? ? ? ? 85 DB 0F 85 69 02 00 00 E8 64 FF FF FF A1 ? ? ? ? 80 3D C5 ? ? ? ? 8B 78 30 74 12 83 EC 08 6A 00") // "_Host_RunFrame_Render" xref
443-
SIGSCAN_DEFAULT(readCustomDataInjectSig, "8D 45 E8 50 8D 4D BC 51 8D 4F 04 E8 ? ? ? ? 8B 4D BC 83 F9 FF", // "Unable to decode custom demo data, callback \"%s\" not found.\n" -> memory reference -> first function call
444-
"8D 85 C4 FE FF FF 83 EC 04 8D B5 E8 FE FF FF 56 50 FF B5 94 FE FF FF E8")
443+
SIGSCAN_DEFAULT(readCustomDataInjectSig, "8D 45 E8 50 8D 4D BC 51 8D 4F 04 E8 ? ? ? ? 8B 4D BC 83 F9 FF",
444+
"8D 85 C4 FE FF FF 83 EC 04 8D B5 E8 FE FF FF 56 50 FF B5 94 FE FF FF E8") // "Unable to decode custom demo data, callback \"%s\" not found.\n" -> memory reference -> first function call
445445
OFFSET_DEFAULT(readCustomDataInjectOff, 12, 24)
446446
SIGSCAN_DEFAULT(readConsoleCommandInjectSig, "8B 45 F4 50 68 FE 04 00 00 68 ? ? ? ? 8D 4D 90 E8 ? ? ? ? 8D 4F 04 E8",
447447
"FF B5 AC FE FF FF 8D B5 E8 FE FF FF 68 FE 04 00 00 68 ? ? ? ? 56 E8 ? ? ? ? 58 FF B5 94 FE FF FF E8") // "%d dem_consolecmd [%s]\n" -> memory reference -> second function call
@@ -495,7 +495,7 @@ SIGSCAN_DEFAULT(ViewPunch, "55 8B EC A1 ? ? ? ? 83 EC 0C 83 78 30 00 56 8B F1 0F
495495
SIGSCAN_DEFAULT(UTIL_FindClosestPassableSpace, "53 8B DC 83 EC 08 83 E4 F0 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 81 EC 98 02 00 00 8B 43 0C 8B 48 08 F3 0F 10 48 04 F3 0F 10 00 F3 0F 10 3D ? ? ? ?",
496496
"55 BA 00 01 00 00 66 0F EF ED 66 0F EF C0 57 56 53 81 EC CC 02 00 00 8B 0D ? ? ? ? 8B 84 24 E4 02 00 00 66 89 94 24 54 01 00 00 8B 3D ? ? ? ?")
497497
SIGSCAN_DEFAULT(FindClosestPassableSpace, "53 8B DC 83 EC 08 83 E4 F0 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC A1 ? ? ? ? 81 EC 88 02 00 00 83 78 30 00 56 57 0F 84 ? ? ? ? 8B 73 08 8B 8E DC 00 00 00",
498-
"A1 ? ? ? ? 57 56 53 8B 5C 24 10 8B 74 24 14 8B 50 30 8B 4C 24 18 85 D2 74 29 8B 83 E4 00 00 00 8B 3D ? ? ? ? 83 F8 FF 74 24 0F B7 D0 C1 E8 10")
498+
"A1 ? ? ? ? 57 56 53 8B 5C 24 10 8B 74 24 14 8B 50 30 8B 4C 24 18 85 D2 74 29 8B 83 E4 00 00 00 8B 3D ? ? ? ? 83 F8 FF 74 24 0F B7 D0 C1 E8 10") // "Hurting the player for FindClosestPassableSpaceFailure!" in CPortalGameMovement::CheckStuck -> prev function call
499499
SIGSCAN_DEFAULT(UTIL_GetCommandClientIndex, "A1 ? ? ? ? 40 C3",
500500
"A1 ? ? ? ? 83 C0 01 C3") // "say_team" callback -> first function call -> UTIL_GetCommandClient -> comparison data other xref -> UTIL_GetCommandClientIndex
501501
SIGSCAN_DEFAULT(CheckStuck_FloatTime, "FF ? ? ? ? ? D9 5D F8 8B 56 04 8B 42 1C 8B ? ? ? ? ? 3B C3 75 04 33 C9 EB 08 8B C8 2B 4A 58 C1 F9 04 F3 0F 10 84 CE 70",

0 commit comments

Comments
 (0)