MCPcopy Create free account
hub / github.com/Rat431/ColdAPI_Steam / InitFunctionHookByAddress

Function InitFunctionHookByAddress

src/ColdAPI_Steam/Hook_utils/ColdHook.cpp:443–685  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

441 return NULL;
442 }
443 int32_t InitFunctionHookByAddress(Hook_Info* OutputInfo, bool WrapFunction, void* Target, void* HookedF, int32_t* OutErrorCode)
444 {
445 if (OutputInfo > NULL && Target > NULL && HookedF > NULL)
446 {
447 if (ColdHook_Vars::Inited)
448 {
449 ULONG_PTR TNextInstruction = NULL;
450 SIZE_T TrampolineISize = NULL;
451 SIZE_T MaxHSize = 5;
452 DWORD OldP = NULL;
453 int32_t Code = NULL;
454
455 BYTE HookDataB[0x100] = { 0 };
456 bool BytesStored = false;
457
458 void* Redirection = NULL;
459 void* JumpTo = NULL;
460
461 if (!ColdHook_Service::IsAddressRegisteredAsHook(Target))
462 {
463 SIZE_T ChangedHookSize = NULL;
464
465 Redirection = ColdHook_Service::AllocateTrampoline((ULONG_PTR)Target, 0x1000, &Code, &ChangedHookSize);
466 if (ChangedHookSize != NULL) {
467 MaxHSize = ChangedHookSize;
468 }
469 if (WrapFunction)
470 {
471 unsigned int DecodedI = ColdHook_Service::DisasmRange(&TrampolineISize, &TNextInstruction, MaxHSize, (ULONG_PTR)Target,
472 distorm_version(), Target);
473 if (Redirection > NULL)
474 {
475 if (DecodedI != NULL)
476 {
477 if (Code == NULL) // If 64 bit hook
478 {
479 // Install jump to our hooked function.
480 *(BYTE*)Redirection = 0xFF;
481 *((BYTE*)(ULONG_PTR)Redirection + sizeof(BYTE)) = 0x25;
482 std::memset((void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE)), NULL, sizeof(DWORD));
483
484 *(void**)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD)) = HookedF;
485
486 // Copy instructions that would be overwritten
487 std::memcpy((void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*)), Target, TrampolineISize);
488
489 // Apply the return back jump
490 *((BYTE*)(ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize) = 0xFF;
491 *((BYTE*)(ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize + sizeof(BYTE)) = 0x25;
492 std::memset((void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize + sizeof(BYTE) + sizeof(BYTE)), NULL, sizeof(DWORD));
493 *(void**)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD)) = (void*)TNextInstruction;
494
495 JumpTo = Redirection;
496 Redirection = (void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*));
497 }
498 else if (Code == FALIED_OUT_RANGE)
499 {
500 std::memcpy((void*)Redirection, Target, TrampolineISize);

Callers

nothing calls this directly

Calls 4

AllocateTrampolineFunction · 0.85
DisasmRangeFunction · 0.85
distorm_versionFunction · 0.85

Tested by

no test coverage detected