public static unsafe void Restore(IntPtr ptr) { MethodOffsets state = OriginalOffsets[ptr]; byte * numPtr = (byte *)ptr; numPtr[0] = state.A; numPtr[1] = state.B; *((long *)(numPtr + 2)) = state.F; numPtr[10] = state.C; numPtr[11] = state.D; numPtr[12] = state.E; }
private static unsafe void PatchJumpTo(IntPtr site, IntPtr target) { if (!OriginalOffsets.ContainsKey(site)) { MethodOffsets offsets = new MethodOffsets(); byte * numPtr2 = (byte *)site.ToPointer(); offsets.A = numPtr2[0]; offsets.B = numPtr2[1]; offsets.C = numPtr2[10]; offsets.D = numPtr2[11]; offsets.E = numPtr2[12]; offsets.F = *((long *)(numPtr2 + 2)); OriginalOffsets.Add(site, offsets); } byte *numPtr = (byte *)site.ToPointer(); numPtr[0] = 0x49; numPtr[1] = 0xbb; *((long *)(numPtr + 2)) = target.ToInt64(); numPtr[10] = 0x41; numPtr[11] = 0xff; numPtr[12] = 0xe3; }