MCPcopy Create free account
hub / github.com/PenguLoader/PenguLoader / Restorable

Class Restorable

core/src/hook.h:49–103  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

47 };
48
49 struct Restorable
50 {
51 Restorable(void *func, const void *code, size_t size)
52 : func_(func), size_(size), backup_(new uint8_t[size])
53 {
54 memcpy(backup_, func, size);
55 memcpy_safe(func, code, size);
56 }
57
58 ~Restorable()
59 {
60 memcpy_safe(func_, backup_, size_);
61 delete[] backup_;
62 }
63
64 Restorable swap()
65 {
66 return Restorable(func_, backup_, size_);
67 }
68
69 private:
70 void *func_;
71 uint8_t *backup_;
72 size_t size_;
73
74 static bool memcpy_safe(void *dst, const void *src, size_t size)
75 {
76#if OS_WIN
77 DWORD op;
78 BOOL success = VirtualProtect(dst, size, PAGE_EXECUTE_READWRITE, &op);
79 if (success == 0)
80 return false;
81 memcpy(dst, src, size);
82 success = VirtualProtect(dst, size, op, &op);
83 return success != 0;
84#elif OS_MAC
85 kern_return_t kr;
86 kr = mach_vm_protect(mach_task_self(),
87 (mach_vm_address_t)dst, (mach_vm_size_t)size,
88 FALSE, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE | VM_PROT_COPY);
89 if (kr != KERN_SUCCESS)
90 return false;
91
92 kr = mach_vm_write(mach_task_self(),
93 (mach_vm_address_t)dst, (vm_offset_t)src, size);
94 if (kr != KERN_SUCCESS)
95 return false;
96
97 kr = mach_vm_protect(mach_task_self(),
98 (mach_vm_address_t)dst, (mach_vm_size_t)size,
99 FALSE, VM_PROT_READ | VM_PROT_EXECUTE);
100 return kr == KERN_SUCCESS;
101#endif
102 }
103 };
104
105 template <typename>
106 class Hook;

Callers 1

swapMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected