分析装备更换相关功能:
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;
这样在上面的函数中就可以传这个参数来代替手动传第二个参数了