追逐自己的梦想----------辅助制作第三十课: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
原创粉丝点击