Estoy seguro que la mayoría que tenga WhatsApp le gustaría que sus contactos no supiesen cuando estás conectado a él, no son pocos los que envían un mensaje y para saber si lo han leído o no abren de cuando en cuando WhatsApp y ven el estado de conexión del otro para ver cuando fue la última vez que se conectó. Personalmente me da exactamente igual que lo vean o no, pero seguro que la mayoría piensa de otro modo.
Como con la gran mayoría de todos los experimentos, este me llegó después de que un amigo me dijese que su hermano había comprado una aplicación de Android para impedir que sus contactos pudiesen conocer la última vez que estuvo conectado al WhatsApp. Bueno en Android ya sabemos que técnicamente el Ultima vez conectado no es propiamente eso, sino cuando fue la última vez que el usuario tenía en primer plano la aplicación WhatsApp, puesto que en realidad el usuario está siempre conectado. Sabemos que los usuarios de iPhone tienen una opción para deshabilitar esto, los conocemos bien porque son aquellos contactos en los que cuando vemos su estado simplemente no aparece ninguna fecha. En Android no tenemos esta opción, pero eso no quiere decir que no pueda modificarse la aplicación para crear un comportamiento parecido, o incluso mejor.
En realidad este pequeño experimento es solo un ejemplo de la gran utilidad que tiene la Ingeniería Inversa. Pese lo que puedan pensar muchos programadores o defensores a ultranza del código propietario, la Ingeniería Inversa permite conocer mejor el software, descubrir problemas de seguridad para evitarlos, crear Software de mejor calidad… no es una lacra ni un problema, todo lo contrario, es una gran herramienta.
Volviendo al tema de hoy, cuando me dijo este amigo mío sobre dicha aplicación en Play Store sinceramente me extrañó, por la simple razón de que si es un comportamiento de la aplicación en sí, la única forma de eludirlo sería con una modificación de la misma aplicación… a menos que se tratase de un simple truco. Efectivamente, lo que hacen este tipo de aplicaciones no es más que un truco para provocar un efecto similar que puede realmente funcionar bastante bien, aunque tiene muchos problemas asociados sin duda alguna. Para saber en que se basan estas aplicaciones para esconder el estado de conexión de nuestro terminal hay que conocer antes como maneja WhatsApp dicho estado, no hay que profundizar mucho, en realidad es muy sencillo:
La primera cosa que hay que tener clara de nuevo es que en Android las aplicaciones se minimizan, no se cierran (pueden cerrarse también, pero vamos a simplificarlo), esto es debido a que Android es multitarea. Aunque WhatsApp no esté en primer plano continua en ejecución, lo que quiere decir que cualquier mensaje que nos manden, imagen… la recibimos perfectamente en nuestro terminal en ese mismo momento, el que volvamos a poner a WhastApp al primer plano no cambia nada. Teniendo esto en mente, cuando el usuario abre la aplicación o la coloca en primer plano estando minimizada, WhatsApp envía a los servidores de estos un mensaje sobre su estado de forma peródica y constante. Cuando el usuario minimiza la aplicación, este desactiva este comportamiento, con lo que de cara a cualquier otro usuario nuestro estado de conexión cambiará de “En línea” a “Últ. Vez”. Conocer esto no requiere realmente ser un experto en nada, estoy seguro que muchos que se hayan planteado el “como funcionará…” habrá echo sus propios experimentos de cuando cambia el estado y otras cosas.
Sabiendo por tanto como es el comportamiento de WhatsApp, cualquiera podría imaginar como engañar a WhatsApp, repito, simplemente conociendo como funciona el cambio de estado. Se trataría simplemente de evitar que WhastApp comenzase a enviar esos mensajes a su servidor, y lo cierto es que tenemos una solución muy sencilla a esto, no tener conexión. El no tener conexión (ni WIFI ni datos) impediría evidentemente que WhatsAppe comenzase a enviar los mensajes de estado, pero evidentemente también impediría que WhatsApp pudiese mandar cualquier cosa a otro contacto o recibir mensajes o cualquier otra cosa, pero como ya hemos dicho WhatsApp aun estando minimizado se está ejecutando, y sabemos que el cambio de estado solo sucede cuando tenemos la aplicación en primer plano, es decir la maximizamos. Aplicando la lógica común, nos bastaría tan solo con deshabilitar datos/wifi cuando queremos volver al WhatsApp para escribir un mensaje o leer alguno ya recibido, y volver a conectar los datos/wifi cuando la minimizásemos de nuevo. Estando minimizada y con conexión, recibiría perfectamente mensajes o imágenes o cualquier otra cosa, así como también enviaría nuestros mensajes escritos a nuestros contactos, pues estarían a la espera de conexión.
Esto que he explicado puede hacerlo cualquiera en su casa en cualquier momento, y de echo funciona perfectamente, aunque por supuesto tiene muchos problemas. Las aplicaciones que están en Play Store simplemente automatizan este proceso, pero hacen exactamente lo que he indicado. Hacen que cuando se maximiza (se cambia a primer plano) WhatsApp, se deshabilitan datos y wifi, y se invierte cuando se minimiza WhatsApp. Muchos pueden pensar que es la solución perfecta, pero no solo no es perfecta puesto que no funcionaría siempre, sino que además el usuario perdería mucha funcionalidad en el WhatsApp. Por ejemplo, para mantener una conversación con alguien tendría que estar minimizando y maximizando constantemente puesto que de lo contrario sus mensajes no se enviarían ni el podría recibir nuevos mensajes! Para un mensaje ocasional funcionaría, pero si esa persona quisiese mantener una conversación mínima con cualquiera, tendría que mandar mensaje, minimizar, esperar que el otro respondiese, maximizar, escribir, minimizar.. es evidente que no es práctico de ninguna de las maneras, sin contar que lo único que el usuario podría descargar serían imágenes si tuviese activado el autoaceptar, el resto de contenido no podría descargarlo nunca.
¿Es posible dar con una solución más eficaz? Sí, ingeniería inversa. En el artículo que menciono justo abajo explico mejor que es la Ingeniería inversa para quien no lo conozca, pero digamos que en el software es básicamente el proceso de obtener información sobre como funciona una aplicación de forma interna sin disponer su código fuente original, lo que nos permite incluso modificar la aplicación misma. Recordar que en algunos países la ingeniería inversa es ilegal, aquí en España es legal siempre y cuando no se distribuya su código o cualquier modificación realizada. Es por eso que aunque puedan pedirlo algunos, no puedo colgar ningún WhatsApp modificado lo siento, cada cual que experimente si así lo desea, además la razón de este blog ha sido siempre para enseñar, no para dar.
Muchos de los pasos realizados aquí, los encontramos también en otro artículo que publiqué hace ya meses. En Android, cualquier proceso de Ingeniería inversa tendría los mismos pasos a seguir:
- Obtener la aplicación APK (y el paquete odex en caso de ser una aplicación interna de algunos terminales)
- Decompilar la aplicación para obtener el código Dalvik equivalente.
- Realizar las modificaciones pertinentes.
- Recompilar la aplicación, firmarla y alinearla (optimizarla).
Con excepción al paso 3º, el resto son siempre los mismos, existiendo tan solo pequeñas modificaciones entre diferentes casos, pero nada importante. Como tales procesos están explicados en el artículo mencionado, simplemente voy a presuponer que se saben realizar. Existen herramientas incluso que nos permiten obtener un código en JAVA relativamente fidedigno desde la aplicación APK, que aunque no pueda ser recompilado, al menos será mas inteligible para la mayoría de las personas que lo es el código en Dalvik
Obtener por tanto un código que podamos modificar es simple una vez se decompila la aplicación, por ejemplo con apktool. Así que vamos a presuponer que disponemos del código ya decompilado en la carpeta “whats”, y con eso completaríamos los pasos 1 y 2.
El tercer paso sería el más tedioso, puesto que de cientos de archivos que disponemos hay que saber que se quiere modificar, donde hacerlo y como hacerlo. En realidad es lo complicado del caso. En nuestro caso ya sabemos que queremos modificar, queremos suprimir el estado de conexión de nuestro WhatsApp, pero seamos coherentes, tenemos una carpeta con el código decompilado que pesa más de 40MB y contiene más de 4000 archivos. Evidentemente tenemos que acotar nuestra búsqueda, o podríamos tardar años. A este problema se le suma el echo de que inevitablemente tenemos que conocer algo de programación en Android y de como funciona Dalvik, de lo contrario es imposible que pudiésemos encontrar el lugar (o lugares) en el que se implementa dicho comportamiento o como se tendría que modificar. Por suerte para nosotros, el código Dalvik resultante de la compilación es bastante más legible que el código ensamblador de la arquitectura x86. Dalvik es una máquina virtual basada en registros, y en el mismo código podemos ver por suerte la llamada a las funciones que son usadas, así como los parámetros pasados. Esto es una ayuda infinita sin duda, ya que simplemente con conocer a grandes rasgos el SDK de Android, podemos empezar a buscar lo que deseamos.
En nuestro caso concreto, presuponiendo que tan solo tenemos la idea que mencioné al principio de como/cuando se actualiza el estado de conexión, tendríamos que comenzar por ahí. Lo primero que sabemos es que nuestro estado cambia al volver WhatsApp al primer plano, es decir, en el código tiene que existir algún disparador que se acciona al realizar este cambio de estado en la aplicación. Cualquiera que le guste la programación en Android o simplemente haga un poco de investigación, antes o después encontraría esta imagen en la documentación oficial de Android:
Por supuesto existe documentación extensa sobre todo ello en el portal oficial, pero esta imagen es suficiente. Lo que nos dice esta imagen es que existen funciones concretas que son disparadas cuando nuestra aplicación cambia de estado, ya sea al iniciar la aplicación, al empezar a ejecutarse, al “resumirse”, al pausarse, al pararse, cerrarse, reiniciarse… lo cierto es que tenemos unas cuantas opciones. Si fuésemos un poco curiosos, también sabríamos que la función exacta que se dispara cuando una aplicación pasa de segundo plano a primer plano (maximizarse) se llama OnResume(), y la función que se aplica al pasar de primer plano al segundo es onPause(). Estos nombres pueden causar un poco de confusión ya que en realidad una aplicación en Android no se pausa propiamente dicho, pero obviemos esto.
Es evidente que una aplicación puede tener otros sistemas para detectar si la aplicación se encuentra en primer plano o no, pero siempre hay que partir de presunciones y ver a donde nos llevan, si son un callejón sin salida hay que volver y replantarse el problema para optar por otras opciones. Pero si WhatsApp está usando realmente onResume() para la actualización de nuestro estado, al menos podríamos ser capaces de realizar una gran criba. Así pues, si nos basamos en esta teoría, podríamos usar el comando findstr (en windows) o grep (en linux) para buscar dicha función dentro del código Dalvik, puesto como he dicho el nombre de las funciones se encuentran en él:
E:\Android\Proyectos\Whats>findstr /S /I /M onResume *.*
smali\com\whatsapp\AccountInfoActivity.smali
smali\com\whatsapp\BlockList.smali
smali\com\whatsapp\ContactInfo.smali
smali\com\whatsapp\ContactPicker.smali
smali\com\whatsapp\Conversation.smali
smali\com\whatsapp\Conversations.smali
smali\com\whatsapp\DeleteAccount.smali
smali\com\whatsapp\DeleteAccountConfirmation.smali
smali\com\whatsapp\DescribeProblemActivity.smali
smali\com\whatsapp\DialogToastActivity.smali
smali\com\whatsapp\DialogToastListActivity.smali
smali\com\whatsapp\EULA.smali
smali\com\whatsapp\GroupChatMap.smali
smali\com\whatsapp\LocationPicker.smali
smali\com\whatsapp\MediaGallery.smali
smali\com\whatsapp\MultipleContactPicker.smali
smali\com\whatsapp\OverlayAlert.smali
smali\com\whatsapp\RegisterName.smali
smali\com\whatsapp\RegisterPhone.smali
smali\com\whatsapp\Settings.smali
smali\com\whatsapp\VerifyNumber.smali
smali\com\whatsapp\VerifySms.smali
smali\com\whatsapp\ViewSharedContactActivity.smali
smali\com\whatsapp\wallpaper\CropImage.smali
smali\com\whatsapp\wallpaper\WallpaperPicker.smali
Simplemente con esto, si realmente WhatsApp usa dicha función para el cambio de estado, estaríamos restringiendo la búsqueda de más de 4000 archivos a 25 posibles lugares, en los cuales puede ser por supuesto más de uno. 25 es un número suficientemente manejable como para ir buscando en cada archivo manualmente, pero no soy un sádico y vamos a acotarlo aun un poco más. Con poco de inglés que sepamos y aplicando un poco la lógica común, podríamos cribar estos 25 resultados desechando aquellos que parecen no tener absolutamente nada que ver con la actualización del estado, ya que el listado anterior simplemente nos dice donde se está usando dicha función, pero evidentemente dicha función se usa para muchas cosas, no solo modificar supuestamente el estado:
smali\com\whatsapp\AccountInfoActivity.smali
smali\com\whatsapp\DialogToastActivity.smali
smali\com\whatsapp\DialogToastListActivity.smali
smali\com\whatsapp\ViewSharedContactActivity.smali
La razón por la que he suprimido los anteriores no está basado en que evidentemente antes de escribir estas letras ya sé que modificar o buscar, sino en el sentido común. Si tengo un archivo llamado WallPapperPicker, es de suponer que el punto exacto que estoy buscando no se encuentra en él. Por supuesto, de nuevo se está simplemente presuponiendo, esta aseveración podría ser errónea y llevar a un camino sin salida, con lo que de nuevo tendríamos que dar marcha atrás, aumentar el campo de búsqueda y ver si hay mas suerte.
Por experiencia y por el nombre de los archivos, automáticamente habría optado de los 4 archivos mencionados por el segundo y el tercero, DialogToastActivity y DialogToastListActivity, puesto que precisamente lo que quiero es inhibir el estado de conexión, el cual se refleja en lo que en ingles podría llamarse “toast”. Si esos dos archivos no me diesen la solución que busco, buscaría en los otros dos. En este caso concreto, lo que se busca está exactamente en el archivo DialogToastListActivity.
Este archivo podemos editarlo con cualquier editor de texto, y por suerte es un archivo pequeño, unas 670 líneas. Si buscamos por onResume, vemos que nos lleva a la línea 600 aproximadamente, y vemos que comienza un pequeño bloque de unas 25 líneas en Dalvik, algo sinceramente bastante pequeño. Llegado a este punto llegaría la segunda parte complicada, que punto modificar y como, a lo mejor basta con eliminar, a lo mejor se requiere modificar o quizás es añadir. Esto ya es más complejo porque implica tener conocimientos de Dalvik, que aunque es bastante sencillo hay que entenderlo. En este caso concreto podemos hacer alguna chapuza rápida que funcione relativamente bien, para no tener que entrar en muchos detalles.
Si leemos el bloque, vemos que en un momento dado se llama a la función onResume, y después de ello la siguiente función que se invoca de forma clara es sendEmpyMessageDelayed. Posiblemente la mayoría de programadores de Android conocen dicha función, y quien no la conozca puede buscar información al respecto, pero básicamente lo que hace esa función es enviar un mensaje cada X milisegundos, y aquí la palabra mensaje adquiere un amplio significado.
El pedazo de código que nos interesa sería por tanto:
.line 8
iget-object v0, p0, Lcom/whatsapp/DialogToastListActivity;->d:Lcom/whatsapp/jd;
const/4 v1, 0x0
const-wide/16 v2, 0xbb8
invoke-virtual {v0, v1, v2, v3}, Lcom/whatsapp/jd;->sendEmptyMessageDelayed(IJ)Z
.line 2
const/4 v0, 0x1
En java, todo ello equivaldría más o menos a:
d.sendEmptyMessageDelayed(0, 3000L)
En Android sería algo así como enviar el mensaje ‘0’ cada 3 segundos desde que la aplicación se resuma. Si estamos en lo cierto y todas las presunciones son ciertas, que pasaría por tanto si elimino dicho bloque?? En realidad en Dalvik hay que tener mucho cuidado porque es un lenguaje basado en registros, con lo que no suele ser bueno eliminar asignaciones a registros, puesto que quizás la línea que esté más abajo use el mismo registro para otra cosa, y si la asignación se elimina tendremos problemas. Por tanto podríamos limiter la eliminación a la línea:
invoke-virtual {v0, v1, v2, v3}, Lcom/whatsapp/jd;->sendEmptyMessageDelayed(IJ)Z
Si eliminamos esa simple línea, y todo lo que hemos dicho se cumple, al resumir la aplicación nunca se comenzaría a enviar el mensaje de actualización de cambio de estado (o lo que sea que contenga en ese punto los mensajes ‘0’). La pregunta es si realmente ese es el punto exacto, o si dicha modificación posee efectos no deseados. Pero para eso la única opción posible es recompilar la aplicación con el cambio realizado y probarlos.
En este caso concreto, veríamos que efectivamente simplemente por eliminar dicha línea y recompilando el código, funcionaría perfectamente. No obstante tendría dos efectos secundarios no deseables, aunque serían “mínimos”. Realizando dicho cambio nunca veríamos si el contacto con el que hablamos está o no conectado en ese mismo momento, así como que tampoco nos aparecería el “Está escribiendo…”, pero nada más, todo lo demás funcionaría perfectamente. Este problema es debido a que el mensaje ‘0’ que se envía cada 3 segundos no solo contiene nuestro estado de conexión. Por supuesto que esto puede ser perfeccionado y mejorado para suprimir tan solo nuestro estado de conexión.
Otra aplicación práctica de todo ello sería por ejemplo suprimir el envío de “Está escribiendo…” de forma que el contacto con el que hablamos nunca pueda saber si estamos escribiendo o no, lo cual implicaría por ejemplo eliminar un par de líneas en el archivo App.smali sin ningun otro efecto secundario. Podría aplicarse también para producir el efecto opuesto, aparentar estar siempre en línea, o incluso crear en las opciones un botón para habilitar o deshabilitar la actualización de estado a voluntad. En realidad no hay límites, simplemente hay que pensar que deseamos hacer e implementarlo.
Esa imagen está tomada desde otro WhatsApp el día 9 de febrero mientras ambos mantenían una conversación, en el estado vemos perfectamente que la última vez de conexión de Theliel (Alma Oscura) fue el 30 de Enero, contacto con el que además se estaba hablando en ese mismo momento, con lo que tendría que poner en línea de echo.
Un saludo, y disfrutar de la invisibilidad de WhatsApp.
Agregado a mi RSS, senzillamente increible!
Hola!!
Estoy empezando con esto del apktool, y queria antes que nada hacer una senzilla prueba como es coger la app Whatsapp y cambiarle el icono, asi si funciona luego ya me meto con esto.
Hago lo siguiente, me bajo al apk, la pongo en el directorio del apktool y tiro lo siguiente desde consola:
Código:
apktool.bat d WhatsApp.apk app
Descompila correctamente, modifico el icono y intento volver a compilar con esto:
Código:
apktool.bat d WhatsApp.apk app
Pero no hay manera, me tira este error:
Código:
I: Building resources…
c:\apktool\app\res\layout-large\abs__action_mode_close_item.xml:5: error: No res
ource identifier found for attribute ‘textAllCaps’ in package ‘android’
…..
seguido de muchos otros.
Me puedes echar una mano?
Un saludo!
escribe simplemente apktool para ver como funciona dicha aplicacion, y verás rapidamente tu problema
Ya me he mirado el Help, pero no encuentro el problema, te importaria guiarme un poquito mas?
Gracias!
Pues entonces te tendría que decir que la leyeses otra vez, puesto que a menos que sea un error al publicar tu comentario, no lo has leído bien, te estás equivocando en una letra para ser exactos, cito textualmente:
d[ecode] [OPTS]...
b[uild] [OPTS]...
Ostras!! Perdona, ha sido un error de copy/paste al escribir el comentario, queria decir que compilo con lo siguiente:
apktool.bat b c:\apktool\app whats.apk
Alguna sugerencia?
Perdona las molestias!
Ya me extrañaba
Que apktool estás usando? Primero comprueba que usas la última versión y no te has descargado el paquete de algun lugar extraño, mas que nada porque se han creado muchas versionese parecidas por problemas que tenia anteriormente.
Por otro lado no veo ningún tipo de problema, a menos que hayas modificado el nombre del archivo o alguna cuestión similar, que no debería de ser el caso en una simple sustitución de archivo
Efectivamente para probar, lo mejor es partir del ejemplo más sencillo. Pero puedes simplificar aun más tus purebas, antes de modificar nada trata simplemente con:
a) Decompilar
b) Recompilar (si, sin modificar nada)
c) firmar e instalar
Si eso funciona, el problema es la modificación por alguna causa
La ultima version colgada por el autor, http://code.google.com/p/android-apktool/downloads/list apktool-install-windows-r05-ibot.tar.bz2
He probado lo que dices pero no me lo hace, como si me faltase algo, de software relacionado tengo
Windows 7
JDK 7 up 13
SDK Android v21 + Eclipse
No se, es como si me faltara algun tipo de dependencia o algo, te dejo un pantallazo para que veas toda la sequencia de comandos.
Imagen: http://imageshack.us/photo/my-images/221/capturajmn.png/
Un saludo y gracias por tu ayuda
Eso es parte de apktool, pero solo una parte, esa es la especifica de Windows, hace falta tb la generica que es un jar, tb esta en el mismo sitio
Tambien lo tengo descargado el jar, y metido dentro de la misma carpeta que el exe y el bat, hay que hacer algo mas para configurarlo?
Ahora probare en una VM de Linux a ver si alli si me funciona
Un saludo!
Sigo investigando, en mi S.O principal, W7 x64 no funciona, en cambio he instalado una VM con un W7 x86 y si me ha funcionado. Ahora estoy investigando a ver si consigo descubrir de donde venia mi fallo, de momento he hecho una desinstalacion limpia de todo el java y instalacion de jre y jdk 32 i 64 bits todo des de limpio y nada, seguimos en las mismas.
Un saludo!
Puedes usar perfectamente tanto una versión de de 32 bits como de 64 bits, no importa. Lo normal es que si tienes la versión de 64 bits, instales el JDK aun así de 32bits, y el JRE de los dos, no debrías de tener problema. Instala solo el JDK de 32 repito
Otro problema q a veces sucede es el framework que copia al PC, generalmente en c:\usuarios\tusesion\apktool, elimina esa carpeta cuando tengas errores. Puedes especificarla tb por linea de comandos pero se tarda menos eliminandola la verdad
Encontrado!!
Resulta ser algun tipo de residuo que quedo del antiguo jdk6 o algo asi, tenia un par de variables de sistema ademas del PATH que apuntaban a un jdk/jre que no existia, ha sido eliminarlas y ahora ya funciona, compila y decompila sin problemas.
Espero que sea de ayuda a alguien!
Un saludo.
Espero no ser muy pesado, pero quería preguntarte otra cosa. Este tuto me salio a la perfeccion, al igual que el del SSHDroid. Ahora veo un preoblema, veo que en el momento que envias o recives un archivo por whatsapp (imagen, video, sonido, o lo que sea) si se te actualiza la ultima hora de conexion, por lo que entiendo que cuando se recive el archivo la app debe responder con algun paquete para informar, y de ese paquete se debe sacar una ultima conexion.
Crees que se podria llegar a anular tambien ese comportamiento?
Un saludo y gracias.
EL artículo que escribí deja muchos asuntos que solucionar, pero eso es porque nunca trató de ser un paso a paso de como realizar el crear la modificación de Whatsapp, sino que se puede.
Es normal que suceda lo que dices, y no solo eso, posiblemente si accedes a ajustes o intentas cambiar el estado o alguna cosa así también aparezcas en línea. Inhibir completamente el estado sin conexión sin ningún tipo de efecto secundario (por así d ecirlo) implica modificar otros archivos también. No es una cuestión ya de que no quisiese compartir dicha información, es una cuestión de que no era el fin del artículo.
Para empezar tendrias que modificar también los otros dos archivos DialogToast (depende de la versión de WhatsApp abrá más o menos de estos archivos), y aun así posiblemente aun te quedaría algún que otro pequeño efecto secundario.
Ánimo, con paciencia y a base de probar y experimentar se puede realizar, una vez se entiende lo que se está realizando, solo hay que saber primero que buscar, segundo donde buscar y tercero como cambiarlo. Y esto es válido para cualquier otra aplicación :)
Un saludo
Hola que tal estoy probando las modificaciones justo hoy pero los archivos que mencionas no aparecen en la carpeta del descomprimido del APK , no Existe una direccion smali\com\whatsapp… ni nada parecido en la carpeta “com” solo esta “paypal” y “google” Me podrias ayudar ¡
saludos
el apk no lo tienes q descomprimir se tiene que decompilar. Si si se hace de forma correcta debería de aparecer otras carpetas, con lo q o no lo estas decompilando bien, o algo te esta fallando
Tienes toda la razon tenia que descompilarla :# Muchas Gracias por la respuesta¡
mmmm no se si me prodiras ayudar con una cosa mas la verdad no queria molestarte con una pregunta que no fuera especifica sobre las carpetas codigo etc pero ya he bsucado demasiado y no he podido … no puedo descompilar correctamente descompilar compilar y firmar tengo un problema no se hacer la parte de escribir “framework-res.apk” habla de que primero tengo que mover el framework-res.apk & twframework-res.apk no se los descargue de una pagina pero habia muchos no se si son esos y como hago para isntalarlos dice que con un comando pero me marca error al hacerlo
Para decompilar aplicaciones que no dependen de ningún tipo de API De google o de ningun otro fabricante, no es necesario indicar los framework ni nada por el estilo
Tienes toda la razon ya he podido solucionar esa parte despues de provar con muchos programas :P pero ahora me he encontrado con otro problema… instale ya el whatsApp lo configure todo excelente… pero al intentar enviarme un mensjae para provar que si funcionaba me boto me sale que surgio un problema intentelo de nuevo y la opcion “Forzar cierre” no sabes o tienes alguna idea de a que se deva esto ?? como datos que he notado es que reinicio el telefono y abro whats me abre hasta la pagina donde estan todos mis mensajes previos y al intentar abrir una de las conversaciones me bota una ves echo esto ya nisiquiera me deja entrar a esta “pagina” simplemente me bota desde que doy click en la aplicacion si quiero que tarde un poco mas en botarme ( por asi decirlo ) tengo que reiniciar el telefono de nuevo
hojala me pudieras ayudar muchas gracias por las respuestas
y otra cosa aunque me bota muy rapido al reiniciar el telefono si abre la pagina principal por un momento como te habia comentado y efectivamente no marca el “ultima ves conectado ” en otros whats pero si todo le problema que te comento
Note otra cosa ( lo siento por tantos coments esque voy dandome cuenta ) borre los datos y volvi a configurarlo ( sin reinstalar y sin recuperar conversaciones pasadas que te da esa opcion al empesar) ahora no me bota cuendo inicio ( tarda mas que de costumbre en iniciar ) puedo estar todo el tiempo que quiera por asi decirlo pero me bota en cuanto trato de abrir una conversacion o algun contacto para iniciar una conversacion
Pues es sencillo, has eliminado, añadido o editado algo que no deberías de haber realizado :), no puedo decirte el que porque no he sido yo el que lo ha modificado.
Dicho de otro modo, te has equivocado en la edición en algún momento, algo que está interfiriendo con el correcto funcionamiento del programa, y por eso se cirra.
solo abro borro la linea y guardo no hago nadamas no se si sera a la hora de compilare ser eso … en muchos tutoriales dice que le das compilar despues tienes que borrar los archivos que modificaste de una carpeta creada o moficaste que por ejemplo si modificas algun xml tienes que borrar ” resourses.arsc ” que unos dice que borres la carpeta META-INF o algo asi y finalizar la compilacion …
talves sea hay por ejemplo con lo que se modifica la unica linea que es lo que se tendria que borrar ???
Ya lo he solucionado simplemente borre todo :P
Muchas gracias por las respuestas y por el excelente tutorial Theliel ya me habia dado por vencido con esto del WhatsApp hasta ver tu post :D
Gracias Salu2¡
Hola, como estas?
Hice todo tal cual el tutorial, se instaló perfecto, pero a la hora de la verificación del número de celular, me dice que fue modificado, que descargue la versión mas reciente del sitio web…
Eso es porque al iniciar el proceso de verificación comprueba si WhatsApp ha sido o no modificado. Hay varias cosas que pueden hacerse.
Modificar la aplicación para que emule el no haberse modificado y ser 100% genuina de cara a WhatsApp, o simplemente realizar una copia de seguridad con Titanium Backup por ejemplo (o a mano) cuando esté el original instalado y funcionando, desinstalar el original, instalar el modificado y sin iniciarlo restaurar la copia de TB (solo datos).
Opciones muchas.
Muchos habremos llegado a la misma conclusion, sobretodo los que tiramos de wifi pero… Tus contactos (al menos los mios) no se fijan solo en si estas en linea, cuando saben que vas con wifi y el mensaje no te llega(vamos, que solo aparece un tick o aparece em espera…) Tambien pueden sospechar. Eso como diantres se combate?? :’c
No te entiendo. No se inhibe el doble ckeck. En Android, al ser multitarea integral, cuando te mandan un mensaje el movil lo recibe de forma automática en cuanto tiene conexión, ya sea WIFI o 3G, con lo que el doble ckeck les aparecerá siempre. Que te llegue el doble ckeck en Android (muy diferente en iOS) no implica de ningún modo que leas el mensaje ni que abras siquiera WhatsApp. De echo el funcionamiento de Android en este sentido es infinitamente mejor que en iOS. En iOS el mensaje SOLO llega físicamente al terminal cuando el usuario ABRE, hace clic… en la aplicación WhatsApp. Por tanto, si el otro es usuario de iOS no nos hace falta siquiera mirar cuando fue la última vez que se conectó, puesto que en cuanto le llegue el doble check sabemos que se ha cnectado. iOS no es multitarea, cuando el usuario tiene el WhatsApp “minimizado” no está realmente minimizado, está detenido, no llega ningún mensaje, solo una notificación de mensaje, que es diferente.
En android esto es indiferente, si tienes conexión el mensaje llega a tu termina, con total independencia de que abras WhatsApp o no, porque siempre se está ejecutando de fondo ;)
Una de las infinitas razones por las uqe Android es infinitamente superior a iOS sin duda alguna
Nesecito que me quiten la opcion de aparecer la ultimas vez q me conecte en WhatsApp
Este no es el tipo de blog o foro en el que nadie entra pidiendo sencillamente por pedir. El artículo versa sobre como modificar una aplicación Android como WhatsApp para cambiar ciertos comportamientos, y se pone de ejemplo la supresión de ultima vez conectado. Te animo por tanto que te pongas con ello, es un artículo didáctico, si quisiese o pudiese compartir una aplicación modificada, pondría un enlace a ella, ¿no crees?
No quiero que miren la ultima vez que me conecte al WhatsApp
Graias
No quiero que aparesca la ultima vez que me conecte al WhatsApp.
Saludos
Hola, quisiera saber que linea de código debo modificar para que mis contactos no vean si estoy escribiendo. Muchas gracias y excelente explicacion.
saludos
de memoria como es natural no puedo acordarme! Precisamente escribí este artículo como ejemplo de las muchas cosas que pueden hacerse, nunca fue mi intención (como he dicho siempre)que fuese un paso a paso diciendo que modificar donde modificar y el resultado a esperar. Usando este artículo como ejemplo y como aprendizaje, es muy sencillo saber que modificar y donde
Muy interesante y didáctico tal y como comentas!
Lástima que tenga un Iphone.
Sería posible hacer algo parecido para el Whatsapp de Iphone?
Es decir decompilar –> modificar –> recompilar –> firmar y ejecutar?
Un saludo.
Si y no.
iOS usa Subjetive-C como lenguaje de programación, y el binario de la aplicacion principal se cifra cuando se instala desde el AppStore.
Lo segundo se puede sortear realizando un dump de la aplicación una vez en el terminal (que es como se piratean las aplicaciones de iOS), puesto que este dump contiene el binario sin cifrar.
Lo primero es mas complicado. El binario de la aplicación es fácil decompilarlo con cualquier decompilador, pero el código resultante no es un lenguaje intermedio como pueda ser Dalvik, sino que es lenguaje ensamblador puro y duro, el cual es bastante mas complicado de interpretar y modificar.
He seguido el tutorial para que no muestre el estado pero sigue apareciendome por que puede ser? He borrado esa linea que dices.
Gracias!!!
buenas noches, señores jovenes, señoritas
me acabo de leer el post parece buenisimo por los comentarios que lei buenisimo solo que no entiendo nada de progrmacion o como uds lo quieran llamar theliel, si asi podria llamarte soy un joven interesado sobre esto no solo del whatsapp si no que me enseñaras programacion lo que este a tu alcanze
antes de que notes mi ignorancia :( no se nada sobre el tema solo soy un joven de 17 años obligado a estudiar una carrera que no escojio y pues me gustaria aprender sobre programacion o como se llame esto ps siempre me intereso y no tuve derecho a escojer
antes de todo llegue a este blog o foro buscando como ocultar mi estado en linea pues poseo un terminal android
me gustaria empezar a aprender cosas como esta y despues poder lanzarme a cosas mas pesadas y me gustaria que me enseñaras
lo unico que tengo un pc con windows 7 y me gustaria saber que necesito para realizar todo este procedimiento como lei el comentario de iveth que este post es para realizarlo uno mismo no para que lleguen y lo pidan aunque tampoco tendria ninguna molestia jejeje…
que programas necesito para decompilar y recompilar
y si me podrias explicar los terminos de firmar? soy un novato y ps estare al pendiente de tu respuesta
Theliel Hola
buen tutorial, que tendria que buscar para eliminar y que no aparezca la hora en el muro de conversaciones en whatsaap,
gracias
Eso es lo que precisamente se “dice” y trata toda esta publicación, el como eliminar la hora de la ultima conexion :)
No funciona, ahora da error de aplicación, todo bien al iniciar, registrar, ver la lista de contactos, pero a la hora de iniciar una nueva conversación con algún contacto el android tira a pantalla negra e informa de un error.
Lo he probado con la versión 2.11.151 de Whatsapp.
Con que versión habéis probado?
Funcionando perfectamente con 2.11.151 :)
Fue probado en la 2.11.157? Al compilar el whatsapp nuevamente e instalarlo en mi movil y al querer abrir una nueva conversacion, me tira la pantalla negra y se me cierra…
Desde hace un par de días ya con la 2.11.157 y sin ningún problema
Que raro. Yo estoy usando el APK-multiTools para descompilarlo y volverlo a compilar, y sin modificar nada, cuando quiero abrir una conversacion en whatsapp, se me cierra la aplicacion con el mensaje de error… alguna sugerencia?
El problema de usar esas herramientas totalmente automatizadas (o casi) es que ante cualquier error no sabes por donde viene. Casi con toda seguridad sea un problema de que esas herramientas generan/importan un framework incorrecto ó (con más probabilidad aun) WhatsApp lo han actualizado para usar alguna API más actual y la versión de dichas herramientas que usas no están actualizadas/soportadas para la decompilación/recompilación.
En la medida de lo posible, lo mejor es acudir a las herramientas más… “puras”. Tú estás usando una suite que incorpora diferentes herramientas creadas por diferentes personas para diferentes tareas. Ya de por sí puede ser que una sola de las herramientas no sea compatible o pueda dar algún problema.. con lo que una “suite” como la que usas está condenada a dar problemas. Entiendo que este tipo de suite ayudan mucho a cierto sector menos… menos hábil en estas cosas, pero al final, como en este caso, te das contra la pared.
Intenta hacerlo de forma manual, usando solo smali y blacksmali en sus versiones más actualizadas, a ver que tal
Muchas Gracias por tu respuesta! Haciendo todo manual ya logré modificar algunas cositas y lograr que funcione normalmente en mi celular.
Ahora voy a seguir investigando por mi cuenta como cambiar algunos otros aspectos. Nuevamente muchas gracias por tu atención y te felicito por el blog, es muy interesante realmente.
Saludos desde Argentina!
Buenas, muy bueno el articulo. Se te ve una persona muy inteligente y con una gran locuacidad. Yo en cambio necesito darle muchas vueltas a las cosas para encontrar el camino correcto. Estoy teniendo muchos problemas para decompilar/ compilar y creo que es debido al OS que lo tengo hecho un asco. Problemas con java que no lo encuentra, pero esto es algo sobre lo que no preguntaré, ya se me encenderá la bombilla. Más bien vengo intentando aportar un granito de arena en una playa kilométrica.
Corrígeme si me equivoco.Si el problema de que el whatsapp cuando arranca te informa de que la apk ha sido modificada es por la firma, y teniendo en cuenta que los smali están si no me equivoco en el classes.dex. No cabe la posibilidad de que una vez compilado, sobrescribas dicho archivo “classes.dex” modificado ya en una copia del original sin modificar para así guardar la firma autentica?
Saludos y enhorabuena.
Conservar la firma original de cualquier aplicación es algo trivial, solo hay que copiar la carpeta meta-inf original de la aplicación y una vez recompilada la aplicación ponerla dentro de nuevo.
El problema no es ese, es algo mas complejo. El poder de una firma digital se encuentra principalmente en el no repudio. Es decir, una forma cumple dos funciones fundamentales:
a) Verificar de forma inequívoca el firmante
b) Garantizar la integridad de los datos
En este caso, si conservásemos la firma digital WhatsApp efectivamente podría verificar que la firma pertenece a Whatsapp, PERO la integridad de los datos es totalmente destruida. Cada archivo se “firma” de tal modo que cualquier cambio que se realizase a cualquier archivo de la aplicación, la firma se invalidaría. Es muy sencillo hacer esto:
Proceso de ida:
1. A cada archivo de la aplicación se le calcula un Hash, por ejemplo un SHA1.
2. Se crea una lista con el hash de cada uno de ellos, y dicha lista se firma con el certificado digital del emisor.
Proceso de vuelta:
1º. Android o cualquier sistema como posee el certificado publico de la entidad es capaz de descifrar esa “lista de archivos”. Si no pudiese descifrarla con el certificado publico GENUINO, el sistema ya sabriá automáticamente que la aplicación ha sido modificada, puesto que ha sido firmada por un certificado que NO PERTENECE realmente al emisor, pq si así lo fuese el certificado publico lo abriría (Sistema de cifrado asimetrico, claves privadas y públicas)
2º. En el caso de que el certificado publico sea capaz de abrir la firma, lo que te encuentras ahora es un listado correspondiente a TODOS los archivos ocn su correspondiente Hash. El sistema calcula el Hash a cada archivo y lo compara con los de la lista, si coinciden, la integridad esta garantizada, si no coincide es que algún archivo ha sido modificado, la firma por tanto se invalida.
Dicho todo esto, en el caso particular de Whatsapp hay solo dos opciones:
1º. Mantienes la firma de WhatsApp, pero la aplicación no permitirá ser instalada en Android (por defecto), lanzará un error de cetificado inválido (ya que aunque la firma es correcta, la integridad de la aplicación está comprometida, y por seguridad se bloquea. La úninca opcion a esto es tener parcheado el framework de Android para que se permita la instalación de aplicaciones aun cuando existan problemas de este tipo. Un ejemplo similar es lo que hace la aplicacion Lucky Patched (en telefnos rooteados)
2º. Si el teleono o esta rootead la 1º es imposible. La unica opcion es firmar la aplicación uno mismo. De este modo android permitirá su instalación pq la integridad está totalmente asegurada (pero firmada por osotros claro). El problema entonces estará cuando la aplicación Whatsapp verifique por ella misma sus certificados…
Ante este problema tb hay dos soluciones:
a)Si esta rooteado, insstalar un whatsapp normal, iniciar sesión, copiar los datos de la aplicación, desinstalar, instalar la modificación, restaurar los datos.
b) Si no está rooteado, iniciar whatsapp normal, validarlo, desinstalarlo, instalar el whatsapp modificado y llegado a este punto Whatsapp por suerte no veriica la autenticidad de la aplicación en todo momento, solo en la verificación del telefono, cosa que se hace solo la primera vez q se ejecuta whatsapp en nuestro movil
Cierto es que, al desinstalar whatsapp de un terminal y volver a instalarlo en el mismo sin haber intentado abrirlo desde otro la verificación de número queda intacta y no te la pide de nuevo.
Gracias.
jajaja ni que me importara tanto!!!
[Editado: No me gusta el SPAM]
leomark gracias por el Spam gratuito
[…] Como inhibir el “Ultima vez conectado” de WhatsApp y … – Estoy seguro que la mayoría que tenga WhatsApp le gustaría que sus contactos no supiesen cuando estás conectado a él, no son pocos los que envían un mensaje y… […]
[…] Basado en el tutorial de Theliel: https://blog.theliel.es/2013/02/como-inhibir-el-ultima-vez-conectado-de-whatsapp-u-otros-comportamien… […]
Hola, a mi me pasa algo totalmente inquietante, cuando quiero ver la última conexión de alguien, cualquier persona me sale un minuto después que la mía, no entiendo a q se debe la versión q tengo instalada es 2.11.2134, espero tu comentario. Gracias.
Pues lo primero sería que verificases tu Whatsapp, no se si es una errata o no pero esa versión de whatsapp no existe. Asegurate de tener la versión mas actualizada primero, y desde los canales oficiales:
http://www.whatsapp.com/android/current/WhatsApp.apk
[Editado]
No se permite ningún tipo de comentario que sea publicitario
hojala y sigas tratando mas temas de ingenieria inversa en android.. bro , donde podria encontrar mas informacion sobre este tema?
Hola pues yo me he descargado una aplicación que me recomendó una amiga y estoy super contenta , ya no me ven conectada al whatsapp y puedo leer y contestar los mensajes sin que me vean , fuera cotillas jajajaja , os paso el enlace , espero que os guste como a mi .