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!!
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!!