Estoy haciendo una investigación para una herramienta de análisis estático para ayudar a detectar malware en aplicaciones de Android. Me pregunto si es posible realizar una inyección de código en Android sin utilizar un cargador de clases. Sé que es posible cargar el código byte en tiempo de ejecución utilizando el cargador de clases Dex, pero me gustaría saber si es posible hacerlo sin usar un cargador de clases. He encontrado proyectos como enlace , que usan cosas como AspectJ para agregar el registro y el rastreo en tiempo de ejecución. Corríjame si me equivoco, pero creo que esto probablemente usa un cargador de clases en algún lugar de la biblioteca de AspectJ.
Estoy pensando en algo más en cuanto a sobrescribir / implementar un método en tiempo de ejecución con un código de byte arbitrario de una clase que ya está cargada, de modo que la próxima vez que se llame se realice una acción maliciosa / no declarada del original implementación de la fuente. es posible? Si es así, ¿cómo se haría para hacerlo?
Actualización: Intento aclarar un poco más mi pregunta.
No estoy interesado en llamar directamente al código nativo o usar Runtime.exec. Ya he examinado esas API de Java en mi herramienta. Permítame darle una idea de código en bruto de algo que estaba 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();
}
Esto es solo una idea de algo que estaba considerando para ver si era posible. Básicamente, quiero saber si es posible hacer una reflexión sin utilizar las interfaces de reflexión como una especie de truco desordenado que evitaría mi detección.