潜水太长时间了,也没有什么东西可发,因为大家的水平都很牛,不过什么也不做,光学大牛们的技术也不是咱的风格,共享些微薄见识,高手勿笑,大牛们手下留情。
VC6不能声明thiscall调用,那么在注入的时候,就算找到了函数指针,也只能写汇编用ecx传参,偶然间发现用vs2010间然可以声明thiscall调用,试着写了一下,发现不用写汇编也可以用,可能说的不明白,下面贴代码吧
!
MyTClass mt;
//把this指针放进变量
int nEcx = (int)&mt;
typedef char* (__thiscall* pthiscall)(int);
typedef char* (MyTClass::*FUNC)();
FUNC nAddr = &MyTClass::GetName;
PDWORD pd = (PDWORD)&nAddr;
pthiscall pFunThis = (pthiscall)(*pd);
//为了验证this传参的正确性,这里先把ecx写0,如果下面调用
//pFunThis失败则说明这种方法是错误的
__asm
{
mov ecx, 0
}
//调用函数指针,this指针作为第一个参数传递
char* lpName = pFunThis(nEcx);
printf("%s\n", lpName);
//把上面的情况又做了一遍
typedef int (__thiscall* pthiscall1)(int,int,int);
typedef int (MyTClass::*FUNC1)(int,int);
FUNC1 nAddr1 = &MyTClass::AddNum;
pd = (PDWORD)&nAddr1;
pthiscall1 pFunThis1 = (pthiscall1)(*pd);
int nRt = pFunThis1(nEcx,1,2);
printf("%d\n",nRt);
//////////////////////////////////////////////////
下面是我在某程序注入中写的一个函数,经测试没有问题
bool GetObjState(int nEcx)
{
typedef bool(__thiscall* LPTHISCALL)(int);
LPTHISCALL lpThisFun = (LPTHISCALL)(*(int*)(*(int*)(nEcx)+0x48));
return lpThisFun(nEcx);
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)