Algorithme du sanctuaire
Aller à la navigation
Aller à la recherche
Calcul du sanctuaire en fonction des coordonnées et vis-versa
Cette page vous expose l'algorithmes de calcul du sanctuaire en fonction des coordonnées et de la récupération des coordonnées en fonction du sanctuaire.
Reverse
Pour la recherche assembleur j'ai effectué une simple recherche sur la valeur 20020 (4E34h) qui est l'identifiant du flag sanctuaire d'un personnage.
.text:0041C5BC loc_41C5BC: ; CODE XREF: Character::Death(_ATTACK_STRUCTURE *,Unit *)+1279�j .text:0041C5BC ; Character::Death(_ATTACK_STRUCTURE *,Unit *)+1366�j .text:0041C5BC mov edx, [esi] .text:0041C5BE push ebx .text:0041C5BF push 4E34h ; Id du flag sanctuaire (20020 en décimale) .text:0041C5C4 mov ecx, esi .text:0041C5C6 mov [ebp+var_30], ebx .text:0041C5C9 call dword ptr [edx+0Ch] ; Lecture de la valeur contenue dans le flag 20020 .text:0041C5CC cmp eax, ebx .text:0041C5CE jz short loc_41C617 .text:0041C5D0 mov edi, eax .text:0041C5D2 mov ebx, eax .text:0041C5D4 and eax, 0FFh ; 255 en décimal .text:0041C5D9 shr edi, 14h ; Decalage des bits vers la droite de 20 .text:0041C5DC shr ebx, 8 ; Décalage des bits vers la droite de 8 .text:0041C5DF push eax .text:0041C5E0 and edi, 0FFFh ; 4095 en décimal .text:0041C5E6 and ebx, 0FFFh ; 4095 en décimal .text:0041C5EC mov [ebp+var_80], eax .text:0041C5EF call ?GetWorld@TFCMAIN@@SAPAVWorldMap@@G@Z ; TFCMAIN::GetWorld(ushort) .text:0041C5F4 add esp, 4 .text:0041C5F7 test eax, eax .text:0041C5F9 jz short loc_41C617 .text:0041C5FB xor ecx, ecx .text:0041C5FD mov cx, [eax+2Ch] .text:0041C601 cmp edi, ecx .text:0041C603 jge short loc_41C617 .text:0041C605 xor edx, edx .text:0041C607 mov dx, [eax+2Eh] .text:0041C60B cmp ebx, edx .text:0041C60D jge short loc_41C617 .text:0041C60F test edi, edi .text:0041C611 jl short loc_41C617 .text:0041C613 test ebx, ebx .text:0041C615 jge short loc_41C62B .text:0041C617
Dans notre cas, vu que le calcul du sanctuaire est relativement simple, nous ne chercherons pas dans le désassembleur la fonction inverse de celui-ci, une simple reécriture inverse de notre algorithmes suffira pour en avoir l'evers.
Algorithme du calcul du sanctuaire
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int x = 1400, y = 400, w = 0;
__int64 sanctuary = 0;
cout << "Start coordinates : " << x << "," << y << "," << w << "\n";
sanctuary = ((short)x << 20) + ((short)y << 8) + (short)w; // (x * 1048576) + (y * 256) + w;
cout << "Sanctuary : " << sanctuary << "\n";
x = ((short)(sanctuary >> 20) & 0x0FFF);
y = ((short)(sanctuary >> 8) & 0x0FFF);
w = sanctuary & 0x0FF;
cout << "Calculates the coordinates : " << x << "," << y << "," << w << "\n";
system("PAUSE");
return EXIT_SUCCESS;
}
--Mestoph 16 mars 2008 à 17:51 (MSK)