Erwin.Ried.cl / Desarrollos / Cracking /
De ruso a español en pocas horas

¿Qué sucede cuando hay una aplicación que necesitas pero lamentablemente está en otro idioma con excepción del inglés? En este artículo mostraré cómo se puede adaptar una aplicación a nuestro idioma y adicionalmente cambiar comportamientos que parecen imposibles de modificar. Exactamente este artículo se basa en modificar una aplicación rusa de administración de un SAI (UPS) (08/07/2007 04:41 AM)


1. La problemática

Hace unos meses compré una pequeña UPS (SAI) para mi computador. Una UPS es un dispositivo que permite que tu equipo siga encendido luego de un corte de la energía, mantenido por baterías durante unos minutos para alcanzar a cerrar tus documentos y apagar el equipo.

Todo bien hasta el momento de instalar la aplicación que venía con el aparato. El programa se llama Winpower y es compatible con una gran variedad de sistemas operativos, compatible gracias a que está programado en Java:



Aunque personalmente no me gustan las aplicaciones en Java en general para cosas como servicios del sistema, acepté instalar el programa por el hecho que lo necesitaba (el programa se necesita para programar eventos como el apagado del equipo frente a un corte de la energía). El dichoso programa instala cuatro servicios de Windows y muestra por unos instantes dos ventanas de la consola de Windows al iniciar el equipo. Luego de algunos retoques a Winpower, logré ocultar esas ventanas de la consola y cambiar algunos íconos del programa (por ejemplo el del área de notificaciones) para aceptar su existencia.

Winpower tiene varias cualidades, como por ejemplo poder controlar una red y funciones bastante interesantes, pero uno generalmente lo único que desea lograr con la UPS (que es sólo para un equipo) es apagar el computador cuando se corte la luz, aunque esté en una red hogareña.

Un día dejó de funcionar (no iniciaba uno de los paquetes), averigué un poco y al parecer el programa presentaba esos problemas de forma natural. En vez de reinstalarlo me puse a buscar una alternativa.


2. Una posible solución

Hay que considerar que mi UPS no es detectada por el panel de energía de Windows, lo que hubiera sido lo ideal para mí.


Luego de mucho rato de buscar, encontré una excelente alternativa. Era un pequeño programa escrito en Delphi, simplemente hacía lo que debía, la ventana principal del programa es la siguiente:



En la siguiente imagen se puede apreciar con más detalle todas las cualidades del programa y claramente el pequeño problema estético y práctico de que esté en ruso:




3. Comenzando a traducir

Como ayuda adicional encontré una imagen en donde alguien había traducido en un editor gráfico la ventana principal del programa al inglés para ayudar al uso del mismo:



Gracias a la ayuda de Restorator (eXescope o Resource Hacker), del paquete de idiomas complejos de Windows y del siguiente traductor, traducir partes del programa es bastante sencillo, por ejemplo el siguiente menú:



Corresponde al siguiente código en Restorator:



De esa forma podemos obtener un menú (y muchas de las otras ventanas del programa) traducidas elegantemente:



Y con su código equivalente en Restorator, esta vez en español:



De una forma similar este proceso se puede repetir para muchos de los textos en ruso. Ahora hay un problema, hay cadenas de texto que no pueden ser editadas de esta forma (simplemente porque no son recursos de la aplicación, sino cadenas de texto internas) y se necesita utilizar otra técnica.


4. El siempre útil editor Hexagesimal

Para ciertos mensajes y textos de advertencia que no se pueden modificar con un editor de recursos como en el punto anterior, se debe utilizar un editor como Hex Workshop. Un ejemplo de un mensaje que se debe modificar con el editor Hexagesimal es el siguiente:



El problema es encontrando esas palabras. Para hacerlo, simplemente se quita el soporte para idiomas complejos de Windows y ahora tenemos el siguiente mensaje a traducir:



Como nota aparte, toda la aplicación adopta ese aspecto al quitar el soporte para idiomas complejos de Windows:



Ahora simplemente buscamos esos carácteres en el archivo con el editor:



