Red de conocimiento informático - Material del sitio web - Cómo conectar la API del framework de Android

Cómo conectar la API del framework de Android

1. Inyectar código en el proceso de destino (inyectar así y llamar a una función en el proceso). Primero llame a la función ptrace para depurar el proceso com.android.browser. Aquí necesitamos atravesar el libc.so cargado por el proceso. Aquí están las direcciones de dlopen, dlsym y otras funciones que necesitamos. .phone y modifíquelo, inserte parámetros como nuestra ruta so e inserte la dirección dlopen encontrada previamente en el registro. Opere blx directamente y el proceso de destino puede llamar a dlopen para cargar nuestro so. la función en nuestro así.

Lo siguiente es lo que hice, la función de redirección implementa el gancho.

2.com.android.phone programa llamado xxx.so al realizar una llamada y esperar la conexión de red. Esto mantiene una tabla got y una tabla rel.plt. La tabla rel.plt almacena las direcciones de funciones dependientes externas y la tabla got almacena las direcciones de funciones definidas por este método. Lo inyectado anteriormente ya está en el mismo espacio de proceso que com.android.phone y puede ejecutar un fragmento de código que configuramos. Nuestro código debería hacer esto. También cargamos xxx.so. En realidad, no se cargará aquí porque ya se ha cargado, pero podemos obtener el identificador de xxx.so y luego encontrar la entrada de la función de marcado en la tabla rel.plt. Luego cargue un myxxx.so que escribimos, que contiene nuestra propia función mydial definida. Tenga en cuenta que las firmas de las dos funciones deben ser consistentes. De la misma manera, encontramos la dirección después de cargar la función mydial y luego reemplazamos la dirección de función de la entrada de marcado anterior de xxx.so con la dirección de nuestra función mydial. Tenga en cuenta que al reemplazar la dirección, primero debe llamar a la función mprotect para romper la protección contra escritura del espacio de memoria.

En la función mydial, copiamos todo el código de la función de marcación, pero hay un cambio. Esto es para cambiar el número de teléfono de destino al número que especificamos.

El código para encontrar la entrada de la tabla de direcciones de función es

//handle es el identificador del objetivo, por lo que nombre es el nombre de la función de destino

void* getaddr(void *handle, const char *name)

{

if(!handle)

return

Soinfo *si; = (Soinfo*)handle ;

Elf32_Sym *symtab = si-gt;

const char *strtab = si-gt; *rel = si-gt ;plt_rel;

cuenta sin firmar = si-gt;plt_rel_count;

idx sin firmar;

for(idx=0; idxlt; count; idx ) // Las funciones de dependencia externa están en rel_plt

{

unsigned type = ELF32_R_TYPE(rel-gt; r_info;

unsigned sym = ELF32_R_SYM); (rel-gt; r_info) );

unsigned reloc = (unsigned)(rel-gt; r_offset si-gt; base

char *sym_name = (char *) (strtab symtab[sym]. st_name);

if(strcmp(sym_name, nombre)==0)

{

printf("\"plt_rel \" idx: 2d tipo: 2d sym: 2d sym_name: -30s addr: 0x\n", idx, type, sym, sym_name, *((unsigned*)reloc));

return (void *)*((sin firmar* )reloc);

}

rel

}

for(idx=0; idxlt; ; si-gt; nchain; idx ) //Función personalizada en symtab

{

tipo sin firmar = ELF32_R_TYPE(symtab[idx].st_info

); sym sin firmar = ELF32_R_SYM( symtab[idx].st_info);

char *sym_name = (char *)(strtab symtab[idx].st_name

if(strcmp(sym_name); , nombre)== 0)

{

printf("\"got\" idx: 2d sym_name: -30s st_value: 0x base: 0x\n", idx, sym_name , symtab[idx] .st_value,si-gt;base);

return (void *)(symtab[id

x].st_value si-gt);

}

};

return NULL;

En cuanto a reemplazar la dirección de ejecución de la función, se trata de modificar la dirección de la función de destino a la dirección de función encontrada previamente que se utiliza para reemplazar la ejecución de la función de destino. Tenga en cuenta que, en relación con el valor base de so en la tabla obtenida, debe sumar o restar la diferencia base entre los dos so. La tabla rel.plt contiene direcciones absolutas.

Desde una perspectiva de seguridad, podemos conectar funciones clave para implementar restricciones de operación de permisos.

------------------------------------------- -------------------------------------------------- -- -----------

Ideas para evitar la inyección:

1. Establezca android: debuggable en falso para prohibir ptrace;

2. Modifique las direcciones de mmap, dlopen y otras funciones para evitar que otros procesos las llamen;

3. Supervise dinámicamente si hay otras funciones cargadas y desinstálelas si es así.