【3.17日测试】现在公布跑跑的反外挂系统

社区服务
高级搜索
猴岛论坛跑跑卡丁车【3.17日测试】现在公布跑跑的反外挂系统
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
13个回复

[玩家交流]【3.17日测试】现在公布跑跑的反外挂系统

楼层直达
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看楼主 使用道具 楼主   发表于: 2009-03-17 0
1,首先是初始化数据,服务器返回第一包,里面包含即将要调用的dll数据和函数名称,目的是让后面的要调用的
代码作前期初始化工作。每个特殊含义的数据,都有自己的ID,后面根据ID进行解析出正确的fuc。

贴上解析数据,并进行数据解析的函数:复制内容到剪贴板代码:
DWORD _CallRetEax(LPBYTE pData)
{       

        DWORD        dwRetEax = 0xFFFFFFFF;
        INT                nPox = 0;
        CHAR*        pRecvBuffer = NULL ;
        INT                nLen;
        RetPoxLen pRetPoxLen;
        INT                n1stType = 0;
        INT                n;
        INT                n1stLen = 0;
        INT                nLastType = 0;
        INT                nTypeID = 0;
        INT                n1stTypeLen = 0;
        INT                n2scTypeLen = 0;
        INT                n2sc = 0;
        INT                nLastSum = 0;
        INT                nLast = 0;
        INT                nLastLen = 0;
        WORD        wInsertId = 0;
        CHAR*        pCallBuffer= NULL;
        DWORD        CallAddr;
        WORD        wFixPox = 0;
        WORD        wFixId = 0;
        WORD        wFindFixId = 0;

        GS_CHECKPTR(pData);
        pRecvBuffer = (CHAR*)(pData);

        nPox = 0;
        nLen = *(WORD*)(pRecvBuffer + nPox);
        nPox += 8;

        pRetPoxLen =  _RetLen(pRecvBuffer + nPox);
        nPox += pRetPoxLen.nPox;
        //大类个数
        n1stType = pRetPoxLen.nLen;

        for (n = 0; n < n1stType ; n++)
        {
                nLastLen = 0;

                pRetPoxLen =  _RetLen(pRecvBuffer + nPox);
                nPox += pRetPoxLen.nPox;
                //大类长度
                n1stLen = pRetPoxLen.nLen;

                        //大类长度
                        n1stTypeLen = *(WORD*)(pRecvBuffer + nPox);
                        nLastLen +=2;
                        n1stTypeLen -= 2;
                        //ID
                        nTypeID = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                        nLastLen +=2;
                        wInsertId = _FidUseId(nTypeID);
                        if(wInsertId == 0xFFFF)
                        {
                                wInsertId = _FidNoUseId();
                        }
                        m_szRetCall[wInsertId].wId = nTypeID;
                        n1stTypeLen -= 2;
                        //读法类型
                        nLastType = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                        nLastLen +=2;
                        n1stTypeLen -= 2;
                        switch(nLastType)
                        {
                        case 0://读STRING    初始化API名称+数据
                                nPox += nLastLen;
                                memcpy(m_szRetCall[wInsertId].szRetBuffer ,pRecvBuffer + nPox, n1stTypeLen);
                                m_szRetCall[wInsertId].pRetBuffer = m_szRetCall[wInsertId].szRetBuffer;
                                nPox += n1stTypeLen;
                                break;
                        case 1://DWORD+DWORD 初始化API对应关系
                                nPox += nLastLen;
                                m_szRetCall[wInsertId].w1stId = *(WORD*)(pRecvBuffer + nPox);
                                nPox +=2;
                                m_szRetCall[wInsertId].w2secId = *(WORD*)(pRecvBuffer + nPox);
                                nPox +=2;
                                break;
                        case 2://开始执行CALL
                                //nPox += nLastLen;
                                //dwRetEax = _CallBufferId(nTypeID);
                                __logger.Trace("RetEax = %p \n", m_pHook->_dwRetvalue);
                                __logger.Trace("-------------------------------------\n");
                                __logger.Trace("END\n\n");
                                __logger.Fflush();
                                break;
                        default://对CALL开始修正
                                //初始化传过来的API
                                _InitApiDate();
                                //开始修正CALL BUFFER

                                if(nLastLen < nLastType )
                                {
                                        //读出要修正地方的个数
                                        nLastSum = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                                        nLastLen += 2;
                                        n1stTypeLen -= 2;

                                        //循环读出修改的内容
                                        for(nLast = 0; nLast < nLastSum; nLast++)
                                        {
                                                wFixPox = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                                                nLastLen +=2;
                                                wFixId =  *(WORD*)(pRecvBuffer + nPox + nLastLen);
                                                nLastLen +=2;
                                                n1stTypeLen -= 4;
                                                //修改CALL BUFFER的API地址
                                                wFindFixId = _FidUseId(wFixId);
                                                if(wFindFixId != 0xFFFF)
                                                {
                                                        //修改为0的地方
                                                        if(m_szRetCall[wFindFixId].dwApiAddr != 0)
                                                        {
                                                                if( *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0E8)
                                                                {
                                                                        //CALL XXXXX
                                                                        CallAddr = (DWORD)m_szCallBuffer;
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)(m_szRetCall[wFindFixId].dwApiAddr - CallAddr -(wFixPox  - nLastSum*4 - 8) - 4);
                                                                        __logger.Trace("Pox:%p    CALL %s \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }else if( *(WORD*)(pRecvBuffer + nPox + wFixPox - 2 ) == 0x15FF)
                                                                {
                                                                        //CALL [XXXXX]
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].dwApiAddr);
                                                                        __logger.Trace("Pox:%p    CALL %s \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }else if( *(BYTE*)(pRecvBuffer + nPox + wFixPox - 2 ) == 0x8B ||
                                                                              *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0xA1 )
                                                                {
                                                                        //MOV RB32 , [XXXXX]
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].dwApiAddr);
                                                                        __logger.Trace("Pox:%p    MOV RB32, %s \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }else if( *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0B8 ||
                                                                              *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0B9 ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BA ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BB ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BC ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BD ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BE ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BF
                                                                                  )
                                                                {
                                                                        //MOV RB32 , XXXXX
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].dwApiAddr);
                                                                        __logger.Trace("Pox:%p    MOV RB32, %p = %p \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }

                                                        }else
                                                        {
                                                                //此为读常量,非API地址的情况 (地址的地址)
                                                                *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].pRetBuffer);
                                                            __logger.Trace("Pox:%p    [%p] = %p \n",wFixPox  - nLastSum*4 - 8,m_szRetCall[wFindFixId].szRetBuffer,*(DWORD*)m_szRetCall[wFindFixId].szRetBuffer);
                                                                __logger.Fflush();
                                                        }

                                                }else
                                                {
                                                        __logger.Trace("Pox:%p    CALL [addr] = %p \n", wFixPox  - nLastSum*4 - 8, wFixId);
                                                        __logger.Fflush();
                                                        dwRetEax = 0;
                                                        return dwRetEax;
                                                }
                                               
                                        }
                                }
                                //余下为CALL BUFFER
                                nPox += nLastLen;
                                ZeroMemory(m_szCallBuffer,sizeof(m_szCallBuffer));
                                __logger.Trace("\nCallBufferAddr: %p    CallBufferLen: %p \n\n", &m_szCallBuffer, n1stTypeLen);
                                memcpy(m_szCallBuffer ,pRecvBuffer + nPox, n1stTypeLen);
                                m_szRetCall[wInsertId].pCallBufferAddr = (CHAR*)m_szCallBuffer;
                                nPox += n1stTypeLen;
                                break;
                        }
        }

