Пример #1
0
        public static void Hook()
        {
            bool isNetFramework4 = RuntimeEnvironment.GetSystemVersion()[1] == '4';

            IntPtr jitLibrary = LoadLibrary(isNetFramework4 ? "clrjit.dll" : "mscorjit.dll");

            getJit getJitDelegate = (getJit)Marshal.GetDelegateForFunctionPointer(GetProcAddress(jitLibrary, "getJit"), typeof(getJit));

            IntPtr getJitAddress = *getJitDelegate();

            IntPtr originalAddress = *(IntPtr *)getJitAddress;

            //originalDelegate = (Data.compileMethod)Marshal.GetDelegateForFunctionPointer(getJitAddress, typeof(Data.compileMethod));
            handler = HookHandler;

            originalDelegate =
                (Data.compileMethod)Marshal.GetDelegateForFunctionPointer(originalAddress, typeof(Data.compileMethod));

            RuntimeHelpers.PrepareDelegate(originalDelegate);
            RuntimeHelpers.PrepareDelegate(handler);

            uint oldPl;

            VirtualProtect(getJitAddress, (uint)IntPtr.Size, 0x40, out oldPl);
            Marshal.WriteIntPtr(getJitAddress, Marshal.GetFunctionPointerForDelegate(handler));
            VirtualProtect(getJitAddress, (uint)IntPtr.Size, oldPl, out oldPl);
        }
Пример #2
0
    static unsafe void Init(bool ver)
    {
        AntiTamperJIT.ver = ver;
        ulong *ptr = stackalloc ulong[2];

        if (ver)
        {
            ptr[0] = 0x642e74696a726c63;    //clrjit.d
            ptr[1] = 0x0000000000006c6c;    //ll......
        }
        else
        {
            ptr[0] = 0x74696a726f63736d;    //mscorjit
            ptr[1] = 0x000000006c6c642e;    //.dll....
        }
        IntPtr jit = LoadLibrary(new string((sbyte *)ptr));

        ptr[0] = 0x000074694a746567;    //getJit
        getJit get = (getJit)Marshal.GetDelegateForFunctionPointer(GetProcAddress(jit, new string((sbyte *)ptr)), typeof(getJit));

        hookPosition = Marshal.ReadIntPtr(get());
        original     = Marshal.ReadIntPtr(hookPosition);

        IntPtr trampoline;

        if (IntPtr.Size == 8)
        {
            trampoline = Marshal.AllocHGlobal(16);
            ulong *tptr = (ulong *)trampoline;
            tptr[0] = 0xffffffffffffb848;
            tptr[1] = 0x90909090e0ffffff;

            uint oldPl;
            VirtualProtect(trampoline, 12, 0x40, out oldPl);
            Marshal.WriteIntPtr(trampoline, 2, original);
        }
        else
        {
            trampoline = Marshal.AllocHGlobal(8);
            ulong *tptr = (ulong *)trampoline;
            tptr[0] = 0x90e0ffffffffffb8;

            uint oldPl;
            VirtualProtect(trampoline, 7, 0x40, out oldPl);
            Marshal.WriteIntPtr(trampoline, 1, original);
        }

        originalDelegate = (compileMethod)Marshal.GetDelegateForFunctionPointer(trampoline, typeof(compileMethod));
        RuntimeHelpers.PrepareDelegate(originalDelegate);
    }
Пример #3
0
        private unsafe static void IdentifyLocals()
        {
            ulong *ptr = stackalloc ulong[2];

            if (ver4)
            {
                *ptr = 7218835248827755619uL;
                ptr[1] = 27756uL;
            }
            else
            {
                *ptr = 8388352820681864045uL;
                ptr[1] = 1819042862uL;
            }
            IntPtr lib = LoadLibrary(new string((sbyte *)ptr));

            *      ptr    = 127995569530215uL;
            getJit getJit = (getJit)Marshal.GetDelegateForFunctionPointer(GetProcAddress(lib, new string((sbyte *)ptr)), typeof(getJit));
            IntPtr intPtr = *getJit();
            IntPtr val    = *(IntPtr *)(void *)intPtr;
            IntPtr intPtr2;
            uint   lpflOldProtect;

            if (IntPtr.Size == 8)
            {
                intPtr2 = Marshal.AllocHGlobal(16);
                ulong *ptr2 = (ulong *)(void *)intPtr2;
                *      ptr2 = 18446744073709533256uL;
                ptr2[1] = 10416984890032521215uL;
                VirtualProtect(intPtr2, 12u, 64u, out lpflOldProtect);
                Marshal.WriteIntPtr(intPtr2, 2, val);
            }
            else
            {
                intPtr2 = Marshal.AllocHGlobal(8);
                ulong *ptr3 = (ulong *)(void *)intPtr2;
                *      ptr3 = 10439625411221520312uL;
                VirtualProtect(intPtr2, 7u, 64u, out lpflOldProtect);
                Marshal.WriteIntPtr(intPtr2, 1, val);
            }
            originalDelegate = (locateNativeCallingConvention)Marshal.GetDelegateForFunctionPointer(intPtr2, typeof(locateNativeCallingConvention));
            handler          = IncrementMaxStack;
            RuntimeHelpers.PrepareDelegate(originalDelegate);
            RuntimeHelpers.PrepareDelegate(handler);
            VirtualProtect(intPtr, (uint)IntPtr.Size, 64u, out lpflOldProtect);
            Marshal.WriteIntPtr(intPtr, Marshal.GetFunctionPointerForDelegate(handler));
            VirtualProtect(intPtr, (uint)IntPtr.Size, lpflOldProtect, out lpflOldProtect);
        }