改造型第一步是用GetCommandLine獲取參數
啟動時會給一行參數例如
"8390" "LoL.exe" "Air\LOLClient.exe" "124.108.140.83 5105 lsdRQl1DdNsRYBe9mNy4YA== PlayerID"
目的就是為了取得 PlayerID,這在後面 Load Screen 那裡要用到
修改造型主要HOOK在兩個地方
//================================================================================
第一個 是 HOOK00(int this, int a2, char a3, char a4, int a5, int a6)
int ecx, int [ebp+8], char [ebp+C], char [ebp+10], int [ebp+14], int [ebp+18]
請對照 HOOK00_1(int par1, void *lp, int flag, int par2)
par1 = a5, lp = a6, a3 = flag, par2 = a4
有用的其實只有a6,其他都是多餘的。
要檢查的話只要檢查 a3 = 3, a4 = 7, a6 = 0x65 這個情況,a2 = 0
FF ?? 09 8B ?? ?? ?? FF ?? 05 ?? ?? FF ?? 01
0032B19E - 8D 46 11 - lea eax,[esi+11]
0032B1A1 - 50 - push eax
0032B1A2 - 8D 4C 24 44 - lea ecx,[esp+44]
0032B1A6 - E8 F58CE3FF - call 00163EA0
0032B1AB - C7 44 24 68 00000000 - mov [esp+68],00000000 : [00905A4D]
0032B1B3 - 8D 54 24 40 - lea edx,[esp+40]
[COLOR="Red"]0032B1B7 - FF 76 09 - push [esi+09] skinID
0032B1BA - 8B 4F 34 - mov ecx,[edi+34]
0032B1BD - 52 - push edx
0032B1BE - FF 76 05 - push [esi+05]
0032B1C1 - 8B 01 - mov eax,[ecx]
[COLOR="red"]0032B1C3 - FF 76 01 - push [esi+01] PlayerID
0032B1C6 - FF 50 28 - call dword ptr [eax+28]
0032B1C9 - 8D 4C 24 40 - lea ecx,[esp+40]
0032B1CD - E8 2E8DE3FF - call 00163F00
0032B1D2 - EB 35 - jmp 0032B209
class LoadingScreenHeroSkin
{
public:
char a6; //0x00 esi
int PlayerID; //0x01 esi+1
int Unknown_5; //0x05 esi+5
char skinID; //0x09 esi+9
PAD(0x7); //0x0A esi+10
PAD(0x5); //0x11 esi+17 英雄名稱 ex:Ezreal
PAD(0x20); //0x16 esi+22
int Unknown_54; //0x36 esi+54
};
檢查 PlayerID 是否一樣,一樣就改 skinID 就可以換造型。
由於是5V5所以有10個client端,上面的 LoadingScreenHeroSkin 會跑10次。
需要自行計算自己的角色是在第幾個位置,從0~9計算出 MySeat 和 GameSeat
建議取名 clientID 不是 GameSeat
//================================================================================
第二個 是 void _stdcall HOOKHERO(DWORD _ebx)
LeagueofLegends 4.18 這裡改用ECX傳遞給ESI了,用 IDA 找 Creating Hero...
50 8D 44 24 78 64 A3 00 00 00 00 8B ?? 83
00186EBC - 50 - push eax
00186EBD - 8D 44 24 78 - lea eax,[esp+78]
00186EC1 - 64 A3 00000000 - mov fs:[00000000],eax
[COLOR="Red"]00186EC7 - 8B F1 - mov esi,ecx
00186EC9 - 83 3D 4C0C4E01 00 - cmp dword ptr [014E0C4C],00
00186ED0 - 0F84 7E040000 - je 00187354
00186ED6 - 68 4C290901 - push 0109294C [COLOR="Red"]Creating Hero...
00186EDB - 6A 00 - push 00
00186EDD - 6A 01 - push 01
00186EDF - 6A 03 - push 03
00186EE1 - E8 9A3F0700 - call 001FAE80
class Creating_Hero
{
public:
DWORD ECXtoESI //0x00 esi
PAD(0x1); //0x04 esi+4
int ObjID; //0x05 esi+5
int clientID; //0x09 esi+9
short NodeID; //0x0D esi+13
short Team; //0x0F esi+15 等於1紫方100 等於0藍方200
char Unknown_17; //0x11 esi+17
int skinID; //0x12 esi+18 造型編號
char *Name; //0x16 esi+22 召喚師名稱
PAD(0x76); //0x20 esi+23 召喚師名稱字元長度
char Skin; //0x96 esi+150 英雄名稱 ex:Ezreal
PAD(0x27); //0x97 esi+151 英雄名稱字元長度
float Unknown_190; //0xBE esi+190
float Unknown_194; //0xC2 esi+194
int Unknown_198; //0xC6 esi+198
short Unknown_202; //0xCA esi+202
};
使用第一個 HOOK00 算出來的 GameSeat 和 clientID 比對後,修改 skinID 即可