Исходник HookManager Class | C# | x64

Начинающий
Статус
Оффлайн
Регистрация
29 Июл 2022
Сообщения
101
Реакции[?]
28
Поинты[?]
29K
Небольшой класс для хуков на C#. Для DLL скомпилированных с помощью NativeAOT.


CSharp:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace NetHook
{
    unsafe class HookManager
    {
        private byte[] _origInstr;
        private IntPtr _origFuncAddr;


        [DllImport("kernel32.dll")]
        public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

        private byte[] _hookInstr =
        [
            0x49, 0xBA,                                            //movabs r10
            0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,        //[QWORD]
            0x41, 0xFF, 0xE2                                       //jmp r10
        ];
        private IntPtr _hookAddrPtr;

        public HookManager(IntPtr hookMethodPtr, IntPtr origMethodPtr)
        {
            _origFuncAddr = origMethodPtr;
            _hookAddrPtr = hookMethodPtr;
        }

        public void EnableHook()
        {
            _origInstr = new byte[_hookInstr.Length];

            fixed (byte* ptr = _origInstr)
            {
                memcpy((byte*)_origFuncAddr, ptr, _hookInstr.Length);

                fixed (void* hookInstrPtr = _hookInstr)
                {
                    PInvoke.VirtualProtect(_origFuncAddr, (UIntPtr)_hookInstr.Length, 0x40, out uint _);

                    ([I](IntPtr[/I])((IntPtr)hookInstrPtr + 2)) = _hookAddrPtr;

                    memcpy((byte*)hookInstrPtr, (byte*)_origFuncAddr, _hookInstr.Length);
                }
            }
        }

        private void Unhook()
        {
            fixed (void* origInstrPtr = _origInstr)
            {
                memcpy((byte*)origInstrPtr, (byte*)_origFuncAddr, _origInstr.Length);
            }
        }

        private void memcpy(byte* source, byte* destination, int copyLength)
        {
            for (int i = 0; i < copyLength; i++)
            {
                destination[i] = source[i];
            }
        }
    }
}
При сохранении поста, почему то это место кода:
1712837408091.png

Интерпретируется неправильно.Должно быть так:
1712837440294.png
 
Последнее редактирование:
Сверху Снизу