Un gran problema de este método es que es imposible modificar el largo de las frases, es decir debemos buscar palabras que utilicen correctamente los espacios por letra o simplemente rellenar las sobrantes con espacios en blanco (a veces se puede llenar los espacios con ceros, así el resultado es óptimo, pero en ciertas ocasiones esta acción provoca una corrupción en la aplicación). El cambio más adecuado sería de la siguiente forma:



Y finalmente obtenemos un mensaje así:




5. Ajustando un poco más las cosas

Hubo un mensaje que me dió más problemas que los demás. El mensaje de estado original de la UPS es el siguiente:



La complicación era para ajustar los textos, pues internamente se tiene algo así:



Dentro del área resaltada con rojo hay otra sección pequeña resaltada, la que corresponde a la que indica el "Voltaje de salida" en la notificación. El problema es que para cambiar las palabras originales sin corromper el programa es imposible y colocar palabras más cortas es antiestético (pues deberíamos rellenar con espacios y los valores, en este caso el voltaje, aparecerían separados). Es decir en las alternativas posibles tendríamos resultados como por ejemplo (ajustándonos a los largos originales):

Código:
...
Voltaje de entrada:221V
Voltaje de salida:     221V
...


¿Cúal fue la solución?

Colocar tabuladores (09 en ASCII) para separar los valores y mantener la estética. El resultado:



Bastante bien, ¿o no?


6. Basta de traducciones

Listo con las traducciones ahora pasemos a una fase algo más entretenida: modificar comportamientos. El programa en general está bastante bien, tiene un simple visor de estadísticas:



y otras funciones interesantes más. Pero hay algo que me pareció totalmente ilógico, cuando se corta la energía el programa permite establecer un tiempo antes de apagar el equipo.

¿Qué sucede si no estamos en casa y dejamos un trabajo sin guardar o simplemente dejamos el computador por un rato?


Se corta la energía eléctrica, se apaga el equipo (sin dañarlo) pero y el estado de nuestro equipo... ¿se pierde?

Bueno, una forma fácil de solucionar este problema es modificando la instrucción de apagado para reemplazarla por una instrucción de hibernar el equipo. Con el simple pero poderoso OllyDbg y gracias a la documentación de las APIs de Windows sabemos que la instrucción de apagado es la siguiente:

Código:
User32 Library (user32.dll)

The ExitWindowsEx function either logs off the current
user, shuts down the system, or shuts down and restarts the
system. It sends the WM_QUERYENDSESSION message to all
applications to determine if they can be terminated. 

BOOL ExitWindowsEx(
  UINT uFlags,       // shutdown operation
  DWORD dwReserved   // reserved
);


Entonces, sin mucha dificultad buscamos las llamadas a la librería correspondiente:



Y luego de encontrarla la analizamos:





Si se fijan bien, OllyDbg nos da una pista sobre los parámetros de apagado. Según los parámetros se le ordena a la rutina a apagar el computador (forzando el apagado). Investigando nuevamente la documentación de las librerías del sistema encontramos la instrucción requerida para hibernar el equipo:

Código:
Kernel32 Library (kernel32.dll)

The SetSystemPowerState function suspends the system by shutting
power down. Depending on the ForceFlag parameter, the function
either suspends operation immediately or requests permission
from all applications and device drivers before doing so. 

BOOL SetSystemPowerState(
  BOOL fSuspend,  
  BOOL fForce     
);


Como detalle adicional la instrucción requerida se encuentra en otra librería del sistema.

Como es una librería cargada por defecto en el ejecutable procedemos a realizar el cambio, debemos establecer la nueva función con ambos parámetros para hibernar. El primer parámetro establece si el equipo se debe suspender o hibernar (con un cero o uno respectivamente) y la segunda establece si el sistema debe forzar el hibernado o no. Como queremos hibernar y forzar la hibernación establecemos los siguiente parámetros (están en orden inverso pues en ensamblador se hace un PUSH de los parámetros a una pila o STACK, en donde el último elemento que entra es el primero que sale, es decir LIFO):



OllyDbg convierte el nombre de la librería y de la rutina en la dirección de memoria correspondiente para realizar la llamada (CALL).


