-
Автор темы
- #1
Небольшой класс для хуков на 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];
}
}
}
}
Интерпретируется неправильно.Должно быть так:
Последнее редактирование: