??????????????д??????Hook .Net????????????????????????C#?????????????????????????????????????????????
?????????Install-Package DotNetDetour
???????https://github.com/bigbaldy1128/DotNetDetour
????1.??????????
???????hook??????ò????????????????????????????????е????????????????????У?????????????????????????????????????????????亯???????????????????????????????????????????hook?????hook????????????????????ж??????Σ????????????????????C++????????????????????hook .net????????????????????????????????????????????
????2.??????
????????????inline hook????????????.net?????????Щ????????????????????????Щ?????????????κ?????????????????????inline hook??????????
????????????inline hook?????????????????????????5???????jmp xxxxxxxx??????????????C#??????

??????windbg??????????????

?????????jit??????????:

???????????(0x008c0640)???????MethodInfo.MethodHandle.GetFunctionPointer().ToPointer()???????
?????????????????????????push ebp?????5??????jmp???????????????????????????hook??????????е???????????????????????????????????????????????????????????????????????????????????????????????????5???????????????????????????????????????????????????????????????????????????????????????κ???????????????????????????????????е?CPU???????5?????????????????????????????о?????????????????????????????????????????
?????????β????????????????????????????C??д????????????????????????????????????У?
??????????5??????+jmp??????
??????????????????е????????????????????????????????5????????????????????????????????????????????.net????????????Щ??????????????????mov edi??edi??????????5????????????????????????????л??????????μ?????????????????????????E8??E9????????????????????????????????????λ??????????????????????????????С?
????????????????Щ????????????????hook???к??????????????????????????????????????????????????????????????????????????5????С?????????????
????????????·??????????????Cд???????BlackBone?????????????????????????????????????????£???????????????????????????????
????push ebp
????mov ebp??esp
????mov eax??dword ptr ds:[33F22ACh]
??????????9??????????????????????????????????????????????????????о????????????????64λ??????????????????????????????д???
???????????5????С??????????+jmp?????????????????????
???????????????C#???????л?????????Marshal.AllocHGlobal????????й???????????????????????????????????????????64λ???????2GB?????Χ?????????????????????????????????ret?????????64λ???????????push???????д????????
????push rax
????mov rax??target_addr
????push rax
????mov rax??qword ptr ss:[rsp+8]
????ret 8
?????????ЩC#?????????????????rax????????????????????????rax????????????????????????????????????????????????????IL????????????dup????????????????????л?????????????????????????????????????????????д???д???????????
????????????????????ù??????????????????????????????????Marshal.GetDelegateForFunctionPointer??????????У???????????????????????????????????????C#????jit??????????????C???????????????????й??????????е??????к???????????????????????????й?????????й????????????????????????????????Щ??????????????????????????C#?????????????????????????????????e????д????????????????????????????????е????????????????巽?????£?
????*((ulong*)((uint*)method.MethodHandle.Value.ToPointer() + 2)) = (ulong)ptr;
????method?????????MethodInfo??         ptr?????????????????
??????????????????????????????????????????????????????????????64λ??????????????????????????????????
byte[] jmp_inst =
{
0x50??                                              //push rax
0x48??0xB8??0x90??0x90??0x90??0x90??0x90??0x90??0x90??0x90?? //mov rax??target_addr
0x50??                                              //push rax
0x48??0x8B??0x44??0x24??0x08??                          //mov rax??qword ptr ss:[rsp+8]
0xC2??0x08??0x00                                     //ret 8
};
protected override void CreateOriginalMethod(MethodInfo method)
{
uint oldProtect;
var needSize = NativeAPI.SizeofMin5Byte(srcPtr);
byte[] src_instr = new byte[needSize];
for (int i = 0; i < needSize; i++)
{
src_instr[i] = srcPtr[i];
}
fixed (byte* p = &jmp_inst[3])
{
*((ulong*)p) = (ulong)(srcPtr + needSize);
}
var totalLength = src_instr.Length + jmp_inst.Length;
IntPtr ptr = Marshal.AllocHGlobal(totalLength);
Marshal.Copy(src_instr?? 0?? ptr?? src_instr.Length);
Marshal.Copy(jmp_inst?? 0?? ptr + src_instr.Length?? jmp_inst.Length);
NativeAPI.VirtualProtect(ptr?? (uint)totalLength?? Protection.PAGE_EXECUTE_READWRITE?? out oldProtect);
RuntimeHelpers.PrepareMethod(method.MethodHandle);
*((ulong*)((uint*)method.MethodHandle.Value.ToPointer() + 2)) = (ulong)ptr;
}
????3.????????????????
??????????????????????????C#??????????е??????????Cд???????????????C#?????????д????飬????????C????????????C#????unsafe????????10???????????????????????C#?????????????????????????????????????C#??????
????4.???????
??????÷????????????????????????????????н??IMethodMonitor??Get??????????????Ori??????????????????????????Get???????????????κ?????
public class CustomMonitor : IMethodMonitor //?????????????IMethodMonitor???
{
[Monitor("TargetNamespace"?? "TargetClass")] //???hook???????????????????
public string Get() //??????????????????
{
return "B" + Ori();
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Original] //????????
public string Ori() //??????????????????
{
return null; //????д??????ν????????????
}
}
????????????????????
????public string Get()
????{
????return "A";
????}
?????????Monitor.Install()??????????????磺
????Console.WrtieLine(Get());
????Monitor.Install()
????Console.WrtieLine(Get());
????????????ε???Get????????"A"?????????"BA"
???????????????hook????hook??????dll????????????hook??????????????壬hook??????????????壬???????????????.net????????????????????.net??dll???????C++??
????????????????????????????????????????????????о?????????????????????????????????????????????????????????????????????????????????о?????????????????????????????????????????hook .net???????????????????Щ????????????????????????????????????????????????????????????????