7. Capturas finales

Ahora la aplicación, el instalador y todos los mensajes están en español. Convenientemente ahora el programa hiberna el computador en vez de apagarlo.






8. Descarga y enlaces

· Página del distribuidor de la aplicación
· Descarga del programa original en ruso (versión 0.99.6)

Actualización del programa modificado (28/10/2006)
Pequeñas correcciones menores y traducción de algunos mensajes específicos en ruso que hasta el momento no habían aparecido

· Descarga del programa en español (versión 0.99.6 / WinNT)

Actualización (16/03/2007)
A petición de un lector, adjunto otra versión del archivo, en este caso es idéntica a la modificación del documento exceptuando que esta apaga el equipo en vez de hibernarlo, particularmente útil para Windows 9x

· Descarga del programa en español (versión 0.99.6 / Win9x)

Haga clic sobre una de las estrellas para calificar este artículo.

Opiniones y comentarios (Escribir un nuevo comentario)
Está bien, lo único que veo ahí es que cuando modificas la instruccion metes directamente la dirección de la API de tu máquina, así que para hacer que funcione en todas las máquinas deberías primero añadir la funcion y luego meterla en la tabla de importaciones para llamarla indirectamente, es decir, sería un: call [00xxxxxx] no un call directo como "creo" ver ahí. Salu2!!
Escrito por Shaddy (19/11/2008 03:56 AM)
Funciona en cualquier máquina, Windows mantiene una cantidad enorme de los diferentes DLL en las llamadas SxS (WinSxS), en una versión en particular de una librería, siempre se mantendrá la dirección fija a una función (como yo lo usé), y aunque no es el caso, no debemos preocuparnos del DLL hell en las versiones nuevas de Windows, aunque la solución que implementaron no sea la más elegante
Escrito por Erwin Ried (19/11/2008 02:34 PM)
Estimado, realmente muy buen artículo, especialmente para aquellas aplicaciones que han quedado abandonadas por sus autores. =) Gracias por compartir!
Escrito por SworD (02/07/2008 12:36 PM)
Muy buen articulo, me sigue sorprendiendo este cabro. =)
Escrito por Zealot (20/03/2007 10:04 AM)
Hola, me parece un artículo de lo más interesante y me gustaria saber si alguien me podria mandar el programa modificado en español con la opción de apagado, ya que lo he intentado y no soy capaz de cambiarlo. Mi dirección de Email es juanmalv@mixmail.com. Saludos
Escrito por Juanma (14/03/2007 06:40 PM)
Adjunté lo que necesitabas al final del documento
Escrito por Erwin Ried (16/03/2007 04:16 PM)
Holaaa! Pucha no esperaba menos de ti jijij Super bueno tu articulo, ahora lo lei todo, ya que tenia mas tiempo aca en Madrid. Te felicito niño... Sigue así. Saludos desde España Chau!! =)
Escrito por manecita (25/11/2006 03:47 PM)
Voy a ser honesto. Me encanta meter a estas páginas y dar cuesta de lo ignorante que soy en esta wea de la computación. Wn la cagaste, erí un genio...
Escrito por Anónimo (26/10/2006 04:15 AM)
Excelente rewiew erwin... aunque lo mas tedioso debe haber sido buscar los tabuladores exactos para cada cosa ajajajaja, excelemte tutorial, sobre todo pa los que estamos empezando con hexworkshop saludos erwin!
Escrito por zerosilent (23/10/2006 07:23 PM)
Excelente artículo.
Escrito por neo_ric (17/10/2006 01:00 PM)
excelente! jejejeje hace tiempo que no me metia aca, asique tengo harto material de lectura xD!
Escrito por Sprito (17/10/2006 02:35 AM)
buena guia erwin, se nota que le pegas harto a la ingenieria inversa, o por lo menos eso es lo que veo. que bueno que hagas este tipo de manuales, muy interesante tu blog, buenos articulos, sigue en esa linea. saludos cibernetiko
Escrito por cibernetiko (11/10/2006 11:17 AM)

Copyright © 2013 por Erwin Ried.