能力值:
( LV9,RANK:280 )
|
-
-
2 楼
int (__fastcall *)(int pthis, int dummy, int argstack1, int argstack2 , int argstack3...)
|
能力值:
( LV3,RANK:30 )
|
-
-
3 楼
hzqst
int (__fastcall *)(int pthis, int dummy, int argstack1, int argstack2 , int argstack3...)
利用fastcall的调用约定,ecx,edx,加栈参数,是这个意思吗
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
hook接管函数声明成裸函数自己维护
|
能力值:
( LV1,RANK:0 )
|
-
-
5 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
可以跟踪调试一下,调用前后堆栈,寄存器是否还原了。 建议把整个都pushad popad试试。 很久很久没有搞windows了
|
能力值:
( LV6,RANK:93 )
|
-
-
7 楼
detour有thiscall的example,另外的方法如dllspec_naked + asm直接hook任意位置也行
|
能力值:
( LV1,RANK:0 )
|
-
-
8 楼
感谢各位大神的积极帮助,非常感谢大家。已经解决问题,目前采用的解决方案是4楼大佬提供的那篇文章并且我从Detours换成了MinHook 仔细按照文章的方法已经达到了我想要的效果。直接实现自己操作然后调用原函数即可,不用自己使用内联汇编去维护是最简单的方案。接下来其他大佬给出的方案我还会继续尝试,我会在下一楼放出我的代码,各位朋友参照即可。
|
能力值:
( LV1,RANK:0 )
|
-
-
9 楼
mb_hgrbqfun
肯定不是fastcall 也不是__stdcall ,因为vc编译器的this传参为特定寄存器的缘故,你只能手写汇编或者自己构造一个c++成员函数指针。这篇文章的 inline ho ...
感谢大神的解决方案,您提供的文章特别的详细,感谢!
|
能力值:
( LV1,RANK:0 )
|
-
-
10 楼
mb_hgrbqfun
肯定不是fastcall 也不是__stdcall ,因为vc编译器的this传参为特定寄存器的缘故,你只能手写汇编或者自己构造一个c++成员函数指针。这篇文章的 inline ho ...
#include "pch.h"
#include "MinHook.h"
#include "atlstr.h"
#if defined _M_X64
#pragma comment(lib, "MinHook.x64.lib")
#elif defined _M_IX86
#pragma comment(lib, "MinHook.x86.lib")
#endif
__declspec(dllexport) void ExportFunc(void)
{
}
class CDetour
{
public:
void Mine_Target(const char* text, int a1, int a2, unsigned int a3, float a4);
};
typedef void(__thiscall* tofunc)(CDetour*, const char* text, int a1, int a2, unsigned int a3, float a4);
tofunc testfun = nullptr;
void CDetour::Mine_Target(const char* text, int a1, int a2, unsigned int a3, float a4)
{
OutputDebugString(L"流经我的方法!");
CString temp;
temp += text;
OutputDebugString(temp);
testfun(this, text, a1, a2, a3, a4);
}
void Hook() {
MH_Initialize();
void (CDetour:: * pfMine)(const char* text, int a1, int a2, unsigned int a3, float a4) = &CDetour::Mine_Target;
auto s = MH_CreateHook(*(PBYTE*)(0x004FCF00), *(PBYTE*)&pfMine,
(void**)&testfun);
if (s == MH_OK) {
MH_EnableHook(MH_ALL_HOOKS);
}
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
Hook();
OutputDebugString(L"MinHook!");
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
|
能力值:
( LV1,RANK:0 )
|
-
-
11 楼
|
能力值:
( LV6,RANK:80 )
|
-
-
12 楼
mb_hgrbqfun
肯定不是fastcall 也不是__stdcall ,因为vc编译器的this传参为特定寄存器的缘故,你只能手写汇编或者自己构造一个c++成员函数指针。这篇文章的 inline ho ...
thiscall就是fastcall 只不过修饰掉了edx
|
能力值:
( LV1,RANK:0 )
|
-
-
13 楼
黑洛
thiscall就是fastcall 只不过修饰掉了edx
学习了。
|
能力值:
( LV4,RANK:40 )
|
-
-
14 楼
郁人
#include "pch.h"
#include "MinHook.h"
#inclu ...
Detour __fastcall 方式hook类成员函数例子 //////////////////////////////////////////////////////////////// Target Class.
//
class CMember
{
public:
int Target(int a, int b);
};
int CMember::Target(int a, int b)
{
printf(" CMember::Target! (this:%p) %d, %d\n", this, a, b);
return 0;
}
//////////////////////////////////////////////////////////////////////////////
// __fastcall 前4个参数分别是 rcx rdx r8 r9进行传参.多余的通过栈传参.从右向左入栈.
#ifdef _WIN64
typedef int(__fastcall *CMember_Target)(void *, int, int);
CMember_Target CMember_Target_Real = nullptr;
int __fastcall Mine_Target_fastcall(void *ccx, int a, int b)
{
printf(" Mine_Target_fastcall begin! (this:%p) %d, %d\n", ccx, a, b);
int ret = CMember_Target_Real(ccx, a, b);
printf(" Mine_Target_fastcall end! (this:%p) %d, %d %d\n", ccx, a, b, ret);
return 1;
}
#else
typedef int(__fastcall *CMember_Target)(void *, int, int, int);
CMember_Target CMember_Target_Real = nullptr;
int __fastcall Mine_Target_fastcall(void *ecx, int edx, int a, int b)
{
printf(" Mine_Target_fastcall begin! (this:%p) %d, %d\n", ecx, a, b);
int ret = CMember_Target_Real(ecx, edx, a, b);
printf(" Mine_Target_fastcall end! (this:%p) %d, %d %d\n", ecx, a, b, ret);
return 1;
}
#endif // _WIN64
//////////////////////////////////////////////////////////////////////////////
//
int main(int argc, char **argv)
{
(void)argc;
(void)argv;
//////////////////////////////////////////////////////////////////////////
//
//CMember_Target_Real = (CMember_Target)0x12345687;
int (CMember::* pfTarget)(int, int) = &CMember::Target;
CMember_Target_Real = *(CMember_Target *)&pfTarget;
Verify("Real_Target_fastcall", *(PBYTE *)&CMember_Target_Real);
Verify("Mine_Target ", (PBYTE*)Mine_Target_fastcall);
printf("\n");
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)CMember_Target_Real, Mine_Target_fastcall);
LONG l = DetourTransactionCommit();
printf("DetourTransactionCommit = %ld\n", l);
printf("\n");
Verify("Real_Target_fastcall", *(PBYTE *)&CMember_Target_Real);
Verify("Mine_Target ", (PBYTE *)Mine_Target_fastcall);
printf("\n");
//////////////////////////////////////////////////////////////////////////
//
CMember target;
printf("Calling CMember (will be detoured):\n");
int ret = target.Target(1, 4);
printf("ret: %d\n", ret);
return 0;
}
最后于 2024-3-6 10:12
被小调调编辑
,原因:
|
能力值:
( LV1,RANK:0 )
|
-
-
15 楼
作者是“小调调”的答复精彩绝伦!这个答案是最优正解!
|
能力值:
( LV1,RANK:0 )
|
-
-
16 楼
小调调
郁人
#include "pch.h"
#include "MinHo ...
这个解答太优秀了!非常正确!
|
|
|