对于新手来说 下边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 了解
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 了解
解决方案 »
- 转贴一封:Delphi程序员现状(招聘感想、招聘试题)
- 给某个ntfs的文件夹设置访问用户权限
- 为什么我开发的一个小的C/S程序在退出后进程表中仍然存在?
- 请问用install shield 如何将sqlserver的数据库驱动一起?
- 关于实现QQ的系统消息功能
- CodeSite求助
- access中提取一个字段的子串是哪个函数?
- [吐血推荐]:8000行源程序,欢迎下载!
- 怎么用HELP好?比如我想查把DOUBLE转成STR型怎么查。思路
- 如何编程给ToolBar控件加入一个按钮!(急)!肯定加分
- 点击TreeView1列表打开对应的窗体
- delphi如何调用PPT中的显示和隐藏墨迹标记,有API可以调用么?
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));
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);
/* 对于上层没有设置资源归属的命令和非本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;