Domanda:
Posso impostare il genitore di un blocco di base in IDA?
rev
2015-08-29 19:17:58 UTC
view on stackexchange narkive permalink

Ho una funzione il cui flusso di controllo è un po 'fottuto ... come questo:

enter image description here

Come puoi vedere, la base i blocchi in alto a sinistra non sono collegati a nulla; tuttavia, se controllo il disasmo del testo, questo è ciò che vedo:

enter image description here

Come puoi vedere, IDA ritiene che la chiamata non non ritorna mai, inserisce la riga interrotta e il flusso di controllo viene interrotto (poiché il blocco di base successivo non ha un genitore).

Esiste un modo per collegare manualmente i blocchi di base, o meglio, fare in modo che IDA smetta di credere che la chiamata non ritorni?

EDIT : la funzione fa ritorna e non interrompe il resto di posti in cui è utilizzato:

enter image description here

Potresti provare a * rianalizzare il programma *? È in opzioni -> Generale -> Analisi -> programma di rianalisi
hai capito questo?
@Krypton non l'ho fatto da solo, ma ho sentito che può essere fatto con l'SDK cpp
Quattro risposte:
josh
2016-06-25 18:49:54 UTC
view on stackexchange narkive permalink

L'immagine seguente mostra un caso simile (Ida V6.3):

enter image description here

con la corrispondente visualizzazione del grafico inutile: enter image description here

Ovviamente Ida è completamente disturbata. Quello che ha funzionato per me in questo caso, è stata la seguente semplice procedura:

  1. Undefine Function and code = > Ida mostrerà solo il codice byte
  2. Seleziona l'intera area non definita e ridefinisci come codice (tasto "C")
  3. Definisci nuovamente come funzione.

La visualizzazione del grafico risultante ora sembra decente: enter image description here

Questo ha aiutato qui, tuttavia potrebbe non essere un rimedio in tutti i casi simili.

Nota : in questo caso particolare, l'annullamento della definizione e la ridefinizione della funzione senza l'annullamento della definizione del codice NON ha funzionato.

w s
2015-08-29 19:26:17 UTC
view on stackexchange narkive permalink

È possibile definire una funzione come "return" o "no return".

Per farlo devi trovare la funzione chiamata, fare clic destro su di essa, scegliere "modifica funzione" e deselezionare " Non restituisce la casella di controllo ".

Mi spiace, ho dimenticato di aggiungerlo, ma la funzione non è contrassegnata come "Non restituisce". Ho modificato il post btw
Può essere una delle funzioni che viene chiamata dalla tua funzione che non restituisce?
Ma la funzione * restituisce *, è solo una funzione simile a `printf` che ** restituisce ** un puntatore a una stringa formattata invece di stamparla su stdout, quindi sono davvero sicuro che non può essere che non lo sia ritorno '
Sarei felice di vedere un file binario, se possibile. È davvero strano.
BTW, ottieni qualcosa di interessante se aggiusti questa chiamata con dei nops?
Non ho il binario, ho solo l'IDB, che non posso condividere. È comunque un dump di Black Ops 3 Beta, quindi puoi verificare che se hai il gioco ... per non interrompere la chiamata: non cambia nulla, il grafico rimane lo stesso
joxeankoret
2016-08-25 21:44:14 UTC
view on stackexchange narkive permalink

Uhm ... potresti fare il contrario. Prova questo: nell'indirizzo del blocco di base che dovrebbe essere connesso dall'istruzione di chiamata che dici, premi Alt + F11 (cambia chiamato) e metti l'indirizzo dove si trova l'istruzione di chiamata.

Yunchao Guan
2016-05-26 09:48:30 UTC
view on stackexchange narkive permalink

Puoi provare a impostare il tipo di funzione va (usando il tasto di scelta rapida Y). Quindi, se ciò non ha effetto, puoi provare a non definire la funzione e ridefinire quella funzione per forzare la ri-analisi IDA.

Se hai il decompilatore HexRays, puoi chiamare il decompilatore in questa funzione e quindi fare clic sulla funzione va , quindi tornare alla funzione originale.

Quelli sopra sono trucchi per IDA per forzare l'avvio dell'analisi. Li ho testati su binari di diversi CTF. E nella maggior parte dei casi hanno funzionato.

PS: Scusa per il mio inglese scadente



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...