ASM Help: Walk Function

pvssygino

Utente Silver
4 Luglio 2015
29
3
17
53
Salve a tutti, nel tempo libero sto lavorando ad un bot per un gioco mmo. Volevo automizzare alcuni movimenti del giocatore richiamando la funzione walk che ho trovato reversando il client. Non riesco a capire se essa sia splittata in diverse call o se son io a non capirci una mazza
Aprendo il gioco con un debugger, cercando nelle funzioni compaiono due "walk" :

[Funzione 1]
Codice:
006CCDEA | 68 8CCE6C00              | push gameclient.6CCE8C                                   | 6CCE8C:"walk "
006CCDEF | 8D55 F4                  | lea edx,dword ptr ss:[ebp-C]                             |
006CCDF2 | 0FBFC3                   | movsx eax,bx                                             |
006CCDF5 | E8 BEF1D3FF              | call gameclient.40BFB8                                   |

[Funzione 2]

Codice:
006CCE44 | 8B4D F8                  | mov ecx,dword ptr ss:[ebp-8]                             |
006CCE47 | A1 24D17200              | mov eax,dword ptr ds:[72D124]                            |
006CCE4C | 8B00                     | mov eax,dword ptr ds:[eax]                               |
006CCE4E | BA A8CE6C00              | mov edx,gameclient.6CCEA8                                | 6CCEA8:"walk"
006CCE53 | E8 F4B8E1FF              | call gameclient.4E874C                                   |

Il codice della call primordiale che viene richiamata quando il giocatore starta il movimento è questo (incluse le due funzioni walk):

Codice:
006CCD9C | 55                       | push ebp                                                 |
006CCD9D | 8BEC                     | mov ebp,esp                                              |
006CCD9F | 6A 00                    | push 0                                                   |
006CCDA1 | 6A 00                    | push 0                                                   |
006CCDA3 | 6A 00                    | push 0                                                   |
006CCDA5 | 6A 00                    | push 0                                                   |
006CCDA7 | 6A 00                    | push 0                                                   |
006CCDA9 | 6A 00                    | push 0                                                   |
006CCDAB | 53                       | push ebx                                                 |
006CCDAC | 56                       | push esi                                                 |
006CCDAD | 57                       | push edi                                                 |
006CCDAE | 8BF1                     | mov esi,ecx                                              |
006CCDB0 | 8BDA                     | mov ebx,edx                                              |
006CCDB2 | 33C0                     | xor eax,eax                                              |
006CCDB4 | 55                       | push ebp                                                 |
006CCDB5 | 68 73CE6C00              | push gameclient.6CCE73                                   |
006CCDBA | 64:FF30                  | push dword ptr fs:[eax]                                  |
006CCDBD | 64:8920                  | mov dword ptr fs:[eax],esp                               |
006CCDC0 | A1 10B27200              | mov eax,dword ptr ds:[72B210]                            |
006CCDC5 | 8B00                     | mov eax,dword ptr ds:[eax]                               |
006CCDC7 | 8B40 20                  | mov eax,dword ptr ds:[eax+20]                            |
006CCDCA | 0FB6B8 A2000000          | movzx edi,byte ptr ds:[eax+A2]                           |
006CCDD1 | 0FBFC3                   | movsx eax,bx                                             |
006CCDD4 | 0FBFD6                   | movsx edx,si                                             |
006CCDD7 | 03C2                     | add eax,edx                                              |
006CCDD9 | B9 03000000              | mov ecx,3                                                |
006CCDDE | 99                       | cdq                                                      |
006CCDDF | F7F9                     | idiv ecx                                                 |
006CCDE1 | 4A                       | dec edx                                                  |
006CCDE2 | 0F94C0                   | sete al                                                  |
006CCDE5 | 8845 FF                  | mov byte ptr ss:[ebp-1],al                               |
006CCDE8 | 6A 64                    | push 64                                                  |
006CCDEA | 68 8CCE6C00              | push gameclient.6CCE8C                                   | 6CCE8C:"walk "
006CCDEF | 8D55 F4                  | lea edx,dword ptr ss:[ebp-C]                             |
006CCDF2 | 0FBFC3                   | movsx eax,bx                                             |
006CCDF5 | E8 BEF1D3FF              | call gameclient.40BFB8                                   |
006CCDFA | FF75 F4                  | push dword ptr ss:[ebp-C]                                |
006CCDFD | 68 9CCE6C00              | push gameclient.6CCE9C                                   |
006CCE02 | 8D55 F0                  | lea edx,dword ptr ss:[ebp-10]                            |
006CCE05 | 0FBFC6                   | movsx eax,si                                             |
006CCE08 | E8 ABF1D3FF              | call gameclient.40BFB8                                   |
006CCE0D | FF75 F0                  | push dword ptr ss:[ebp-10]                               |
006CCE10 | 68 9CCE6C00              | push gameclient.6CCE9C                                   |
006CCE15 | 8D55 EC                  | lea edx,dword ptr ss:[ebp-14]                            | [ebp-14]:EntryPoint
006CCE18 | 33C0                     | xor eax,eax                                              |
006CCE1A | 8A45 FF                  | mov al,byte ptr ss:[ebp-1]                               |
006CCE1D | E8 96F1D3FF              | call gameclient.40BFB8                                   |
006CCE22 | FF75 EC                  | push dword ptr ss:[ebp-14]                               | [ebp-14]:EntryPoint
006CCE25 | 68 9CCE6C00              | push gameclient.6CCE9C                                   |
006CCE2A | 8D55 E8                  | lea edx,dword ptr ss:[ebp-18]                            |
006CCE2D | 8BC7                     | mov eax,edi                                              |
006CCE2F | E8 84F1D3FF              | call gameclient.40BFB8                                   |
006CCE34 | FF75 E8                  | push dword ptr ss:[ebp-18]                               |
006CCE37 | 8D45 F8                  | lea eax,dword ptr ss:[ebp-8]                             |
006CCE3A | BA 08000000              | mov edx,8                                                |
006CCE3F | E8 5086D3FF              | call gameclient.405494                                   |
006CCE44 | 8B4D F8                  | mov ecx,dword ptr ss:[ebp-8]                             |
006CCE47 | A1 24D17200              | mov eax,dword ptr ds:[72D124]                            |
006CCE4C | 8B00                     | mov eax,dword ptr ds:[eax]                               |
006CCE4E | BA A8CE6C00              | mov edx,nostaleclientx.6CCEA8                            | 6CCEA8:"walk"
006CCE53 | E8 F4B8E1FF              | call gameclient.4E874C                                   |
006CCE58 | 33C0                     | xor eax,eax                                              |
006CCE5A | 5A                       | pop edx                                                  |
006CCE5B | 59                       | pop ecx                                                  |
006CCE5C | 59                       | pop ecx                                                  |
006CCE5D | 64:8910                  | mov dword ptr fs:[eax],edx                               |
006CCE60 | 68 7ACE6C00              | push gameclient.6CCE7A                                   |
006CCE65 | 8D45 E8                  | lea eax,dword ptr ss:[ebp-18]                            |
006CCE68 | BA 05000000              | mov edx,5                                                |
006CCE6D | E8 B682D3FF              | call gameclient.405128                                   |
006CCE72 | C3                       | ret                                                      |

La chiamata a questa funzione nel modulo avviene solamente una volta :

Codice:
0053F70E | 8947 04                  | mov dword ptr ds:[edi+4],eax                             |
0053F711 | A1 64DB7200              | mov eax,dword ptr ds:[72DB64]                            |
0053F716 | 8B00                     | mov eax,dword ptr ds:[eax]                               |
0053F718 | 66:8B4F 06               | mov cx,word ptr ds:[edi+6]                               |
0053F71C | 66:8B57 04               | mov dx,word ptr ds:[edi+4]                               |
0053F720 | E8 77D61800              | call gameclient.6CCD9C                                   |

Sembra che edi+6 e edi+4 siano proprio le coordinate x,y del giocatore. Ma provando a cercare con chat engine le coordinate del player, compaiono molti registri in cui son presenti più volte le coordinate x,y del player. Molto probabilmente ci saranno altre funzioni che terranno d'occhio la funzione walk con i suoi parametri. Prendendo un address che contiene le coordinate del player e visualizzando con chat engine quali funzioni scrivono su quell'address, ogni volta escono funzioni diverse (probabilmente di controllo o gestione degli errori). Vorrei sapere se c'è un modo per arrivare ad individuare un solo indirizzo e che sia proprio quello della funzione movimento e non di controllo posizione o quant'altro
 
In questo disassembly "walk" e "walk " sono solo stringhe, trattandosi di un MMO le coordinate o l'azione stessa dovranno anche essere inviate a un server remoto. Si vede troppo poco per poter capire a cosa serve davvero questa parte di codice, potrebbero essere delle stringhe di log, qualcosa che viene inviato al server, e non si vede nemmeno da dove arrivano i dati che trovi in edi + 4 e + 6 ne dove vanno a finire le chiamate interne.
 
Grazie per la risposta @JunkCoder. Mi stai dicendo che non c'è una verà e propria funzione walk, ma solo una stringa che ne indica il pacchetto? Dovrei quindi analizzare la funzione send() e richiamarla utilizzando walk come parametro?
 
Grazie per la risposta @JunkCoder. Mi stai dicendo che non c'è una verà e propria funzione walk, ma solo una stringa che ne indica il pacchetto? Dovrei quindi analizzare la funzione send() e richiamarla utilizzando walk come parametro?

Dipende da come è stato implementato il gioco, non avendo i simboli non conosci i nomi delle funzioni, avrà anche un suo protocollo, quindi non puoi semplicemente inviare via socket la stringa "walk" ma devi comunicare per com'è stato progettato. Nel disassembly ti è sfuggito un nostaleclientx, e cercando su google i retro di questo gioco sembra che usi ProtoBuf nel protocollo. Reversare questo aspetto è molto impegnativo, ti consiglio di individuare semplicemente la funzione che fa partire il tutto (sia movimento grafico sia invio via socket), se debuggando hai visto che è effettivamente 6CCD9C allora ti conviene chiamarla direttamente dalla dll del tuo bot. In C sarebbe una cosa tipo:

C:
typedef void (__cdecl* WalkFn)(unsigned short X, unsigned short Y);

//...
WalkFn walk = (WalkFn)(gameImageBase + WalkFunctionOffset);
walk(123, 456);
 
Dipende da come è stato implementato il gioco, non avendo i simboli non conosci i nomi delle funzioni, avrà anche un suo protocollo, quindi non puoi semplicemente inviare via socket la stringa "walk" ma devi comunicare per com'è stato progettato. Nel disassembly ti è sfuggito un nostaleclientx, e cercando su google i retro di questo gioco sembra che usi ProtoBuf nel protocollo. Reversare questo aspetto è molto impegnativo, ti consiglio di individuare semplicemente la funzione che fa partire il tutto (sia movimento grafico sia invio via socket), se debuggando hai visto che è effettivamente 6CCD9C allora ti conviene chiamarla direttamente dalla dll del tuo bot. In C sarebbe una cosa tipo:

C:
typedef void (__cdecl* WalkFn)(unsigned short X, unsigned short Y);

//...
WalkFn walk = (WalkFn)(gameImageBase + WalkFunctionOffset);
walk(123, 456);
Esatto, la cosa che volevo evitare è l'encrypt dei pacchetti, quindi non utilizzare la funzione send per inviare il pacchetto walk, ma richiamare quello che sta su e far si che poi sia il gioco stesso a proseguire con le call. Comunque grazie mille per l'aiuto, non appena possibile verifico se funziona