首页
社区
课程
招聘
[分享]不用汇编也能实现thiscall调用,搏高手一笑
发表于: 2014-5-11 18:14 4654

[分享]不用汇编也能实现thiscall调用,搏高手一笑

2014-5-11 18:14
4654
潜水太长时间了,也没有什么东西可发,因为大家的水平都很牛,不过什么也不做,光学大牛们的技术也不是咱的风格,共享些微薄见识,高手勿笑,大牛们手下留情。

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);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2905
活跃值: (3934)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
确实不错
2014-5-11 18:43
0
雪    币: 128
活跃值: (2788)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
AddNum 这个函数用到了类的成员变量或者成员函数没?如果单纯的add的话 ecx可以不管都可以
2014-5-11 21:05
0
雪    币: 104
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
我觉得纠结这段代码本身是毫无意义的,你找个游戏的某些类函数地址,用这些方法调一下就知道了,我最下面那小段代码已经说明问题了!
2014-5-12 09:09
0
雪    币: 163
活跃值: (1623)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
这么搞的原因是?
2014-5-12 09:27
0
雪    币: 2161
活跃值: (750)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
edx传递垃圾参数的fastcall一样可以
2014-5-12 09:46
0
雪    币: 209
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不知道说的是否是一件事,我感觉这个问题完全可以在语法层面解决

场景
CTest
{
public:
    void Output(int a);
};

在注入之后,知道Output函数的地址void *address,知道一个实例的地址void *p

那么可以的语法层面的调用方式为

CTest
{
public:
    void Output(int);
};

// 准备数据
void (CTest::*func)(int) = NULL;
(void *&)func = address;
CTest *pTest = (CTest *)p;
// 调用方式
(pTest->*func)(3);
2014-5-12 15:56
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
1楼,6楼两位大神.  我觉得我肯定认识一楼的大神.
2014-5-12 16:42
0
游客
登录 | 注册 方可回帖
返回
//