Domanda:
IDA PRO Hex-Rays 1.5 comprensione del codice pseudo - = 0x3FFFFFFFu; + = 0x3FFFFFFFu;
SSpoke
2014-09-21 06:23:54 UTC
view on stackexchange narkive permalink

Sto cercando di ripulire lo pseudo codice per farlo compilare e funzionare in modo simile se non esattamente uguale al codice originale.

Questo bit che assomiglia a questo appare in vari punti in cui sono cercando di capire cosa significa esattamente.

  if (ZonePlayerCount > 0) {v3 = 0; v4 = 0; v5 = playerPointerList; v6 = &playerPointerList [1]; do {if (* (unsigned int *) & (* v5) ->IPAddressDWORD.S_un.S_un_b.s_b1 == IPAddress && (* v5) ->Portf == porta / porta non funzionante {print un'altra connessione \ n "); sub_41CBD0 ((int) & (* v5) ->encryptionPointer->ConnectionStatus); Memoria = * v5; if (* v5) {DisconnectUser (* v5); memoria libera); } --ZonePlayerCount; memcpy (v5, v6, 4 * (v4 + ZonePlayerCount)); --v3; v4 - = 0x3FFFFFFFu; v6 = (char *) v6 - 4; --v5; } ++ v3; v4 + = 0x3FFFFFFFu; v6 = (char *) v6 + 4; ++ v5; } while (v3 < ZonePlayerCount); }  

Altri posti come questo ..

  v1 = 0; if (ArenaArrayLength > v1) {v18 = 0; v19 = Arene; v20 = &Arenas [1]; do {if (ProcessArena (* v19)) {if ((* v19) ->ArenaName [0]) WriteSubGameLog ("Arena privata eliminata:% s \ n", (* v19) ->ArenaName); else WriteSubGameLog ("Arena drop \ n"); bufa = * v19; if (* v19) {ShutdownArena (* v19); gratuito (bufa); } --ArenaArrayLength; memcpy (v19, v20, 4 * (v18 + ArenaArrayLength)); --v1; v18 - = 0x3FFFFFFFu; v20 = (char *) v20 - 4; --v19; } ++ v1; v18 + = 0x3FFFFFFFu; v20 = (char *) v20 + 4; ++ v19; }
while (v1 < ArenaArrayLength); }  

Assembly per la prima parte di pseudo codice che fornisco qui.

  .text: 00412D7B mov esi, offset playerPointerList.text: 00412D80 mov ebx, (offset playerPointerList + 4) .text: 00412D85.text: 00412D85 loc_412D85:; CODICE XREF: NewConnectionRequest + C0j.text: 00412D85 mov eax, [esi] .text: 00412D87 mov ecx, [esp + 20h + IPAddress] .text: 00412D8B cmp [eax + 2F3h], ecx.text: 00412D91 jnz short loc_412DFC. text: 00412D93 mov dx, [esp + 20h + Port] .text: 00412D98 cmp [eax + 2F7h], dx.text: 00412D9F jnz short loc_412DFC.text: 00412DA1 push offset aConnectionIsBrok; "La connessione è interrotta perché lo stesso ip / porta" .... text: 00412DA6 call _printf.text: 00412DAB mov eax, [esi] .text: 00412DAD add esp, 4.text: 00412DB0 mov ecx, [eax + 28h]. text: 00412DB3 call sub_41CBD0.text: 00412DB8 mov ecx, [esi]; player.text: 00412DBA test ecx, ecx.text: 00412DBC mov [esp + 20h + Memory], ecx.text: 00412DC0 jz short loc_412DD4.text: 00412DC2 call DisconnectUser.text: 00412DC7 mov ecx, [esp + 20h + Memory] .text: 00412DCB push ecx; Memory.text: 00412DCC call ?? 3 @ YAXPAX @ Z; operatore cancella (void *). text: 00412DD1 add esp, 4.text: 00412DD4.text: 00412DD4 loc_412DD4:; CODICE XREF: NewConnectionRequest + 70j.text: 00412DD4 mov eax, ZonePlayerCount.text: 00412DD9 dec eax.text: 00412DDA mov ZonePlayerCount, eax.text: 00412DDF add eax, edi
.text: 00412DE1 shl eax, 2.text: 00412DE4 push eax; Size.text: 00412DE5 push ebx; Src.text: 00412DE6 push esi; Dst.text: 00412DE7 call _memcpy.text: 00412DEC add esp, 0Ch.text: 00412DEF dec ebp.text: 00412DF0 sub edi, 3FFFFFFFh.text: 00412DF6 ​​sub ebx, 4.text: 00412DF9 sub esi, 4.text: 00412DFC. text: 00412DFC loc_412DFC:; CODICE XREF: NewConnectionRequest + 41j.text: 00412DFC; NewConnectionRequest + 4Fj.text: 00412DFC mov eax, ZonePlayerCount.text: 00412E01 inc ebp.text: 00412E02 add edi, 3FFFFFFFh.text: 00412E08 add ebx, 4.text: 00412E0B add esi, 4.text: 00412E0E cmp ebp, eax text: 00412E10 jl loc_412D85  

Per quanto ho capito è che 0x3FFFFFFF ha qualcosa a che fare con i limiti dell'array?

Penso che dopo il DisconnectUser e la memoria libera tutti i puntatori del playerPointer vengano spostati a sinistra, è corretto? oppure cambia semplicemente il contatore in percorsi diversi.

Penso che il contatore sia v3 può continuare ad aumentare mentre il loop è in corso, ma quando un giocatore viene rimosso inizia a controllare dal fine della lista o qualcosa del genere?

Una risposta:
SSpoke
2014-09-21 06:53:55 UTC
view on stackexchange narkive permalink

Penso che dovrebbe assomigliare a questo Sono il 99,9% sento che è un elemento che cambia qualcosa mi dice che 0x3FFFFFFF è il limite massimo di un array quindi è una cosa del compilatore che aggiunge per assicurarsi che ottenga la fine dell'array.

Mi sbagliavo 0x3FFFFFFF viene utilizzato per creare numeri con segno per emulare la sottrazione mediante aggiunta. Visualizza il commento di DCoder

  if (ZonePlayerCount > 0) {v3 = 0; do {if (playerPointerList [v3] .IPAddressDWORD.S_un.S_un_b.s_b1 == IPAddress && playerPointerList [v3] .Port == Port) {printf ("Connessione interrotta perché lo stesso ip / porta ha richiesto un'altra connessione \ n"); sub_41CBD0 ((int) &playerPointerList [v3] .encryptionPointer->ConnectionStatus); Memoria = * v5; if (* v5) {DisconnectUser (* v5); memoria libera); } memcpy (&playerPointerList [v3], &playerPointerList [v3 + 1], 4 * (ZonePlayerCount - v3 - 1)); // o memmove (&playerPointerList [v3], &playerPointerList [v3 + 1], (ZonePlayerCount - v3 - 1) * sizeof (&playerPointerList)); --ZonePlayerCount; --v3; } ++ v3; } while (v3 < ZonePlayerCount); }  

Fammi sapere se è sbagliato, rimuoverò la risposta. (non ho il codice sorgente originale con cui confrontare).

Ho pensato che non dovrei usare memcpy perché potrebbe lasciare spazzatura in memoria alla fine, ma penso che spazzatura non fa male e alla fine verrà sostituita con qualcosa di utile quando sarà il momento.

Anche se sembra che memmove () sia più adatto qui.

Sembra abbastanza corretto. Una cosa da notare è che `0x3FFFFFFF * 4 = 0xFFFFFFFC`, o` -4`. Non è un limite di array letterale, è solo un modo pulito per sottrarre "4 * counter" da un numero.
ahh grazie quindi cerca di sottrarre moltiplicando lol in modo strano, questo è pieno di sorprese che fa anche i turni giusti per il potere di divisione dei numeri (in altre parti). Un giorno questi decompilatori avranno schemi in grado di riconoscere tutto e semplificarlo per te !. Se Hex-Ray di IDA fosse open source in cui le persone riempissero schemi per tutto, il progetto sarebbe stato completato molto tempo fa almeno meglio, quindi di nuovo guarderebbe tutto tranne che Hex-Rays completa spazzatura.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...