GS_EXIT:;
        return dwRetEax;
}2,经过上面的解析后,根据数据进行函数初始化复制内容到剪贴板代码:
void _InitApiDate()
{
        HINSTANCE hInstLibrary;
        CHAR*        cDllName;
        CHAR*        cApiName;
        INT                nFindId;

        for(INT i = 0;i <= CALL_BUFFER_NO; i++)
        {
                if( m_szRetCall.wId != 0 &&
                        m_szRetCall.w1stId != 0 &&
                        m_szRetCall.dwApiAddr == 0 &&
                        m_szRetCall.w2secId != 0
                        )
                {
                        nFindId = _FidUseId(m_szRetCall.w1stId);
                        cDllName = m_szRetCall[nFindId].szRetBuffer;
                        hInstLibrary = LoadLibrary(cDllName);
                        nFindId = _FidUseId(m_szRetCall.w2secId);
                        cApiName = m_szRetCall[nFindId].szRetBuffer;
                        m_szRetCall.dwApiAddr = (DWORD)GetProcAddress(hInstLibrary,cApiName);
                        FreeLibrary(hInstLibrary);                       
                }
        }
       
        return;
}3,根据
case 2://开始执行CALL
去调用要执行的函数代码复制内容到剪贴板代码:
INT        _CallBufferId(DWORD dwId)
{
        CHAR*        pCallBuffer;
        INT                nRet;
        DWORD        dwFindUseId;
        BOOL        bRetPortect;
        DWORD        dwOldType;

        pCallBuffer = (CHAR*)m_szCallBuffer;
        dwFindUseId = (DWORD)_FidUseId(dwId);
       
        bRetPortect = VirtualProtect(m_szCallBuffer, 8190, PAGE_EXECUTE_READWRITE, &dwOldType);
       
        if(m_szRetCall[dwFindUseId].pCallBufferAddr != 0)
        {
                __asm
                {
                        pushad
                                pushfd
                                        mov eax, pCallBuffer
                                        call eax
                                        mov nRet, eax
                                popfd
                        popad
                }
        }
               
        bRetPortect = VirtualProtect(m_szCallBuffer, 8190, dwOldType, &dwOldType);

        return nRet;
}这里返回的eax就是反外挂需要的数据,服务器根据此数据来判断你是否作弊。到此,这反外挂系统简单流程就是如此了。
专门看了下送来执行的几个函数,发现它们在检查这些数据:
1)代码crc
2)窗体判断
3)hookdll判断
这些都是反外挂的小功能fuc,当然官方想加什么就加什么,应该非常好diy的


