追逐自己的梦想----------辅助制作第三十课:NPC对话更正以及封装查找NPC对象函数
来源:互联网 发布:有什么可靠的网络兼职 编辑:程序博客网 时间:2024/05/19 00:39
今天我们就是测试了上次写的NPC对话和仓库,发现上次找到call并不是真正的打开NPC的call,所以我们需要接着上节课的分析来分析真正的打开仓库call,本次我们要测试的
就是上节课中测试的15个关键位置
004D02B8 - 81 FA 0F270000 - cmp edx,0000270F 004D02BE - 0F87 C8000000 - ja Client.exe+D038C 004D02C4 - 8B 0C 95 B0BE1D03 - mov ecx,[edx*4+Client.exe+2DDBEB0] <<1 004D02CB - 85 C9 - test ecx,ecx 004D02CD - 0F84 B9000000 - je Client.exe+D038C 经过测试 1 的call失败 mov edi, [31DBEAC] MOV EAX,DWORD PTR DS:[EDI+14B8] push eax mov ecx, edi CALL 004D02B0 返回到上层call下断点 一直被断下,所以这个call被排除 **************************************************************************************** 004E8A59 - E8 021A1100 - call Client.exe+1FA460 004E8A5E - 8B 97 B8140000 - mov edx,[edi+000014B8] 004E8A64 - 8B 04 95 B0BE1D03 - mov eax,[edx*4+Client.exe+2DDBEB0] <<2 004E8A6B - 85 C0 - test eax,eax 004E8A6D - 74 4A - je Client.exe+E8AB9 返回到了与第一个call相同的上层call,同样是一直被断下,所以这个地址被排除 ***************************************************************************************** 004E8ABF - 3D 10270000 - cmp eax,00002710 004E8AC4 - 73 1B - jae Client.exe+E8AE1 004E8AC6 - 8B 0C 85 B0BE1D03 - mov ecx,[eax*4+Client.exe+2DDBEB0] <<3 004E8ACD - 85 C9 - test ecx,ecx 004E8ACF - 74 10 - je Client.exe+E8AE1 同上,被排除 **************************************************************************************** 004E8C01 - 81 FE FFFF0000 - cmp esi,0000FFFF 004E8C07 - 74 47 - je Client.exe+E8C50 004E8C09 - 8B 0C B5 B0BE1D03 - mov ecx,[esi*4+Client.exe+2DDBEB0] <<4 004E8C10 - 85 C9 - test ecx,ecx 004E8C12 - 74 28 - je Client.exe+E8C3C 同上,被排除 *************************************************************************************** 004C93D6 - 3D 0F270000 - cmp eax,0000270F 004C93DB - 77 2B - ja Client.exe+C9408 004C93DD - 8B 04 85 B0BE1D03 - mov eax,[eax*4+Client.exe+2DDBEB0] <<5 004C93E4 - 85 C0 - test eax,eax 004C93E6 - 74 20 - je Client.exe+C9408 返回到上层 得到call mov esi ,0x128A push esi mov edi , [31DBEAC] mov ecx, edi CALL 004C93D0 经过测试,失败 ********************************************************************************** 004CFA76 - 81 FA 0F270000 - cmp edx,0000270F 004CFA7C - 0F87 BB000000 - ja Client.exe+CFB3D 004CFA82 - 8B 0C 95 B0BE1D03 - mov ecx,[edx*4+Client.exe+2DDBEB0] <<6 004CFA89 - 85 C9 - test ecx,ecx 004CFA8B - 0F84 AC000000 - je Client.exe+CFB3D mov esi ,0x128A push esi mov edi , [31DBEAC] mov ecx, edi CALL 004CFA70 经过测试,失败 ******************************************************************************** 004E8D6D - 3D FFFF0000 - cmp eax,0000FFFF 004E8D72 - 0F84 AF000000 - je Client.exe+E8E27 004E8D78 - 8B 0C 85 B0BE1D03 - mov ecx,[eax*4+Client.exe+2DDBEB0] <<7 004E8D7F - 85 C9 - test ecx,ecx 004E8D81 - 0F84 A0000000 - je Client.exe+E8E27 同123,调用到了系统接口,一直被调用,所以排除 ****************************************************************************** 004CFB5D - 3D FFFF0000 - cmp eax,0000FFFF 004CFB62 - 74 2A - je Client.exe+CFB8E 004CFB64 - 83 3C 85 B0BE1D03 00 - cmp dword ptr [eax*4+Client.exe+2DDBEB0],00 <<8 004CFB6C - 74 20 - je Client.exe+CFB8E 004CFB6E - 8B 0C 85 B0BE1D03 - mov ecx,[eax*4+Client.exe+2DDBEB0] 跟进去,有点看不懂,所以暂时留到这,不过测试还是失败 push 0 push 2e5cff64 mov edi ,[31dbeac] mov ecx, edi call 004cfb50 *************************************************************************************** 004CFB64 - 83 3C 85 B0BE1D03 00 - cmp dword ptr [eax*4+Client.exe+2DDBEB0],00 004CFB6C - 74 20 - je Client.exe+CFB8E 004CFB6E - 8B 0C 85 B0BE1D03 - mov ecx,[eax*4+Client.exe+2DDBEB0] <<9 004CFB75 - 8B 11 - mov edx,[ecx] 004CFB77 - 8B 42 04 - mov eax,[edx+04] 同8 *********************************************************************************** 004E8DCB - D9 5E 2C - fstp dword ptr [esi+2C] 004E8DCE - 8B 95 FCAAFFFF - mov edx,[ebp-00005504] 004E8DD4 - 8B 04 95 B0BE1D03 - mov eax,[edx*4+Client.exe+2DDBEB0] <<10 004E8DDB - 50 - push eax 004E8DDC - 56 - push esi 同123 ,调用系统API ********************************************************************************** 004E1573 - E8 08324600 - call Client.exe+544780 004E1578 - 8B 4E 14 - mov ecx,[esi+14] 004E157B - 8B 14 8D B0BE1D03 - mov edx,[ecx*4+Client.exe+2DDBEB0] <<11 004E1582 - 50 - push eax 004E1583 - 52 - push edx 应该是跳转到系统call内部去了,具体有点不明白 ***************************************************************************** 004E158D - 0F84 D6090000 - je Client.exe+E1F69 004E1593 - 8B 46 14 - mov eax,[esi+14] 004E1596 - 8B 3C 85 B0BE1D03 - mov edi,[eax*4+Client.exe+2DDBEB0] <<12 004E159D - 8B 17 - mov edx,[edi] 004E159F - 8B 42 04 - mov eax,[edx+04] 同11 *************************************************************************** 004E1C81 - 0F85 B9020000 - jne Client.exe+E1F40 004E1C87 - 8B 46 14 - mov eax,[esi+14] 004E1C8A - 8B 0C 85 B0BE1D03 - mov ecx,[eax*4+Client.exe+2DDBEB0] <<13 004E1C91 - 85 C9 - test ecx,ecx 004E1C93 - 74 7F - je Client.exe+E1D14 004E1D06 - 74 49 - je Client.exe+E1D51 004E1D08 - 8B 46 14 - mov eax,[esi+14] 004E1D0B - 8B 0C 85 B0BE1D03 - mov ecx,[eax*4+Client.exe+2DDBEB0] <<14 004E1D12 - EB 2D - jmp Client.exe+E1D41 004E1D14 - 8B 4E 14 - mov ecx,[esi+14] 0073EACD - 8B 15 ACBE1D03 - mov edx,[Client.exe+2DDBEAC] 0073EAD3 - 8B 82 B8140000 - mov eax,[edx+000014B8] 0073EAD9 - 8B 0C 85 B0BE1D03 - mov ecx,[eax*4+Client.exe+2DDBEB0] <<15 0073EAE0 - 51 - push ecx 0073EAE1 - 8B 0D D81ED000 - mov ecx,[Client.exe+901ED8] 测试的就是这个call周围的call最后我们找到的call就是以下的汇编代码:push 0push 0push 0x401mov ecx , XXXXmov ecx , [ecx]mov eax , [ecx + 0x4]call eax从上面的代码可以发现,我们仅仅需要一个ecx的值,从OD中下断点可以发现这个值就是NPC对象,所以下面我们要做的就是封装一个函数来实现获取NPC对象函数原型如下DWORD GetNpcObjForName(char* szpName); 具体函数实现如下:首先我们需要在周围对象中添加个一个DWORD 类型变量 ndBaseAddr;然后在周围对象的结构体的初始化函数GetData()中进行初始化具体代码就是t_monlist[i].ndBaseAddr = ndObj;然后下面要做的就是函数的具体实现了DWORD GetNpcObjForName(char* szpName){for(dword i = 0 ; i < 100 ; i ++){if(t_monlist[i].szpName == NULL){continue;}if(strcmp(szpName , t_monList[i].szpName) == 0){return t_monlist.ndBaseAddr;}return NULL;} 以上就完成了就获取NPC对象的封装,下面就只需要实现对NPC对象打开的函数的封装就可以实现代码了下面我们需要用到一个函数,可以封装在周围对象列表中。BOOL OpenNpcForName(char * szpName){DWORD ndObj = GetNpcObjForName(szpName);__try{ g_tRileObj.getData()->SelObjForName(szpName);__asm{<pre name="code" class="cpp">push 0push 0push 0x401mov ecx , ndObjmov ecx , [ecx]mov eax , [ecx + 0x4]call eax
}
}__except(1){
dbgPrint_Mine("BOOL OpenNpcForName(char * szpName)出现异常");
}
}
以上就完成了对打开NPC的封装,上面函数用到了一个人物角色类的函数
SelObjForName(char* szpName);
这个函数的具体实现如下
BOOL SelObjForName(char* szpName){
for(DWORDI = 0 ; I < 100 ; I++){
if(g_tMinlist.getData()->t_monlist[i].szpName == NULL){
continue;
}
if(strcmp(szpName, g_tMinlist.getData()->t_monlist[i].szpName)){
SelObj(g_tMinlist.getData()->t_monlist[i].IndexForAllObj);
return TRUE;
}
}
return FALSE;
}
以上代码完善了上几节课分析的打开NPC的功能。学习需要不断积累,慢慢的改正学习中的错误,就一定会成功的
0 0
- 追逐自己的梦想----------辅助制作第三十课:NPC对话更正以及封装查找NPC对象函数
- 追逐自己的梦想----------辅助制作第二十八课:打开系统NPC CALL分析
- 追逐自己的梦想----------辅助制作第二十九课:分析打开NPC后功能打开
- 追逐自己的梦想----------辅助制作第三十四课:向仓库存入N个物品对象函数封装实现
- 追逐自己的梦想----------辅助制作第十课:分析动作数组以及攻击捡物品等功能call的封装
- 追逐自己的梦想----------辅助制作第七课:封装调试函数OutputDebugString(),使其可调试任意参数个数
- 追逐自己的梦想----------辅助制作第十二课:选怪功能封装
- 追逐自己的梦想----------辅助制作第十三课:快速查找基址
- 追逐自己的梦想----------辅助制作第一课:人物属性分析
- 追逐自己的梦想----------辅助制作第九课:分析怪物列表及怪物属性的封装等
- 追逐自己的梦想----------辅助制作第三课:注入辅助窗口到游戏进程中
- 追逐自己的梦想----------辅助制作第三十一课:向仓库存入N个物品对象分析
- 追逐自己的梦想----------辅助制作第三十二课:向仓库存入N个物品对象分析缓冲区解密
- 追逐自己的梦想----------辅助制作第三十三课:向仓库存入N个物品对象汇编实现代码
- 追逐自己的梦想----------辅助制作第二十二课:分析修炼条件的判断
- 追逐自己的梦想----------辅助制作第二十三课:挂机选项卡的实现
- 追逐自己的梦想----------辅助制作第二十四课:寻路call的分析
- 追逐自己的梦想----------辅助制作第二十七课:身上装备更换的分析与实现
- [codility] EquiLeader解题报告
- 使用zinnia制作android手写输入功能(下)-------------------在项目中使用zinnia
- HDU 1241--Oil Deposits【DFS】
- keil通过jlink下载程序时提示cannot stop arm device
- Linux环境下段错误的产生原因及调试方法
- 追逐自己的梦想----------辅助制作第三十课:NPC对话更正以及封装查找NPC对象函数
- FZU 2034-Password table(模拟)
- iPhone 6 / 6 Plus 设计·适配方案(真正版)
- tabulate函数
- 第四周项目1(2)-三角形类的构造函数
- jquery判断checkbox是否选中及改变checkbox状态
- dojo/domReady! 中感叹号的作用
- 数据库连接代码片段
- Android中的文件下载——DownLoadManager