이것은 EasyHook에 대한 특정 기능이 아니라 일반적으로 후킹에 관한 기능입니다. 나는이 서명 기능을 훅하고 싶은 :관리되지 않는 함수 후킹, 호출 규칙에 스택/레지스터 문제가 있습니까?
public: int __thiscall Connection_t::Send(unsigned int,unsigned int,void const *)
이 명확하게 관리되지 않는 코드와 내 관리 C# 코드가 EasyHook.But를 사용하여 함께 후크하기 위해 노력하고있어 내가 여기에 문제를 일으키는 EasyHook하지만 내 knowlegde을하지 생각 - 더 큰 놀라움을
public static int Send_Hooked(uint connection, uint size, IntPtr pDataBlock)
{
return Send(connection, size, pDataBlock);
}
[DllImport("Connection.dll", EntryPoint = "[email protected][email protected]@[email protected]", CallingConvention = CallingConvention.ThisCall)]
static extern int Send(uint connection, uint size, IntPtr pDataBlock);
[UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Unicode, SetLastError = true)]
delegate int DSend(uint connection, uint size, IntPtr pDataBlock);
을하지만 후크을 programm가 최대한 빨리 후크를 주입으로 충돌하지 계속해서 : 내가 같이 DllImport를 정의하고 삭제하는 방법 등 규칙을 호출에 ...
이다. 나는 이것이 호출 규칙의 문제라고 생각하고 hooking 함수가 hooked 함수의 스택을 어떻게 든 방해한다.
Func = (int (__stdcall *)(unsigned int, unsigned short, void const))::GetProcAddress(::GetModuleHandle("Connection.dll"), "[email protected][email protected]@[email protected]");
PVOID DetourPtr;
PVOID TargetPtr;
DetourTransactionBegin();
DetourAttachEx(&Func, SendConnectionHook, &Trampoline, &TargetPtr, &DetourPtr);
DetourTransactionCommit();
그리고 호출 된 함수 :
__declspec(naked) void SendConnectionHook (CPU_CONTEXT saved_regs, void * ret_addr, WORD arg1, DWORD arg2, DWORD arg3)
{
DWORD edi_value;
DWORD old_last_error;
__asm
{
pushad; /* first "argument", which is also used to store registers */
push ecx; /* padding so that ebp+8 refers to the first "argument" */
/* set up standard prologue */
push ebp;
mov ebp, esp;
sub esp, __LOCAL_SIZE;
}
edi_value = saved_regs.edi;
old_last_error = GetLastError();
OnConnectionSend((void *) saved_regs.ecx, (unsigned char *) arg3, arg2);
SetLastError(old_last_error);
__asm
{
/* standard epilogue */
mov esp, ebp;
pop ebp;
pop ecx; /* clear padding */
popad; /* clear first "argument" */
jmp [Trampoline];
}
}
(대상
그래서 나는 ++ 있지만 C에서 우회와 동일한 기능을 훅 않는 다른 프로젝트에서보세요 (후킹 부분)했다 어셈블리 및 C++ 예제는 모두 Visual C++로 컴파일됩니다. 원래 함수를 호출하기 전에 일부 레지스터를 저장하고 스택을 복구해야 할 것 같습니까? 아니면 내가 여기서 잘못하고있는 어떤 다른 생각?
passant : Thanks. EXC를 첫 번째 인수로 보는 것은 해결책이었습니다. – Fge