Acceder

Ver la Versión Completa : [ TUTORIAL ] Android Reverse Engineering (destripando Whatsapp)


id_34561
29/02/12, 18:47:31
Buenas,

Esta es una guía que he decidido hacer a raíz de varios post que hice tratando de ayudar aquí: [THEMES/MODS] Whatsapp (http://www.htcmania.com/showthread.php?t=308752)


Requisitos mínimos:

- Tener algo de idea de java
- Tener algo de experiencia en decompilar y compilar apks >> Tutorial extenso (http://www.htcmania.com/mediawiki/index.php/C%C3%B3mo_descompilar_y_compilar_APKs)

Víctima:

Whatsappv2.7.4462: http://www.mediafire.com/download.php?7961658qi9ix7de

Herramientas:

- APK Manager 5.0.2 (Decompilador/Compilador): http://www.mediafire.com/?qyi34oon95nz74w
- Super Finder XT (Buscador de texto): http://fsl.sytes.net/ssearchxt.html
- Notepad++ (Editor potente de texto): http://notepad-plus-plus.org/

Con estas herramientas vamos a decompilar, buscar texto, editarlo y compilar. Hay alternativas obviamente, si gustáis de otras herramientas para esto perfecto, yo simplemente indico las que yo suelo usar :-)

[Tuto rápido de AKPManager]
- Descargáis y descomprimís APK Manager 5.0.2.zip (http://www.mediafire.com/?qyi34oon95nz74w)
- Metéis Whatsappv2.7.4462.apk (http://www.mediafire.com/?7961658qi9ix7de) en Apk_Manager_5.0.2\place-apk-here-for-modding\
- Doble click en 'Script.bat'
- Pulsáis 22 + Intro (Seleccionar APK)
- Pulsáis 1 + Intro (suponiendo que solo haya un apk)
- Pulsáis 9 + Intro (Decompilar)
- Vais a "Apk_Manager_5.0.2\projects\Whatsappv2.7.4462.apk" y hacéis los cambios pertinentes en res/ o smali/
- Si SÍ tenéis el móvil conectado con adb, pulsáis 14 + Intro. Si todo va bien, os instalara el nuevo apk firmado
- Si NO tenéis el móvil conectado con adb, pulsáis 25 + Intro. Si todo va bien encontrareis vuestro apk firmado y listo para pasar al móvil e instalar en "Apk_Manager_5.0.2\place-apk-here-for-modding\"

http://img836.imageshack.us/img836/5672/apk.png

Descripción:

He buscado un ejemplo bastante "sencillo". Así a groso modo, un texto cuyo color viene forzado mediante código, le aplicamos magia para que dicho color se pueda cambiar mediante XMLs, lo cual es más intuitivo y rápido

El texto en cuestión es el nombre de los participantes en un grupo, que como veis es diferente para cada contacto. Ese color viene fijado por código

http://img705.imageshack.us/img705/1058/screenshot2012022917364.png


Al lio:

Suponemos que ya tenemos whatsapp decompilado

Por un lado tendremos la carpeta /res con todas las imagenes y XMLs, y por otro la carpeta /smali con todo el código

Nuesta víctima se llama "name_in_group_tv" y la encontramos en el XML siguiente:

res/layout/conversation_text_row_left.xml

En esta línea:
<TextView android:textSize="@dimen/conversation_participant_name_tv" android:textColor="#ff000000" android:ellipsize="end" android:autoLink="all" android:layout_gravity="top" android:id="@id/name_in_group_tv" ...

Aquí no voy a discutir como sé que es esa variable, doy por supuesto que el que esté interesado en esta guía hasta ahí llega ;-)
Para lo siguiente os viene bien el conocer java y programación en android

Supongo que sabemos que todas (o casi todas) las cadenas de texto (strings) residen en:

res/values/string.xml

Y que todas esas cadenas tienen un valor en hexadecimal listado en:

res/values/public.xml

Para este ejemplo pasamos de string.xml. Vamos a buscar el valor que tiene nuestra víctima en hexadecimal, por lo tanto buscamos "name_in_group_tv" dentro de public.xml

<public type="id" name="name_in_group_tv" id="0x7f0d00a1" />
Ya sabemos entonces que nuestra víctima pasa a llamarse 0x7f0d00a1

¿Por qué hacemos esto? Porque en los smali (código) no se usan las cadenas de texto sino que se sustituyen por estos "punteros" en hexadecimal

Ahora nos toca buscar a nuestra víctima dentro de los smali. Para ello tiramos de SuperFinder:

http://img840.imageshack.us/img840/1539/superfinder.png

Tenemos 2 resultados, uno obviamente es dentro de public.xml y el otro es el que nos interesa: ge.smali

Abrimos ge.smali y buscamos "0x7f0d00a1"

Encontramos 2 referencias:

.line 140
iget v0, p1, Lyb;->a:I

iput v0, p0, Lcom/whatsapp/ge;->w:I

.line 5
:cond_b
const v0, 0x7f0d00a1

invoke-virtual {p0, v0}, Lcom/whatsapp/ge;->findViewById(I)Landroid/view/View;

move-result-object v0

check-cast v0, Landroid/widget/TextView;method public e()V
.locals 5

.prologue
const/4 v4, 0x0

.line 113
const v0, 0x7f0d00a1

invoke-virtual {p0, v0}, Lcom/whatsapp/ge;->findViewById(I)Landroid/view/View;

move-result-object v0

check-cast v0, Landroid/widget/TextView;

Si miramos bien donde encontramos la segunda coincidencia, no encontramos nada referente al color. Descartada pues (os pongo el método entero por si lo queréis ojear http://pastebin.com/yvu8YvhD, ¿que qué es un método? Necesitas idea de java te dije :-) )

En la primera coincidencia, si vamos bajando, pronto nos tropezamos con lo siguiente:

.line 74
iget-object v1, p0, Lcom/whatsapp/ge;->s:Landroid/widget/TextView;

iget v0, v0, Lcom/whatsapp/ks;->a:I

invoke-virtual {v1, v0}, Landroid/widget/TextView;->setTextColor(I)V

.line 35
iget-object v0, p0, Lcom/whatsapp/ge;->s:Landroid/widget/TextView;
Si buscamos en todo el método, esta es la única vez donde aparece setTextColor(I)V, por tanto parece que hemos dado con el tema. Si aparecieran más referencias ya tendríamos que calentarnos mas el coco, os dije que esta era fácil ;-)

¿Qué hacemos ahora? Probamos simplemente deshabilitando la linea (poniéndole # delante):

.line 74
iget-object v1, p0, Lcom/whatsapp/ge;->s:Landroid/widget/TextView;

iget v0, v0, Lcom/whatsapp/ks;->a:I

#invoke-virtual {v1, v0}, Landroid/widget/TextView;->setTextColor(I)V

.line 35
iget-object v0, p0, Lcom/whatsapp/ge;->s:Landroid/widget/TextView;
Ya hemos hecho nuestro pequeño hack al código. Ahora compilamos y probamos:

¿Qué cambio debemos esperar?
Como textColor="#ff000000", ahora "name_in_group_tv" (nombre de los participantes del grupo) debería verse siempre en negro

<TextView android:textSize="@dimen/conversation_participant_name_tv" android:textColor="#ff000000" android:ellipsize="end" android:autoLink="all" android:layout_gravity="top" android:id="@id/name_in_group_tv"Et voilà, aquí tenemos el resultado:

http://img440.imageshack.us/img440/7858/screenshot2012022916303.png

Ha salido más extenso de lo que pensaba pero os puedo asegurar que es el ejemplo más simple que pude dar

Espero que haya quedado más o menos claro, que no me cosáis a preguntas ya que esto es un pasatiempo, y que os sirva más para animaros a hacer vuestros propios "hacks"

:ok:

A más ver!!

id_34561
29/02/12, 18:54:32
Reservado por si decido añadir más ejemplos

seimu
01/03/12, 10:52:54
Muchísimas gracias @rafalense, lo has explicado muy claro (así deberían de ser todos los tutoriales). Ahora no puedo llevarlo a la práctica, pero esta tarde me pongo, no tengo ninguna duda sobre el proceso, muy bien explicado con los pasos a seguir, gracias :)

Lo que si aprovecho y te hago una consulta.

@id/message_text = 0x7f0d00af ----> para que no cambie de color la fuente en el chat de grupo (modificando 2 líneas)

@id/contactpicker_row_name = 0x7f0d0080 ----> para el cambio de color en la lista de contactos

Dime si me equivoco :risitas:

De nuevo gracias máquina, da gusto tener compañeros así. Un saludo :)

id_34561
01/03/12, 13:08:52
Gracias seimu!! Posiblemente caiga algún otro tuto más. Seria interesante ir viendo vuestros avances, yo os echo una mano en lo posible


@id/message_text = 0x7f0d00af ----> para que no cambie de color la fuente en el chat de grupo (modificando 2 líneas)


@id/contactpicker_row_name = 0x7f0d0080 ----> para el cambio de color en la lista de contactos
:

Supongo que estás en otra versión. Para la versión 2.7.4462 son:

name="message_text" id="0x7f0d00b0" />name="contactpicker_row_name" id="0x7f0d0081" />Si te fijas ambos están desplazados una posición. Pero en conclusión, le pillaste el truco ;-)

