예제 #1
0
    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;
    }
예제 #2
0
    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;
    }