看来老汉之前的版本并非不能用,而是这个系统导致的不能使用。
[ 此贴被hdjc001在2009-03-17 13:27重新编辑 ]
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 沙发   发表于: 2009-03-17 0
如果有高手来

探讨请联系

[email protected]
para033

ZxID:5112509

等级: 新兵
举报 只看该作者 板凳   发表于: 2009-03-17 0
这么牛
改个有用的出来啊....
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 地板   发表于: 2009-03-19 0
不好意思,我能力有限。
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 4楼  发表于: 2009-03-19 0
为了老汉能继续使用,还请版主点亮
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 5楼  发表于: 2009-03-22 0
ai
失望及了。
ibu团队外挂

ZxID:4840581

等级: 新兵
举报 只看该作者 6楼  发表于: 2009-03-22 0
呵呵 有多大能力!懂程序编排?愿意加入我们IBU团队?
黑客物理知识懂多少?
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 7楼  发表于: 2009-03-22 0
基本都知道
只是没有实际操作过
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 8楼  发表于: 2009-03-22 0
版主太无能了,我本以为论坛有高手在

看来我错了
a13462871848

ZxID:3434640

等级: 上等兵
举报 只看该作者 9楼  发表于: 2009-03-22 0
别这样!  我们来探讨探讨,来加我QQ:417470964
我想问的是  跑跑的文件都是经过加密加壳的啊,既然这样,那如果修改啦  那么跑跑的主程序的文件检测系统会不会发现啊,

他的加密方式是什么类型,
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 10楼  发表于: 2009-03-25 0
我们首先分析跑跑服务器与客户端之间通讯包数据的结构、内容以及加密算法,这点我在之前已经分析完毕,反外挂系统也一分析完毕,
但是,如何使用大量的程序开发技术编写外挂程序以实现对游戏的控制或修改。这点我就做不到了。
按照我的思路,首先挡截Sock和挡截API函数,以挡截游戏服务器传来的网络数据包并将数据包修改后封包后传给游戏服务器。
这样的话就可以避过服务器的检测系统。
至于你问的加密方式我就不能告诉你了,但是可以告诉你,使用解密工具可以轻松解密。
还有一种想法是修改游戏客户端程序内存数据,但这样貌似对道具无效。
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 11楼  发表于: 2009-03-26 0
版主删帖吧,算我没说。
mous_★可乐

ZxID:4620097

