追逐自己的梦想----------辅助制作第二十七课:身上装备更换的分析与实现
2015-03-26 20:36
120 查看
分析装备更换相关功能: 1.肯定会想服务器发送数据,表示更换某件装备 2.访问物品对象 3.访问对象属性服务器ID //为了分辨不同物品 分析思路: 1.从发包回溯分析 2.从物品对象访问的代码分析 由于也访问到了背包移动物品对象,所以我们可以接着上面几课分析 007B382D |> 8B8F 08160000 MOV ECX,DWORD PTR DS:[EDI+1608] 007B3833 |. 8B97 D01B0000 MOV EDX,DWORD PTR DS:[EDI+1BD0] 007B3839 |. 53 PUSH EBX ; 007B383A |. 51 PUSH ECX ; 007B383B |. 52 PUSH EDX ; 007B383C |. 8BCF MOV ECX,EDI 007B383E |. E8 AD5FFFFF CALL Client.007A97F0 ; 存仓库2 先转到这个地址 下断 可以发现 push 3 push 0 push 0 ecx = 1AD18A68 call 007B3828 |. /E9 BF000000 JMP Client.007B38EC 007B382D |> |8B8F 08160000 MOV ECX,DWORD PTR DS:[EDI+1608] 007B3833 |. |8B97 D01B0000 MOV EDX,DWORD PTR DS:[EDI+1BD0] 007B3839 |. |53 PUSH EBX ; 3 武器所在的位置 007B383A |. |51 PUSH ECX ; 0 007B383B |. |52 PUSH EDX ; 0x0 007B383C |. |8BCF MOV ECX,EDI ; 1AD18A68 007B383E |. |E8 AD5FFFFF CALL Client.007A97F0 ; 换装备 CALL 007B3843 |. |E9 A4000000 JMP Client.007B38EC 然后分析EDI就得到这个基址 004C0622 |. 51 PUSH ECX 004C0623 |. 8B88 7C020000 MOV ECX,DWORD PTR DS:[EAX+27C] 004C0629 |. 8B89 2C040000 MOV ECX,DWORD PTR DS:[ECX+42C] 004C062F |. 52 PUSH EDX 004C0630 |. E8 7B1D0000 CALL Client.004C23B0 004C0635 |. 8B15 C8671B03 MOV EDX,DWORD PTR DS:[31B67C8] ; 身上装备的基址 004C063B |. 8B92 48040000 MOV EDX,DWORD PTR DS:[EDX+448] 004C0641 |. 33C9 XOR ECX,ECX 004C0643 |. B8 FCF5F400 MOV EAX,Client.00F4F5FC 004C0648 |> 85D2 /TEST EDX,EDX 004C064A |. 74 0F |JE SHORT Client.004C065B 004C064C |. 8B30 |MOV ESI,DWORD PTR DS:[EAX] 004C064E |. 3B72 54 |CMP ESI,DWORD PTR DS:[EDX+54] 先测试 mov edi, 31B67C8 mov edi,[edi] MOV ECX,DWORD PTR DS:[EDI+1608] MOV EDX,DWORD PTR DS:[EDI+1BD0] PUSH 3 PUSH ECX PUSH EDX MOV ECX,EDI CALL 007A97F0 发现这个就是更换装备的CALL 具体实现代码: BOOL TBACKPACK_LIST::MoveGoodsToEquipm(char* szpName , int EquipmPos) //移动装备到身上的装备栏 { int niIndex = GetGoodsIndexForName(szpName); if (niIndex == -1){ return FALSE; } SelGoods(niIndex); __try{ __asm{ mov edi, Base_EquipmentAddr mov edi, [edi] MOV ECX, DWORD PTR DS : [EDI + 0x1608] MOV EDX, DWORD PTR DS : [EDI + 0x1BD0] mov ebx, EquipmPos PUSH ebx PUSH ECX PUSH EDX MOV ECX, EDI mov eax, Base_MoveGoodsToDepotsCall call eax } } __except (1){ DbgPrintf_Mine("BOOL TBACKPACK_LIST::MoveGoodsToEquipm(char* szpName) 出现异常"); } } 最好在分析过程中添加一个枚举类型来保存装备中各个装备相对的位置 typedef enum Equimp{ nd衣服, nd左护手, nd右护手, nd武器 }_Equimp; 这样在上面的函数中就可以传这个参数来代替手动传第二个参数了
相关文章推荐
- 追逐自己的梦想----------辅助制作第三十八课:物品出售的分析和实现
- 追逐自己的梦想----------辅助制作第三十五课:从仓库取出N个物品分析与实现
- 追逐自己的梦想----------辅助制作第九课:分析怪物列表及怪物属性的封装等
- 追逐自己的梦想----------辅助制作第二十三课:挂机选项卡的实现
- 追逐自己的梦想----------辅助制作第十七课:实现技能列表的遍历及判断技能是否可用
- 追逐自己的梦想----------辅助制作第二十六课:存仓库call实现
- 追逐自己的梦想----------辅助制作第五课:分析并测试物品使用CALL
- 追逐自己的梦想----------辅助制作第一课:人物属性分析
- 追逐自己的梦想----------辅助制作第二十八课:打开系统NPC CALL分析
- 追逐自己的梦想----------辅助制作第三十一课:向仓库存入N个物品对象分析
- 追逐自己的梦想----------辅助制作第三十三课:向仓库存入N个物品对象汇编实现代码
- 追逐自己的梦想----------辅助制作第十五课:实现动态更新基址
- 追逐自己的梦想----------辅助制作第十一课:选怪功能分析
- 追逐自己的梦想----------辅助制作第二十二课:分析修炼条件的判断
- 追逐自己的梦想----------辅助制作第二课:人物气功加点分析
- 追逐自己的梦想----------辅助制作第三十七课:物品购买实现
- 追逐自己的梦想----------辅助制作第三十六课:物品购买分析
- 追逐自己的梦想----------辅助制作第二十九课:分析打开NPC后功能打开
- 追逐自己的梦想----------辅助制作第二十五课:存仓库call分析
- 追逐自己的梦想----------辅助制作第二十一课:分析技能自动修炼call