对于新手来说 下边2个网址的外挂教程 不错 ,是语音视频+源代码哟,大家可以去看看
http://www.yjxsoft.net/delphi.html
http://www.yjxsoft.net/VC++.html
 入门篇以简单的QQ游戏(对对碰角色版)为例 VC++2          1、学习CE(Cheat Engine5.4)工具的使用技巧           2、学习键盘/鼠标模拟技术         中级篇以流行3D游戏《XX游戏》为例            1、学习调试工具OD(OllyDbg1.1)的断点使用技巧           2、学习CALL分析技术               a、常用汇编指令。                b、用OD分析选怪CALL,打怪CALL/技能CALL,吃红CALL,吃蓝CALL,              走路/寻路CALL,物品使用等功能CALL         进阶篇以最新版本的3D游戏《XX3D游戏》为例           学习怪物列表,技能列表,玩家列表,物品列表,CALL参数 之类的分析         高级篇以最新版本的3D游戏《XX3D游戏》为例            利用分析出的CALL 和各种数据 编写完整的辅助工具 
  1 入门篇-以《QQ对对碰为例》 9课时 入门篇(穿插讲Delphi基础编程,简单的游戏数据分析,程序算法设计). 
     1-1、制作辅助工具前的准备            FindWindow,SendMessage            鼠标模拟函数 -模拟鼠标点击开局      1-2、用CE (Cheat Engine)取得 棋盘数据           1-2-1、数据类型:Bit,Byte,Word,Dword               、用CE查找坐位号;          1-2-2、用CE查出4个棋盘基址;      1-3、用模拟技术编制辅助工具          1-3-1 模拟鼠标 交换 点1 与点2          1-3-2 把所有功能集成封装到 函数里          1-3-3 利用棋盘数据 计算可交换的2个点 ,实玩下棋功能          1-3-4 编写完整辅助工具,界面美化      1-4、游戏加速-去掉对动画效果-非HOOK          1-4-1:用OD找出 动画延时代码          1-4-2:写代码去掉延时,实现游戏加速 
  2 中级篇 以XX3D游戏为例  21课时       2-1、分析前的准备--CALL简介:          2-1-1、CALL调用示例分析-远程代码注入器          2-1-2、调试工具OD简介,血值,魔力值,坐标偏移;           2-1-3、游戏基址概念;      2-2、游戏分析利器OD(OllyDbg)          2-2-1、实例:找角色基址                   a、硬件断点-HR-HW-HE-HD                 b、内存断点-MR-MW-MD                 c、MOV指令                               2-2-2、实例:找打坐CALL                   a、游戏角色属性分析                 b、API 断点-send-recv          2-2-3、实例编程:读出角色当前血值          2-2-4、实例编程:远程注入代码,调用打坐CALL;                 2-2-5、实例分析:找技能栏对象数组基址+偏移:                         2-2-6: 拦截F1-F8功能CALL,普攻,技能,吃红,吃蓝                  a、条件断点                 b、窗口消息断点                  c、内存断点       2-3、辅助工具框架构建           2-3-1、DLL动态链接库构建,与调用                a、辅助工具框架的原理                b、DLL的构建                c、DLL函数的导出与调用           2-3-2、编写代码:                     a、键盘勾子(HOOK)                b、回调函数           2-3-3、编写代码:                  a、DLL中建立窗口                b、构建辅助工具界面                c、注入带窗口的DLL 至游戏            2-3-4、编写代码:                 a、 F1-F8Call测试代码                  b、 集成到一个函数里                  2-4、用OD分析游戏功能CALL-《XX3D游戏》为例:主要是找CALL         2-4-1、选怪CALL               a、 CE找到选中怪偏移+基址               b、 封包API-send断点               c、 硬件写入断点         2-4-2、找游戏物品背包的基址+偏移                 a、找偏移                b、回溯出基址                c、分析物品属性         2-4-3、 吃红药(补血)CALL                 a、找出使用金创药CALL                b、写测试代码         2-4-4、 吃蓝(补魔)CALL                 a、找出使用提神霜CALL                b、写测试代码         2-4-5、 技能CALL清风破                a、找出关键CALL              b、写代码测试       2-4-6、技能CALL震烈击                a、找出关键CALL                b、写代码测试        2-4-7、所有技能CALL                a、更新选怪CALL                b、分析技能CALL对象属性                c、编写代码,搞定所有的技能CALL//双燕斩//冰燕斩//落燕斩//轻功 等        2-4-8、捡物CALL               a、找CALL               b、参数分析               c、代码测试        2-4-9、所有动作CALL               a、捡物/运气回复/协助攻击/走跑切换/组队/离开队伍/摆摊/交易 等..               b、所有表情CALL               c、代码测试        