Es simple: buscas tu víctima (id que no se deja cambiar color por XML), y buscas su equivalente hexadecimal en public.xml

seimu
01/03/12, 15:12:36
Si @rafalense, estoy en otra versión que tenia por aqui a mano. Pues gracias de nuevo máquina por tu ayuda. Yo aportar cosas nuevas poco, lo hago con los temas. Pues un saludo y esta tarde comento que tal me ha ido.

id_34561
03/03/12, 14:35:28
Para LuisLan:

Esto es una pequeña extensión a lo explicado aquí para cambiar el color de "contactpicker_row_name":

http://www.htcmania.com/showpost.php?p=3928421&postcount=426

LuisLana reportó ayer este fallo:
Me acabo de dar cuenta de otro bug en la lista para seleccionar el contactos/grupo con quieres compartir un archivo.

99888

http://www.htcmania.com/attachment.php?attachmentid=99888&d=1330669979

Y me parece que es algo parecido a lo que pasa con el color de los mensajes de grupo porque al mover la lista se oscurecen algunos nombres al azar y luego vuelven salir en blanco y se oscurecen otros. :loco:
Seguimos en version 2.7.4462

Víctima: public type="id" name="contactpicker_row_name" id="0x7f0d0081" />Buscamos 0x7f0d0081 y con Superfinder y nos aparece en kd.smali y md.smali

