追逐自己的梦想----------辅助制作第二十七课:身上装备更换的分析与实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值