等级: 下士
咕咕咕
举报 只看该作者 12楼  发表于: 2009-03-26 0
DWORD _CallRetEax(LPBYTE pData)
{       

        DWORD        dwRetEax = 0xFFFFFFFF;
        INT                nPox = 0;
        CHAR*        pRecvBuffer = NULL ;
        INT                nLen;
        RetPoxLen pRetPoxLen;
        INT                n1stType = 0;
        INT                n;
        INT                n1stLen = 0;
        INT                nLastType = 0;
        INT                nTypeID = 0;
        INT                n1stTypeLen = 0;
        INT                n2scTypeLen = 0;
        INT                n2sc = 0;
        INT                nLastSum = 0;
        INT                nLast = 0;
        INT                nLastLen = 0;
        WORD        wInsertId = 0;
        CHAR*        pCallBuffer= NULL;
        DWORD        CallAddr;
        WORD        wFixPox = 0;
        WORD        wFixId = 0;
        WORD        wFindFixId = 0;

        GS_CHECKPTR(pData);
        pRecvBuffer = (CHAR*)(pData);

        nPox = 0;
        nLen = *(WORD*)(pRecvBuffer + nPox);
        nPox += 8;

        pRetPoxLen =  _RetLen(pRecvBuffer + nPox);
        nPox += pRetPoxLen.nPox;
        //大类个数
        n1stType = pRetPoxLen.nLen;

        for (n = 0; n < n1stType ; n++)
        {
                nLastLen = 0;

                pRetPoxLen =  _RetLen(pRecvBuffer + nPox);
                nPox += pRetPoxLen.nPox;
                //大类长度
                n1stLen = pRetPoxLen.nLen;

                        //大类长度
                        n1stTypeLen = *(WORD*)(pRecvBuffer + nPox);
                        nLastLen +=2;
                        n1stTypeLen -= 2;
                        //ID
                        nTypeID = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                        nLastLen +=2;
                        wInsertId = _FidUseId(nTypeID);
                        if(wInsertId == 0xFFFF)
                        {
                                wInsertId = _FidNoUseId();
                        }
                        m_szRetCall[wInsertId].wId = nTypeID;
                        n1stTypeLen -= 2;
                        //读法类型
                        nLastType = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                        nLastLen +=2;
                        n1stTypeLen -= 2;
                        switch(nLastType)
                        {
                        case 0://读STRING    初始化API名称+数据
                                nPox += nLastLen;
                                memcpy(m_szRetCall[wInsertId].szRetBuffer ,pRecvBuffer + nPox, n1stTypeLen);
                                m_szRetCall[wInsertId].pRetBuffer = m_szRetCall[wInsertId].szRetBuffer;
                                nPox += n1stTypeLen;
                                break;
                        case 1://DWORD+DWORD 初始化API对应关系
                                nPox += nLastLen;
                                m_szRetCall[wInsertId].w1stId = *(WORD*)(pRecvBuffer + nPox);
                                nPox +=2;
                                m_szRetCall[wInsertId].w2secId = *(WORD*)(pRecvBuffer + nPox);
                                nPox +=2;
                                break;
                        case 2://开始执行CALL
                                //nPox += nLastLen;
                                //dwRetEax = _CallBufferId(nTypeID);
                                __logger.Trace("RetEax = %p \n", m_pHook->_dwRetvalue);
                                __logger.Trace("-------------------------------------\n");
                                __logger.Trace("END\n\n");
                                __logger.Fflush();
                                break;
                        default://对CALL开始修正
                                //初始化传过来的API
                                _InitApiDate();
                                //开始修正CALL BUFFER

                                if(nLastLen < nLastType )
                                {
                                        //读出要修正地方的个数
                                        nLastSum = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                                        nLastLen += 2;
                                        n1stTypeLen -= 2;

                                        //循环读出修改的内容
                                        for(nLast = 0; nLast < nLastSum; nLast++)
                                        {
                                                wFixPox = *(WORD*)(pRecvBuffer + nPox + nLastLen);
                                                nLastLen +=2;
                                                wFixId =  *(WORD*)(pRecvBuffer + nPox + nLastLen);
                                                nLastLen +=2;
                                                n1stTypeLen -= 4;
                                                //修改CALL BUFFER的API地址
                                                wFindFixId = _FidUseId(wFixId);
                                                if(wFindFixId != 0xFFFF)
                                                {
                                                        //修改为0的地方
                                                        if(m_szRetCall[wFindFixId].dwApiAddr != 0)
                                                        {
                                                                if( *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0E8)
                                                                {
                                                                        //CALL XXXXX
                                                                        CallAddr = (DWORD)m_szCallBuffer;
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)(m_szRetCall[wFindFixId].dwApiAddr - CallAddr -(wFixPox  - nLastSum*4 - 8) - 4);
                                                                        __logger.Trace("Pox:%p    CALL %s \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }else if( *(WORD*)(pRecvBuffer + nPox + wFixPox - 2 ) == 0x15FF)
                                                                {
                                                                        //CALL [XXXXX]
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].dwApiAddr);
                                                                        __logger.Trace("Pox:%p    CALL %s \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }else if( *(BYTE*)(pRecvBuffer + nPox + wFixPox - 2 ) == 0x8B ||
                                                                              *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0xA1 )
                                                                {
                                                                        //MOV RB32 , [XXXXX]
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].dwApiAddr);
                                                                        __logger.Trace("Pox:%p    MOV RB32, %s \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }else if( *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0B8 ||
                                                                              *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0B9 ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BA ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BB ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BC ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BD ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BE ||
                                                                                  *(BYTE*)(pRecvBuffer + nPox + wFixPox - 1 ) == 0x0BF
                                                                                  )
                                                                {
                                                                        //MOV RB32 , XXXXX
                                                                        *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].dwApiAddr);
                                                                        __logger.Trace("Pox:%p    MOV RB32, %p = %p \n",wFixPox  - nLastSum*4 - 8, m_szRetCall[_FidUseId(m_szRetCall[wFindFixId].w2secId)].szRetBuffer);
                                                                        __logger.Fflush();
                                                                }

                                                        }else
                                                        {
                                                                //此为读常量,非API地址的情况 (地址的地址)
                                                                *(DWORD*)(pRecvBuffer + nPox + wFixPox) = (DWORD)&(m_szRetCall[wFindFixId].pRetBuffer);
                                                            __logger.Trace("Pox:%p    [%p] = %p \n",wFixPox  - nLastSum*4 - 8,m_szRetCall[wFindFixId].szRetBuffer,*(DWORD*)m_szRetCall[wFindFixId].szRetBuffer);
                                                                __logger.Fflush();
                                                        }

                                                }else
                                                {
                                                        __logger.Trace("Pox:%p    CALL [addr] = %p \n", wFixPox  - nLastSum*4 - 8, wFixId);
                                                        __logger.Fflush();
                                                        dwRetEax = 0;
                                                        return dwRetEax;
                                                }
                                               
                                        }
                                }
                                //余下为CALL BUFFER
                                nPox += nLastLen;
                                ZeroMemory(m_szCallBuffer,sizeof(m_szCallBuffer));
                                __logger.Trace("\nCallBufferAddr: %p    CallBufferLen: %p \n\n", &m_szCallBuffer, n1stTypeLen);
                                memcpy(m_szCallBuffer ,pRecvBuffer + nPox, n1stTypeLen);
                                m_szRetCall[wInsertId].pCallBufferAddr = (CHAR*)m_szCallBuffer;
                                nPox += n1stTypeLen;
                                break;
                        }
        }

