2011-04-26 8 views
21

Actualmente estoy lidiando con un problema en particular con mi aplicación paga. Internamente contiene una verificación de licencia. La aplicación es parcheada por hackers modificando la aplicación apk/jar. Están agregando una nueva clase que ayuda a eludir el control de licencia.¿Cómo verificar si existe clase en alguna parte del paquete?

Mi objetivo es comprobar de alguna manera este parche en particular. Si lo encuentro, sé que mi aplicación se ha visto comprometida.

¿Algún consejo sobre cómo saber que algo se ha modificado en el paquete? Hacer un hash sobre la aplicación no es realmente una opción en mi caso.

Pensé que quizás sería útil verificar si esta clase existe, pero ¿qué ocurre si cambian el nombre de la clase? Entonces, otra idea es verificar de alguna manera las inclusiones inesperadas agregadas a la clase.

¿Alguna de estas posibles? Cualquier sugerencia sería ayudar :)

Respuesta

42

No estoy seguro sobre androide pero en JDK estándar que harían algo como esto:

try { 
Class.forName("your.fqdn.class.name"); 
} catch(ClassNotFoundException e) { 
//my class isn't there! 
} 
+0

El problema con esta llamada es que especifica el nombre del paquete. El nombre del paquete es aleatorio ... Pero el nombre del archivo no es ... – Jona

+0

, por lo que desea buscar una clase que esté en el mismo paquete que la clase desde la que lo verifica. esta es la pregunta? – Liv

+0

Necesito encontrar una clase que se pueda ubicar aleatoriamente en cualquier lugar de mi aplicación. La clase se coloca al azar por el "parche de hack" – Jona

3

Puede utilizar

public static Class<?> forName (String className) 

y comprobar el ClassNotFoundException

http://developer.android.com/reference/java/lang/Class.html#forName%28java.lang.String%29

+0

Mismo problema con la publicación de @Liv ... Esto no funciona, ya que tendría que especificar la ruta exacta en el paquete en que se encuentra la clase. En mi caso, la clase podría estar en algún lugar almacenada al azar en mi paquete de aplicaciones. – Jona

+0

con el riesgo de ser un b ** ch - ¿Es esto diferente a lo que sugerí? – Liv

+0

@Liv ¿Has visto la diferencia de tiempo entre las dos respuestas? No, no es muy diferente. ¿Cuál es el punto de? – Aleadam

1

¿Cómo se carga si es así? s una clase aleatoria en un paquete al azar?

Una vez dicho esto, vea http://download.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties%28%29 y java.class.path. Para las aplicaciones java normales, debe recorrer el classpath y luego buscar las entradas (para jar) o directorios (para archivos .class). Pero en un entorno contenedor-clase-cargador, esto no funcionará (y no estoy seguro de cómo se aplica a un entorno Android).

+0

Gracias por la respuesta ... Bueno, se carga después del lanzamiento oficial de la aplicación.Este archivo en particular omite las comprobaciones de licencias ... Que se distribuye libremente. – Jona

+1

Lo siento, le pregunto qué carga en su aplicación oficial la clase si no sabe de antemano en qué paquete está. Las clases se cargan en respuesta a referencias de otras clases, o se cargan a través de SPI u otro mecanismo. Solo tener una clase en un contenedor no sería suficiente por sí solo para cargarlo. –

+0

Ese es un punto interesante. Bueno, supongo que esta clase de parche está adjunta a mi verificación de licencias. No estoy seguro exactamente dónde, pero sé que debería cargarse una vez que ejecuto mi verificación de licencia. – Jona

12

Esto es lo que he usado en Android - estándar de Java: ejemplo

public boolean isClass(String className) { 
    try { 
     Class.forName(className); 
     return true; 
    } catch (ClassNotFoundException e) { 
     return false; 
    } 
} 

Implementación:

if (isClass("android.app.ActionBar")) { 
    Toast.makeText(getApplicationContext(), "YES", Toast.LENGTH_SHORT).show(); 
} 
Cuestiones relacionadas