
Originally Posted by
luizimloko
Code:
MOV ECX, DWORD PTR DS:[10C8FD28]; Move para ECX o endereço "10C8FD28" que no caso é o Weapon Manager
MOV EAX, DWORD PTR DS:[ECX + ESI * 4]; Move para EAX ECX do nosso endereço do Weapon Manager ali soma com ESI é o comparador dos Index das armas do jogo e multiplica com 4 *(FLOAT *)(Ponteiro do WeaponManager + i /* ESI */ * 4);
FLD 1; FLD é armazenador em FLOAT /* *(FLOAT *) */
PUSH "ReloadAnimRatio"; O jogo vai reconhecer essa string lá como a animação do recarregamento da arma
FSTP DWORD PTR DS:[EAX + 0xC38]; FSTP modifica a stack do registrador EAX adicionando a ela a offset 0xC38 do recarregamento então ficando
*(FLOAT *)(WeaponManagerEndereço + 0xC38 + Index /* ESI */ * 4) = 0.0f;
Vamos aos erros:
MOV ECX, DWORD PTR DS:[10C8FD28]; Move para ECX o endereço "10C8FD28" que no caso é o Weapon Manager
O certo seria move o conteúdo de "10C8FD28" que no caso é outro endereço para ECX, equivalente em C++ _ECX = *(DWORD*)0x10C8FD28;
MOV EAX, DWORD PTR DS:[ECX + ESI * 4];
O mesmo que o de cima a diferença é que aqui ele calcula o endereço, equivalente em C++ _EAX = *(DWORD*)(_ECX+_ESI*4);
FLD 1; FLD é armazenador em FLOAT /* *(FLOAT *) */
FLD é o mesmo que push, a diferença é que a FPU tem sua própria stack que vai de st(0) a st(7), FLD sempre coloca o valor no topo da stack que no caso é st(0), a FPU suporta float(4bytes)32bits, double(8bytes)64bits e TBYTE(10bytes)80bits.
FSTP DWORD PTR DS:[EAX + 0xC38]; FSTP modifica a stack do registrador EAX adicionando a ela a offset 0xC38 do recarregamento então ficando,
FSTP é o mesmo que pop, a diferença é que ele recupera o valor do topo da stack da FPU ou seja de st(0), o código acima recupera o valor de st(0) e joga para o endereço [EAX + 0xC38].
O conjunto de instruções fld e fstp em C++ *(float*)(_EAX+0xC38) = 1;