2011-09-01 7 views
8

Beh, questa domanda può sembrare strano, ma la sua semplice - il mio punto è se ho un "goto" (brtrue ecc) nel codice decompilato come esempioMono.Cecil si occupa della posizione dei rami ecc.?

br IL_0003 
call ***** 
IL_0003: ret 

e aggiungo un comando dopo che * * chiama il br nel punto in alto per ret come dovrebbe o per quel codice.

Cecil fa da solo o devo occuparmi di tutti quei rami? :/ non sarebbe molto difficile risolverli ma se Cecil non lo fa, semplicemente non comincerò questo progetto, non ho tempo (o conoscenza) per magia IL avanzata: P

PS. scusate se mi confondono le cose ma sono un mendicante in .NET./Sono stato sempre respinto da esso stesso come Java o qualsiasi cosa che abbia una VM TBH.

* (sì, lo so che non sarà IL_0003 il suo solo per esempio) *

risposta

13

Sì, Cecil aggiornerà il ramo per voi.

L'unico caso di cui ci si deve occupare è il caso in cui il ramo è un ramo di forma breve. Se si inietta troppe istruzioni, potrebbe traboccare.

C'è un modo molto semplice per gestire questo. Prima di iniettare il codice, è sufficiente chiamare i metodi di estensione SimplifyMacros dalle Mono.Cecil.Rocks, in questo modo:

method.Body.SimplifyMacros(); 

Questo accende l'ampio s in br.

E quando il gioco è fatto iniettare codice, è sufficiente chiamare:

method.Body.OptimizeMacros(); 

Qual è l'operazione inversa, cioè, cercherà di trasformare in br ampio s, se possibile.

+0

Wow, una risposta così veloce e dall'autore :) Grazie a te il meglio: P – n00b

Problemi correlati