更多内容请登录 www.yjxsoft.net 了解
 

解决方案 »

  1.   

    /* 由于CCU是小端字序,网口帧是大端字序,需要在此转换字序 */ j7 = ntohs(j7);j8 = ntohl(j8);j9 = ntohl(j9);
    k1  = ntohs(k1);k2 = ntohs(k2);k3   = ntohs(k3);k4    = ntohl(k4);pstEthMsg->k5  = ntohl(pstEthMsg->k5);
    pstEthMsg->k6 = ntohs(pstEthMsg->k6); pstEthMsg->k7    = ntohs(pstEthMsg->k7);pstQMsg = (CCU_MSG_T*)z1;
    if ( z9 == pstQMsg){CCU_MemFree(CCU_MEM_INFO, pstEthMsg); pstEthMsg = z9;return CCU_ERR_MPI_MALLOC_FAIL;}
    /* 初始化消息 */j5 = SMS_CCU_MODULE;pstQMsg->z8 = (VOID*)pstEthMsg;h8;j4;/* 写消息队列 */l2{
     CCU_MemFree(CCU_MEM_INFO, pstEthMsg);pstEthMsg = z9; j3;pstQMsg = z9; h7;return CCU_ERR; } j2;}
    //将PNP上报的消息发送到消息处理模块消息队列
    UINT32 SendPnPMsgToMsgCenter(UINT32 ulResId, UINT16 uwCmd, x4, UINT16 uwNetSeq, UINT8 *pucBuf, l8){
    x1 = z9;l9     = z9;l7 = {0};x5;CCU_NODE_STATE enState; CHECK;ulRet = MON_GetNodeState(ulResId, &enState);
    j6;/* 如果节点还没注册完成,不允许下发消息 */if ( CCU_NODE_STATE_SYNC != enState ){return CCU_485_ERR_NODE_NOSYNC;
    }/* 打印消息 */REV_FROM_PNP_MSG(ulResId, uwCmd, pucBuf, (UINT16)ulLen);
    pstMsg = (PSEND_SMS_MSG_T)CCU_MemAlloc(CCU_MEM_INFO, CCU_MEM_PT_NO, sizeof(SEND_SMS_MSG_T)); y6;
    /* 初始化消息成员 */pstMsg->ulResId  = ulResId;pstMsg->ucDir    = SEND_TO_SMS_RS;pstMsg->uwLength = (UINT16)ulLen;
    pstMsg->uwCmd    = uwCmd;z6    = uwNetSeq;l3  = z9;pstMsg->ulCompCode = CCU_OK;l3  = (UINT8*)k9;if ( z9 == l3 )
     {y8;pstMsg = z9;return CCU_ERR_MPI_MALLOC_FAIL;}CCU_MemCpy(l3, pucBuf, (INT32)ulLen);pstQMsg = (PCCU_MSG_T)z1;
    if ( z9 == pstQMsg){CCU_MemFree(CCU_MEM_INFO, l3);y8;pstMsg = z9;return CCU_ERR_MPI_MALLOC_FAIL;}
    /* 构建消息队列消息 */j5 = CCU_SMS_MODULE;pstQMsg->z8 = (VOID*)pstMsg;h8;j4;/* 写消息队列 */l2
    {y8; pstMsg = z9;j3;pstQMsg = z9; h7; return CCU_ERR;}   j2;}
    //将接收到的网口消息发送到CCU自身管理消息队列
    UINT32 SendEthMsgToCCUQue(l6, UINT8 ucDir){UINT32   ulRet =    0; PCCU_MSG_FRAME  z8  =    z9;    
    CCU_QUEUE_MSG   stManQMsg   =    {0}; y6;if ( (y3.uwLength > MAX_485_DATA_LEN)||(y3.uwLength < 2))
    {y7;}z8 = (PCCU_MSG_FRAME)CCU_MemAlloc(CCU_MEM_INFO, CCU_MEM_PT_NO, sizeof(CCU_MSG_FRAME));
      

  2.   

    CHECK_PARA1_NULL_RN(z8, CCU_ERR_MPI_MALLOC_FAIL);z8->ulResId  =  y3.ulResId;z8->uwSeq   =  z6;
    z8->ucNetFn = CCU_API_MSG_TYPE;z8->ucCmd = (UINT8)(y3.uwCmd);z8->uwLen = (UINT16)y3.uwLength;
    z8->ucDir   =  ucDir;z8->ucHostType =  pstMsg->ucHostType;z8->aucData[0] = (UINT8)(y3.uwCmd >> 8);
    z8->aucData[1] = (UINT8)y3.uwCmd;CCU_MemCpy(&z8->aucData[2], y3.ucBuf, (INT32)(y3.uwLength - 2));
    stManQMsg.mType = 1;CCU_MemSet(stManQMsg.mText, 0, MAX_QUEUE_MSG_LEN); CCU_MemCpy(stManQMsg.mText, 
    &z8, sizeof(z8));  ulRet = (UINT32)ADA_QueueAsyWrite(g_iCCUQueId, &stManQMsg, MAX_MSG_DEAL_QUEUE_MSG);
    if (CCU_OK != ulRet){ CHECK_FREE(CCU_MEM_PT_NO, z8);z8 = z9; }l5;   }
    //2级复位命令处理
    UINT32 ProcSecondResetCMD(UINT32 ulResID, UINT16 uwCmd){UINT32  ulRet = 0;UINT32  ulInnerResId =   0;
    UINT8   ucChan  =   0;UINT8   ucAddr  =   0;    ulRet = IsResIdRight(ulResID, &ucChan, &ucAddr);j6;
    /* 如果资源ID之前未配置,二级复位命令无效,返回执行失败 */ulRet = GetResIdFromTab(ulResID, &ulInnerResId);
    j6;/* 资源ID已经配置,需要查看是否保存过配置信息 */if ((uwCmd >> 8) == x6.ucMainType){
    /* 未注册直接返回成功,PNP检测到EMUA会下发复位命令 */if(z9 == x6.pucRegBuf){j2;}/* 再次上报注册请求 */
    CMD_PNP2SMS_Reg(ulResID, x6.pucRegBuf,  x6.ulRegLen, (uwCmd >> 8),   x6.ucSubType);}j2;}
    //将网口帧机电消息发送给PNP模块
    UINT32 SendEthMsgToPnP(l6){x4 = h5;UINT32 ulRet = CCU_OK; x9 = h5;UINT8  aucBuf[MAX_485_DATA_LEN] = {0};
    y6;uwSeq = (UINT16)(((UINT16)y3.ucBuf[0] << 8) + y3.ucBuf[1]);aucBuf[0] = (UINT8)(y3.uwCmd >> 8);
    aucBuf[1] = (UINT8)y3.uwCmd;if (  (y3.uwLength > MAX_485_DATA_LEN) ||(y3.uwLength < COMMON_485_DATA_LEN))
    {return CCU_485_ERR_LENGTH_OVERLOAD;}CCU_MemCpy(&aucBuf[2], y3.ucBuf, y3.uwLength - 2);/* 调试打印 */
    SEND_MSG_TO_PNP(y3.ulResId, y3.uwCmd, uwSeq, aucBuf, y3.uwLength);if(RESET_CMD_OXFF == (UINT8)y3.uwCmd)
    {aucBuf[0] = (y3.uwCmd) >> 8; aucBuf[1] = (y3.uwCmd) & 0xff; aucBuf[2] = uwSeq >> 8;aucBuf[3] = uwSeq & 0xff;
    /* EMUA下发的二级复位命令长度不是4 */if ((y3.uwLength >= MAX_485_DATA_LEN) || (y3.uwLength < COMMON_485_DATA_LEN))
    {uwLen     =   CCU_485CMD_RESPONSE_HEADLENGTH; aucBuf[4] =   CCU_SMS_ACK_NO; }else {
    CCU_MemCpy(&aucBuf[4], y3.ucBuf, y3.uwLength - COMMON_485_DATA_LEN); aucBuf[y3.uwLength] = CCU_SMS_ACK_OK;
     uwLen  =   y3.uwLength + 1; }CCU_LogWrite;/* 首先响应2级复位命令的响应, 然后上报注册请求 */
     (VOID)CCU_ResponseSMSRqMsg(y3.ulResId, z6, y3.uwCmd, ulRet, uwLen, aucBuf);
      

  3.   

    /* 二级复位命令不需要下发,处理后直接返回处理结果即可 */ return ProcSecondResetCMD(y3.ulResId, y3.uwCmd); }
    /* 对于上层没有设置资源归属的命令和非本CCU管理的部件,不支持下发给对应部件,完成码填写未配置资源归属 */
    ulRet = IsNodeBelongToCCU(y3.ulResId);   if(CCU_TRUE != ulRet && (CCU_RESTART_CMD != (UINT8)y3.uwCmd))
    {  aucBuf[0] = (y3.uwCmd) >> 8; aucBuf[1] = (y3.uwCmd) & 0xff; aucBuf[2] = uwSeq >> 8; aucBuf[3] = uwSeq & 0xff;
     aucBuf[4] = CCU_SMS_ACK_NO;return CCU_ResponseSMSRqMsg(y3.ulResId, z6, y3.uwCmd, CCU_ERR_MPI_UNKOWN_RES_TYPE, 
     CCU_485CMD_RESPONSE_HEADLENGTH, aucBuf);} /* 添加主机下发复位操作的记录, 支持EMUA的复位事件记录 */
    if ((CCU_RESTART_CMD == (UINT8)y3.uwCmd) ||((CCU_485_EMU_TYPE_CF == (UINT8)(y3.uwCmd >> 8))
    && ((CCU_EMUA_RESET == (UINT8)y3.uwCmd)))){CCU_LogWrite;}
    return(SendSMSMsgToPnP(y3.ulResId, y3.uwCmd, uwSeq, z6, TO_PNP_305_TYPE, aucBuf, y3.uwLength));}
    //找出相匹配的接收请求控制表单元
    UINT32 GetRxRqUint(PETH_MSG_T *pstEthMsg, PSEND_SMS_MSG_T pstRsMsg, UINT16 *puwIndex){
    x4     = h5;x41    = h5;x8         = 0;CHECK;uwSeq1 = (UINT16)(((UINT16)pstRsMsg->pucData[2] << 8)
     + pstRsMsg->pucData[3]);z3 {if ( z9 == y4.pstEthMsg ){continue;} uwSeq = (UINT16)(((UINT16)y4.x7[0] 
     << 8) + y4.x7[1]);if (  (y4.pstEthMsg->k7 == pstRsMsg->uwCmd)&&(uwSeq == uwSeq1)
     &&(pstRsMsg->uwSeq == y4.k1) &&(CCU_OK == CompareResId(pstRsMsg->ulResId, y4.pstEthMsg->k5))
     &&(y4.k8 == pstRsMsg->ucDir)) {    break; } }if ( i >= MSG_DEAL_TAB_SIZE )
    { return CCU_ERR_MPI_UNMATCH_RESP;}*puwIndex = (UINT16)i;*pstEthMsg = y4.pstEthMsg;  j2;}
    //进度上报特殊处理
    UINT32 ProcLoadSchOverturn(h2){UINT32 ulSrcResId       = h1;UINT32 ulDestResId    = h1;
    UINT8  ucSrcLoadType    = h6;UINT8  ucDestLoadType   = h6;UINT8  ucSrcBoardType   = h6;
    UINT8  ucDestBoardType  = h6;UINT8  ucSrcSlotId      = h6;UINT8  ucDestSlotId     = h6;
    UINT8  ucSrcLoadMode    = h6; UINT8  ucDestLoadMode   = h6; UINT32 ulSrcLoadSch     = h1;
    UINT32 ulDestLoadSch    = h1;x8                = h1;CHECK;