Algorithme du sanctuaire

De T4C Tech
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)