修改皮肤的原理:
在游戏的目录里文件Game\Logs\Game - R3d Logs
可以查看到如以下2行关键字
Spawning champion (英雄名称) with skinID 皮肤编号 on team 队伍分类 for clientID 游戏ID and summonername (召唤师名称)
(is 玩家或AI判断)
Hero 英雄名称(皮肤编号) created for 召唤师名称
这时候用IDA静态反汇编主程序寻找以上关键字,可以得知由以下CALL引用:
sub_658E90(召唤师名称, 英雄名称, 皮肤编号, 队伍分类, 未知参数, 游戏编号, 未知参数, 未知参数, 判断是否为对战或AI, 未知参数)
其中队伍分类只分成蓝、紫方分別为100和200
游戏编号是英雄在队伍里的编号,10位召唤师编号0~9
特征码(Array Of Byte):57 FF 73 13 8D BB 97 00 00 00 8B D7 E8
以下是寻找到的参数调用
mov eax,[ebx+09]
mov [ecx],eax
lea ecx,[esp+0000024C]
cmp dword ptr [esp+00000260],10
lea eax,[esp+00000218]
push eax
cmovae ecx,[esp+00000250]
mov eax,00000064
cmp byte ptr [ebx+0F],00
cmovne edi,eax
push edi
push [ebx+13]
lea edi,[ebx+00000097]
mov edx,edi
call 00258E90
esp+24C = ecx = 召唤师名称
队伍分类预设值是200
检查 [ebx+F] 是否为1
是1的话将队伍分类改为100
[ebx+13] = 皮肤编号
[ebx+97] = 英雄名称
总结 %后为格式化字符串:
- ecx = 召唤师名称
- ebx+5 = (DWORD) ObjID %d
- ebx+9 = (DWORD) clientID %i
- ebx+D = (BYTE) NodeID %d
- ebx+F = 0(200) or 1(100) 队伍判断(蓝 or 紫)
- ebx+10h = (BYTE) 有值为召唤师,不然就是AI
- ebx+13h = (BYTE) skinID %d
- ebx+97h = 英雄名称 %s
PATCH掉sub_658E90 (不一定就是sub_658E90 ,游戏更新便有几率变化) 后以如下方式进行参数替换:
[ post]__asm
{
mov summonername,ecx
pushad
lea edi,[ebx+97h]
mov champion,edi
call Get_champion_skinID //根据英雄名字取预先设置好的皮肤ID,可事先做好map,或直接赋值[ebx+13h] ,当然,编号必须与英雄是对应的。英雄与皮肤是一对多关系。
cmp NameCheck,0
je Normal
mov NameCheck,0
cmp skinID,0
je Normal
mov eax,skinID
mov [ebx+13h],eax
Normal:
popad
push [ebx+13h]
lea edi,[ebx+97h]
jmp [originalPatchAddress]
}[/post]
以上虽为台服LOL换肤做法,其实在国服的实现方法也是一模一样的。方法也不止这一种。