Si miramos en kd.smali no vemos ninguna sentencia settextcolor, lo olvidamos

Vamos a md.smali y ahí sí tenemos varias:


const-string v3, ""

invoke-virtual {v2, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

.line 58
const/high16 v3, -0x100

invoke-virtual {v0, v3}, Landroid/widget/TextView;->setTextColor(I)V

.line 38
invoke-virtual {v5, v8}, Landroid/view/View;->setLongClickable(Z)V

.line 63
if-eqz v6, :cond_f
if-eqz v3, :cond_d

.line 33
const v3, 0x7f09014d

invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(I)V

.line 13
const v3, -0x777778

invoke-virtual {v0, v3}, Landroid/widget/TextView;->setTextColor(I)V

.line 87
invoke-virtual {v5, v9}, Landroid/view/View;->setLongClickable(Z)V

if-eqz v6, :cond_e
.line 18
if-nez v4, :cond_13

:goto_2
invoke-virtual {v1, v3}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V

.line 51
const/high16 v1, -0x100

invoke-virtual {v0, v1}, Landroid/widget/TextView;->setTextColor(I)V

.line 7
invoke-virtual {v5, v8}, Landroid/view/View;->setLongClickable(Z)V

.line 68
:cond_e
Esta última era la que fijaba el color negro a "contactpicker_row_name", ya la deshabilitabamos en el post que indico arriba
La 2ª fuerza un color -0x777778, que tiene pinta de ser gris, la olvidamos

La 1ª es igual que la que hicimos en su día, y si la probamos, efectivamente es la que produce el bug mencionado por LuisLan

Deshabilitamos y solucionado pues ;-)

A más ver

LuisLAN
03/03/12, 16:43:14
Muchísimas gracias por tomarte el tiempo para sacarme de esa duda y por ayudarnos a todos en este foro. (Ya el botón de agradecer no me deja. Jajajajaja)

Neophron
04/03/12, 17:50:06
Excelente tutorial. Gracias.

SG2COL
17/03/12, 05:47:08
Muy interesante tu post definitivamente en HTCMANIA encontramos de todo.

Te mando un Mp haber si me colaborar con algo gracias.

M89
17/03/12, 14:12:35
este tema oscuro me gusta, donde descargo la apk. gracias:-)

SG2COL
17/03/12, 15:10:35
este tema oscuro me gusta, donde descargo la apk. gracias:-)

En el primer tema están los enlaces

M89
17/03/12, 16:50:18
gracias, ya he bajado "la victima"X-D

