Sto facendo ricerche per uno strumento di analisi statica per aiutare a rilevare il malware nelle applicazioni Android. Mi chiedo se è possibile eseguire l'iniezione di codice su Android senza utilizzare un caricatore di classe. So che è possibile caricare il codice byte in fase di esecuzione utilizzando il caricatore di classe Dex, ma mi piacerebbe sapere se è possibile farlo senza usare un programma di caricamento classi. Ho trovato progetti come link , che usano cose come AspectJ per aggiungere logging e tracing in fase di esecuzione. Correggetemi se ho torto, ma penso che questo probabilmente usi un caricatore di classe da qualche parte nella libreria AspectJ.
Sto pensando a qualcosa di più sulla linea di sovrascrivere / implementare un metodo in fase di esecuzione con un byte byte arbitrario di una classe che è già stata caricata, in modo che la prossima volta che viene chiamata esegua un'azione dannosa / non dichiarata dall'originale implementazione sorgente. È possibile? Se sì, come si farebbe a farlo?
Aggiornamento: cerco di chiarire la mia domanda un po 'di più.
Non mi interessa chiamare il codice nativo direttamente o utilizzare Runtime.exec. Ho già esaminato quelle API Java nel mio strumento. Lasciami dare un'idea approssimativa del codice di qualcosa che stavo pensando.
public static void main(String[] args){
hello(); // BENIGN
evil("hello", getFile("com.blah.MyClass"));
hello(); // MALWARE, or alternatively since it might not be loaded also BENIGN until next time application is run.
}
public static void hello(){System.out.println("Hi!");}
public static void evil(String methodName, File classFile){
byte[] evilMethodImplementation = {0x...}; // some crafted byte code to replace the body of a method in a class file
RandomAccessFile raf = new RandomAccessFile(classFile, "rw");
raf.seek(findMethodBody(methodName, classFile)); // seek to the body contents of the method
raf.write(evilMethodImplementation); // overwrite the current implementation with malicious implementation
raf.close();
}
Questa è solo un'idea di qualcosa che stavo considerando per vedere se fosse possibile. Fondamentalmente voglio sapere se è possibile fare Reflection senza utilizzare le interfacce di riflessione come una sorta di disordinato hacking che bypasserebbe il mio rilevamento.