GS_EXIT:;
        return dwRetEax;
}2,经过上面的解析后,根据数据进行函数初始化复制内容到剪贴板代码:
void _InitApiDate()
{
        HINSTANCE hInstLibrary;
        CHAR*        cDllName;
        CHAR*        cApiName;
        INT                nFindId;

        for(INT i = 0;i <= CALL_BUFFER_NO; i++)
        {
                if( m_szRetCall.wId != 0 &&
                        m_szRetCall.w1stId != 0 &&
                        m_szRetCall.dwApiAddr == 0 &&
                        m_szRetCall.w2secId != 0
                        )
                {
                        nFindId = _FidUseId(m_szRetCall.w1stId);
                        cDllName = m_szRetCall[nFindId].szRetBuffer;
                        hInstLibrary = LoadLibrary(cDllName);
                        nFindId = _FidUseId(m_szRetCall.w2secId);
                        cApiName = m_szRetCall[nFindId].szRetBuffer;
                        m_szRetCall.dwApiAddr = (DWORD)GetProcAddress(hInstLibrary,cApiName);
                        FreeLibrary(hInstLibrary);                       
                }
        }
       
        return;
}3,根据
case 2://开始执行CALL
去调用要执行的函数代码复制内容到剪贴板代码:
INT        _CallBufferId(DWORD dwId)
{
        CHAR*        pCallBuffer;
        INT                nRet;
        DWORD        dwFindUseId;
        BOOL        bRetPortect;
        DWORD        dwOldType;

        pCallBuffer = (CHAR*)m_szCallBuffer;
        dwFindUseId = (DWORD)_FidUseId(dwId);
       
        bRetPortect = VirtualProtect(m_szCallBuffer, 8190, PAGE_EXECUTE_READWRITE, &dwOldType);
       
        if(m_szRetCall[dwFindUseId].pCallBufferAddr != 0)
        {
                __asm
                {
                        pushad
                                pushfd
                                        mov eax, pCallBuffer
                                        call eax
                                        mov nRet, eax
                                popfd
                        popad
                }
        }
               
        bRetPortect = VirtualProtect(m_szCallBuffer, 8190, dwOldType, &dwOldType);
代码不对            这个代码是                        网页制作代码 跟跑跑2码事      总大小800        老汉才400                         
http://bbs.houdao.com/?u=4620097 中级中国龙
明   

ZxID:3459558

等级: 中将
伴坛终老

举报 只看该作者 13楼  发表于: 2009-03-26 0
你搞清楚这跟老汉无关。

如果你说这是网页代码,那么请你自己测试跑跑反外挂系统。
如果有不一样,那我无语。
« 返回列表
发帖 回复