aisack_yo
29/03/12, 16:41:20
Me vuelvo loco tanto leer jaja no me entero demasio d los colores!a vee si me echais una mano!para cambiat los colores de las conversaciones donde tengo que cambiar?en res layaout?

mtiradoarenas
19/07/12, 04:14:18
Rafalense, genial tu tuto es increible y muy bien explicado. Me gustaria poder modificar la variable que hace las copias de seguridad diarias de whatsapp para que las hiciera con los inetrvalos de tiempo que yo especifique. Creo que la cosa va por aquí, pero me gustaria que me ayudaras:

dentro de \Apk_Manager_5.0.2\projects\WhatsApp.apk\res\value s\public.xml está <public type="id" name="advanced_backup_db" id="0x7f0d001d" /> y "0x7f0d001d" me lleva a \Apk_Manager_5.0.2\projects\WhatsApp.apk\smali\com \whatsapp\Advanced.smali donde leo en la linea 1087 lo siguiente: const v0, 0x7f0d001d. ¿Qué debo hacer para modificar el intervalo entre copia y copia de seguridad automatica que genera whatsapp? Gracias por anticipado y perdona mi desconocimiento.

LuisLAN
08/08/12, 04:17:15
Hola @rafalense

Las 2 últimas versiones de Whatsapp que han salido en la página oficial dan error cuando trato de compilarlas de nuevo usando el apktool, quería saber si te ha pasado algo similar.

Pensé que podia ser algún error en los archivos que modiqué y por eso hice una prueba descompilando y compilando de nuevo la versión original sin hacerle ningún cambio y también da el mismo error.

Feboy
24/12/12, 05:11:01
Compañero, modificando Tuenti Classic llevo mucho tiempo sin lograr solucionar un color de texto forzado en las pantallas de mensajes privados. No se si usas Tuenti, te lo detallo por encima.

El nombre del contacto en el item aparece en negro forzado y cuando se recibe un nuevo mensaje éste cambia a un verde oscuro en vez de, por ejemplo, resaltar el listitem en otro color (que es lo que querría). No he conseguido cambiar esos colores mediante los xml.

203110

He podido cambiar el fondo, el tamaño, el color del resto... El xml del item es éste:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@id/ll_notification" android:background="#00000000" android:paddingLeft="9.0dip" android:paddingTop="5.0dip" android:paddingRight="6.0dip" android:paddingBottom="5.0dip" android:layout_width="fill_parent" android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<com.tuenti.android.view.AutoImageView android:layout_gravity="top" android:id="@id/iv_avatar" android:paddingRight="8.0dip" android:layout_width="42.0dip" android:layout_height="42.0dip" android:src="@drawable/avatar_female" />
<TextView android:textSize="14.0dip" android:textAppearance="@style/wall_time" android:textColor="#ff33b5e5" android:id="@id/tv_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="10:30" android:layout_alignBaseline="@id/tv_name" android:layout_alignParentRight="true" />
<TextView android:textSize="16.0dip" android:textStyle="bold" android:textColor="@android:color/white" android:id="@id/tv_name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Pedro García" android:singleLine="true" android:layout_toLeftOf="@id/tv_time" android:layout_toRightOf="@id/iv_avatar" />
<TextView android:textSize="12.0dip" android:textColor="#ff999999" android:id="@id/tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Text" android:singleLine="true" android:layout_toLeftOf="@id/iv_reply" android:layout_toRightOf="@id/iv_avatar" android:layout_below="@id/tv_name" />
</RelativeLayout>


En el smali que corresponde a listitem_sms.xml (0x7f03002d) no encuentro nada referente al color, en tv_name (0x7f0c003f) tampoco.

203111

¿Alguna idea?

domin05
25/12/12, 17:50:45
Es u. Gran post!!! Me uno

Sa_Ve
19/03/15, 19:08:41
a mi solo me aparece la carpeta smali, ¿por que será?

Ya supe como hacerlo, pero tengo una duda, ahora solo me aparece todo así, abra el xml que abra
https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpf1/v/t35.0-12/11032240_372481462944250_53992854_o.jpg?oh=0c71bda b547843411b1536d40399132f&oe=550DF453&__gda__=1426910350_9d33e8a1e7bcc1b4cba7508d4b05e1e d

alejita_pinto
02/04/15, 01:30:40
tengo una pregunta podríamos agregar a loa audios de Wp un tipo de efecto tipo el calle Voice changer-intcall en plan usarlo en las llamadas y asi