2011-03-30 10 views
15

Implementé la facturación de aplicaciones en una aplicación y ahora quiero asegurarla un poco más. Leyendo el material revelador que establece lo siguiente:InApp Billing Security y Remote Method Invocation

Además de ejecutar un programa de ofuscación, se recomienda que utilice las siguientes técnicas para ofuscar el código de facturación en la aplicación.

Métodos en línea en otros métodos.

Construya cadenas sobre la marcha en lugar de definirlas como constantes.

Use la reflexión de Java para llamar a los métodos.

http://developer.android.com/guide/market/billing/billing_best_practices.html

ofuscación - bien que puedo hacer eso = Proguard

métodos Inline en otros métodos - un dicho una vez que mi código es completa, deshacerse de gran parte OO como yo puedo y coloco todo mi código en tantas líneas como puedo (para la parte de facturación de mi aplicación) en un método? ¿Esto incluye incluir clases? En el ejemplo de Android tienen una clase de constantes, ¿incluiría todo esto?

cadenas Construir sobre la marcha - Sí Así que mueve todas las variables constantes de clase en línea - Proguard bien debe cubrir este

uso de Java Reflexión - esta es mi pregunta principal. ¿Debo invocar todos mis métodos en lugar de llamarlos?

para salvarme un poco de esfuerzo podría hacer esto:

private static Object invokeMethod(String name, Class<?>[] params, Object[] args){ 
    try { 
     return MySpecificClass.class.getMethod(name, params).invoke(null, args); 
    } catch (IllegalArgumentException e) { 
     // Should never happen in my code, ignore and cancel in app charge 
    } catch (SecurityException e) { 
     // Should never happen in my code, ignore and cancel in app charge 
    } catch (IllegalAccessException e) { 
     // Should never happen in my code, ignore and cancel in app charge 
    } catch (InvocationTargetException e) { 
     // Should never happen in my code, ignore and cancel in app charge 
    } catch (NoSuchMethodException e) { 
     // Should never happen in my code, ignore and cancel in app charge 
    } 
    return null; 
} 

Podría entonces hacer cosas como esta:

private static boolean someMethod() { 
    return true; // just an example 
} 

params = new Class<?>[0]; 
    if ((Boolean) invokeMethod("someMethod", params, null)) { 
     // Do something 
    } 

¿Es esta una buena seguridad, o es sólo código de hinchazón y hacer mi ¿aplicación indebuggable para problemas de usuario genuinos?

Gracias.

+0

También me preguntaba acerca de los "métodos en línea" y los puntos de "uso de la reflexión". Todo parece un dolor gigante. Supongo que convertir tus métodos en súper-métodos gigantescos podría ayudar un poco, especialmente después de ofuscar nombres. Pero para usar la reflexión en todas partes ... (continúa en el siguiente comentario) –

+0

.. Pero usar el reflejo en todas partes haría explotar mi cabeza. Su enfoque para la reflexión es interesante, pero no estoy seguro de si explica los métodos que arrojan otras excepciones (no puse un catch all: 'catch (Exception everythingelse)'). Supongo que puedes volver a lanzarlo y manejarlo donde se llame. ** Pero ** también tienes que dar cuenta de 'proguard'. Como estará ofuscando nombres, eso romperá su reflejo, por lo que debe agregar reglas '-keep' a los archivos de configuración de proguard. Entonces tal vez esos métodos serán un poco menos seguros ya que probablemente tengan nombres significativos. –

+0

Hey Proguard no oculta sus cadenas. Construir entonces en tiempo de ejecución no significa concatenación de cadenas. Por lo general, significa convertirlos de un estado más ofuscado, como bytes o valores codificados, y volver a la cadena original en el tiempo de ejecución –

Respuesta

1

Esto parece algo en lo que podrías mirar cuando hay una mayor amenaza demostrada de piratería. No podría justificar el uso de la reflexión solo para una capa adicional de ofuscación si tuviera la posibilidad de comprometer la experiencia del usuario.

+8

Así que espere a que mi aplicación se haya descifrado y distribuido ... luego emita una actualización. ¿Trabajas para Microsoft? – Blundell

+6

Heh, creo que hay pocos paquetes crackeados y relativamente pocas personas descargan las versiones crackeadas. ¿Estaría usted haciendo dinero con estos descargadores de todos modos? Entiendo que como programadores estamos entrenados para asumir lo peor, pero se requiere algún tipo de equilibrio. –