modificar - Creación de programas Java que no sean de ingeniería inversa
dj java decompiler (14)
Con algo interpretado en algún punto, debe procesarse "en claro". La cadena se mostraría clara como el día una vez que el código se ejecuta a través de JAD. Puede implementar una clave de cifrado con su aplicación o hacer un cifrado ceasar básico para cifrar la información de conexión del host y descifrar en tiempo de ejecución ...
Pero en algún momento durante el procesamiento, la información de conexión del host debe dejarse en claro para que su aplicación se conecte al host ...
Así que puedes ocultarlo estáticamente, pero no puedes ocultarlo durante el tiempo de ejecución si ejecutan un depurador
¿Hay alguna manera de implementar un programa Java en un formato que no sea de ingeniería inversa?
Sé cómo convertir mi aplicación en un archivo JAR ejecutable, pero quiero asegurarme de que el código no pueda ser modificado por ingeniería inversa, o al menos, no sea fácil.
La ofuscación del código fuente no cuenta ... hace que sea más difícil entender el código, pero no lo oculta.
Una pregunta relacionada es ¿Cómo bloquear clases compiladas de Java para evitar la descompilación?
Una vez que haya completado el programa, todavía tendría acceso a la fuente original, por lo que mantener la aplicación no sería el problema. Si la aplicación se distribuye, no me gustaría que ninguno de los usuarios pueda descompilarla. La ofuscación no lo logra, ya que los usuarios aún podrían descompilarlo, y si bien tendrían dificultades para seguir los flujos de acción, podrían ver el código y posiblemente sacar información de él.
Lo que me preocupa es si hay alguna información en el código relacionado con el acceso remoto. Hay un host al cual se conecta la aplicación usando una identificación de usuario y contraseña proporcionada por el usuario. ¿Hay alguna manera de ocultar la dirección del host del usuario, si esa dirección se encuentra dentro del código fuente?
Conviértalo en un servicio web. Entonces eres el único que puede ver el código fuente.
Esto es imposible. La CPU tendrá que ejecutar su programa, es decir, su programa debe estar en un formato que la CPU pueda entender. Las CPU son mucho más tontas que los humanos. Ergo, si una CPU puede entender tu programa, un ser humano puede.
Estoy tentado de preguntar por qué querrías hacer esto, pero lo dejo en paz ...
El problema que veo es que la JVM, al igual que la CLR, debe ser capaz de introducir su código para compilar JIT y ejecutarlo. Puede hacerlo más "complejo", pero dado que la especificación para bytecode está bastante bien documentada, y existe en un nivel mucho más alto que algo similar a la especificación del ensamblador x86, es poco probable que pueda "ocultar" el flujo de proceso, ya que tiene estar allí para que el programa funcione en primer lugar.
Incluso si compila el código en el lenguaje de máquina nativo, hay todo tipo de programas que le permiten esencialmente descompilarlo en lenguaje ensamblador y seguir el flujo del proceso (OlyDbg, IDA Pro).
No se puede hacer.
Todo lo que se puede compilar se puede descompilar. Lo mejor que puedes hacer es ofuscarte.
Dicho esto, hay algunas cosas interesantes sucediendo en la criptografía cuántica. Esencialmente, cualquier intento de leer el mensaje lo cambia. No sé si esto podría aplicarse al código fuente o no.
Si sabe a qué plataformas se dirige, obtenga algo que compile su Java en código nativo, como Excelsior JET o GCJ .
Además de eso, nunca podrás ocultar el código fuente, ya que el usuario siempre tiene tu bytecode y puede hacerlo.
Al tener dudas sobre cómo ocultar el código, de todos modos, ejecutaba ProGuard .
No se puede hacer. Este no es un problema de Java. Cualquier lenguaje que se pueda compilar se puede descompilar para Java, es simplemente más fácil.
Estás tratando de mostrarle una foto a alguien sin mostrarla realmente. No es posible. Tampoco puede ocultar su host aunque se oculte en el nivel de la aplicación. Alguien puede graptearlo a través de Wireshark o cualquier otro sniffer de red.
No uses un lenguaje interpretado? ¿Qué intentas proteger de todos modos? Si es lo suficientemente valioso, cualquier cosa puede ser de ingeniería inversa. Las posibilidades de que alguien se preocupe lo suficiente como para invertir la ingeniería de la mayoría de los proyectos son mínimas. La ofuscación proporciona al menos un obstáculo mínimo.
Asegúrese de que su propiedad intelectual (IP) esté protegida a través de otros mecanismos. Particularmente para el código de seguridad, es importante que las personas puedan inspeccionar las implementaciones, de modo que la seguridad esté en el algoritmo, no en la fuente.
Podría ofuscar su archivo JAR con YGuard . No ofusca su código fuente , sino las clases compiladas, por lo que no hay problema para mantener el código más tarde.
Si desea ocultar una cadena, puede encriptarla, dificultando la visualización del código fuente (es incluso mejor si oculta el archivo JAR).
Estás escribiendo en un lenguaje que tiene introspección como parte del lenguaje central. Genera archivos .class
cuyas especificaciones son ampliamente conocidas (lo que permite a otros proveedores producir implementaciones de sala limpia de compiladores e intérpretes de Java).
Esto significa que hay descompiladores disponibles públicamente. Todo lo que necesita son algunas búsquedas de Google, y tiene algún código de Java que hace lo mismo que el suyo. Simplemente sin los comentarios, y algunos de los nombres de las variables (pero los nombres de las funciones siguen siendo los mismos).
En realidad, la ofuscación es todo lo que se puede obtener (aunque el código descompilado ya estará ligeramente ofuscado) sin ir a C ni a ningún otro lenguaje completamente compilado, de todos modos.
La respuesta corta es "No, no existe".
La ingeniería inversa es un proceso que no implica mirar el código en absoluto . Básicamente, trata de comprender los mecanismos subyacentes y luego imitarlos. Por ejemplo, así es como aparece JScript en los laboratorios de MS, al copiar el comportamiento de JavaScript de Netscape, sin tener acceso al código. La copia fue tan perfecta que incluso los errores fueron copiados.
Como alguien dijo anteriormente, la ingeniería inversa siempre podría descompilar su ejecutable. La única forma de proteger su código fuente (o algoritmo) no es distribuir su ejecutable.
separe su aplicación en un código de servidor y una aplicación de cliente, oculte la parte importante de su algoritmo en su código de servidor y ejecútelo en un servidor en la nube, simplemente distribuya el código de cliente que solo funciona como un captador de datos y un remitente.
Por esto, incluso su código de cliente se descompila. No estás perdiendo nada.
Pero seguro que esto disminuirá el rendimiento y la conveniencia del usuario.
Creo que esta puede no ser la respuesta que está buscando, sino solo plantear una idea diferente para proteger el código fuente.