Está en la página 1de 21

Resource Tuner

● Escrito por: Apuromafo

● Fecha de Creación: 28-04-2020

● Creado con Fines Educativos


2

Herramientas

Herramienta Enlace Uso

Editor de texto http://docs.google.com Si cuentas con una cuenta en


google drive puedes almacenar
algunos documentos y
compartirlos con los demás en
un enlace, además de usar
google docs.

sharex http://www.getsharex.com Capturador de pantalla,


herramientas.

ExeinfoPE http://www.exeinfo.xn.pl/ Analizador de código PE

x32dbg http://www.x64dbg.com depurador

Everything https://voidtools.com/ *opcional


ayuda a buscar en el equipo

Cff explorer https://ntcore.com/?page_id=38 *opcional


8 para manipular pe header

IDR https://github.com/crypto2011/I Explorar delphi apps


DR

Multimate Assembler https://rammichael.com/multima plugin para ensamblar varias


te-assembler líneas, crea label, comentarios.

Frase
Muchas cosas hay portentosas, pero ninguna como el hombre. Tiene recursos
para todo; sólo la muerte no ha conseguido evitar. Sófocles

2
3

Información

Programa: Resource tuner 2.20

Herramientas a usar depurador , decompiler

Dificultad dependerá de quien lo mire

Utilidad del programa editor de recursos, sirve en x86 y x64

Objetivo Dejarlo Funcional (limitación 30 días)

Fecha Abril 2019

Autor Apuromafo

Descarga http://www.heaventools.com/download/rtsetup.e
xe

Sha 1 (Setup) 2FD44E277377384FFF13AD6F4B9546576A8C


7B72

Sha 1 (programa) F9850E15DFD25ED286092F13C484BC36D87


B757E

3
4

Introducción
Hola,aprovecho de escribir algo más, veamos hasta donde llegamos.

Desarrollo
Para dar inicio completamos la tabla de sha1, con ayuda de sharex o bien cff explorer,

<img1: no tiene tantas apps y tiene un paquete de lenguaje en formato dat>


desde el script decompilado (inno decompiler, inno extract) se aprecia que habrá el
programa core.dll y plugins, este pack es mas resumido y también trabaja en rama de

4
5

HKCR, con el recuerdo de pexplorer que sus licencias servían poco o nada, esta vez me
centraré en revisarlo bien y ver si necesita algun parche adicional luego.
Comenzamos con ExeinfoPE:

<img2: exeinfope,es un delphi>

refiere un delphi, abro idr y comienza a analizarlo


desde el manual indica que para registrarlo debemos ingresar un valor mas menos así

<img3: formato de licencia según el informativo>


si se entra una licencia cualquiera refiere “gracias por registrar y reinicie el programa”

5
6

A modo general las licencias existen personal, business, y otras para consola…las licencias
son válidas durante un solo año y una vez terminado seguirá siendo funcional, pero no
tendrán acceso a nuevas versiones, pero si liberan una app cada 2 o 3 años, es claro que
siempre obligan al usuario a comprar la nueva versión.

<img4: help modo trial>


Al pulsar about tenemos de color rojo llamativo los días que nos quedan y no se ve nada
adicional

<img5: about>

6
7

Veamos comenzamos en IDR haber que encontramos:

<img6 : IDR, mirando el formCreate de la imagen que tenemos de mensaje de about>


el evento que crea el dialogo es el spFOrm, así que vamos a x32dbg y veamos que pasa si
anulo en 6E1768 con un mov eax,2 y luego + ret

<img7:el about sin captions>


me muestra el formato actual de este programa, son labels lo que tenemos a nuestra vista,
y estos son los nombres técnicos.
así que alguien condiciona, así que vamos a explorar por encima

<img8: x32dbg,vista del createform anulado con eax=2>

7
8

arriba del about hay un evento, de seguro está del FormActivate , al ver quien lo llama, veo
que es condicionado

<img9:idr refiere que activa o no un timer desde main, puede que se relacione con el
registrado o no registrado>

<img10:veo cómo se ve en x32dbg este bloque>


y lo maneja con mueve a eax, dword constante, y compara byte, por lo tanto, cuando se
trate de buscar algo para registrarlo, en este caso puede que se asocie a algo similar

8
9

<img11: idr ,creación de elementos del caption about>

a primera vista todos son set text..pero no veo ninguna comparación aún, luego se ven
estilos y colores.

<img12: idr,siguen la creación de elementos de about>

9
10

luego antes que termine el dialogo encuentro algo llamativo:

<img13:IDR, luego de los labels un call>


hay un call, entremos, ya si en todo eso no hizo comparación puede que lo haga después
de construirlo y aquí tenemos una comparación

<img14: IDR,comparación similar a la que vimos antes>

10
11

así que claramente veamos que pasa…voy al depurador, establecer la variable en 1 y ver
cómo funciona:

<img15: zona del call sospechoso>


vemos cómo se ha transformado en esta copia está licenciada.

<img16: programa,resultado a la vista, transforma en registrado>

11
12

eso fue rápido, veamos el menú de help: también cambió, así que estamos registrados

<img17: Help también ha cambiado>

reinicio con los cambios y no ha vuelto a pasar nada,​ así que los parches se quedan​, sea
que tenga relocations no le afectan al menos en estas pruebas con app pequeñas o
grandes.

Vamos por la parte estética.


nótese que he destacado con amarillo las strings que intentaremos , pero deben ser en
orden intercaladas, no es cualquier orden

Idea Resultado

This copy is licensed to:


Registrado:apuromafo
LicenseType
Tipo:Business
N° de licencias
Cantidad:1
Tiempo Mantención
Tiempo Expiración:Never
<img18: idea>

12
13

Así que manos a la obra.


Busco en IDR que string son las que no se mostrarán,

<img19: idr,nótese las string “.pas” que hay en el programa>

y tenemos ahi un postulante, haré uso de un plugin llamado Multiline Ultimate Assembler
el cual está disponible en ​https://rammichael.com/multimate-assembler
en mi caso yo lo he configurado hace mucho:

<img20: plugin MultiLine Ultimate Assembler en x32dbg>

13
14

fijo una dirección con string le puedo colocar vista en ascii o unicode y con esto iremos
viendo las string

<img 21: x32dbg,cómo tratar con strings creadas por uno>

desde Multiline verán que es muy rápido <dirección>, @label, “string” y separador\0
ese es la idea básica, luego es es ir armando direcciones con un string largo y convertirlo
en el string deseado,
el tema es elegir bien las direcciones y que no sean usadas hago una prueba sencilla:

El plugin en acción sencilla , colocar los códigos y luego pulsar ensamblar :

<img22: vista del código ensamblado en asm, por el plugin>

14
15

<img23: vista del código al pulsar assemble en el depurador>

15
16

nótese cómo ha parchado sin problemas, ahora bien cómo digo las direcciones de string es
un tema estas son unicode para evitar tanta captura, dejo el código final “restuner.asm”
;strings sin uso de un .pas
<5A5E48>​ ;antes es un string de una ruta de treeview
@1:L"Apuromafo\0"
L":)\0" ;relleno
<5A5F90>​;antes es un string de una ruta de treeview
@2:L"Business\0"
L":)\0";relleno
<5A4F50>​;antes es un string de una ruta de treeview
@3:L"1000\0"
L":)\0";relleno
<5A3BEC>​;antes es un string de una ruta de treeview
@4:L"Never\0"
L":)\0";relleno
;parche trial a registrado
<6E11B8>
or byte ptr ds:[eax], 0x1
;parches en la descripción
<6E1210>
mov edx, @1 ;establece apuromafo
add edx,0 ;también se podrian 3 nop
<6E1236>
mov edx, @2 ;establece business
add edx,0;también se podrian 3 nop
<6E125C>
mov edx, @3 ;establece 1000
add edx,0;también se podrian 3 nop
<6E1282>
mov edx, @4 ; establece Never
add edx,0;también se podrian 3 nop
;algo adicional colores Azul o similar
<006E1A35>​;color expires (never)
mov edx,0xC01F1C
<006E13DA>​;color web (la web)
mov edx,0xC01F1C

El resultado final

<img24: Resultado final>

16
17

A diferencia de la otra aplicación que exploramos antes


Nótese cómo el menú de agregar opciones es más variado

<img25: agregar recursos, un bitmap>


creo que este es menos automatizado que pexplorer, no tiene la opción de agregar el
manifiest, pero es lo de menos , permite editar en default view y la vista hex con edición de
cambiar la vista en f8 (oem y asci)

​<img26:vista hexadecimal desde default view>

17
18

Hidden Check
Para encontrar esta limitación había que usar el programa, lo primero que observo es que
escribe demo version el about, lo sabemos (no es cómo para morirse, lo ignoro por el
minuto, luego veo que al guardar el programa agrega una cadena Unpaid evaluation, esto si
es de importar, porque en cuanto carguemos un programa agregará ese comentario al
programa para encontrarlo primero buscamos las referencias, luego %s que hace alusión a
la concatenación de string, de seguro a nadie le importa una string concatenada o normal,
así que sigamos este determinará el cambio de una variable mas adelante, para verificar la
versión (dirá en el log que es de evaluación), entonces luego cuando carguemos la
aplicación hará la confirmación y dirá editado por la version no pagada de resource turner

<img27:Stub Unpaid>
para llegar a este lugar

<img28:procedencia de los saltos>


para por una serie de saltos, el penúltimo es el que hace el salto
por lo tanto se podría hacer que le de igual el valor de eax

<img29:salto responsable>

18
19

con tal de evitar el salto, pero por otro lado igual para asegurarme que no llegue aquí
este es el lugar que debemos evitar y agrego al listado de parches
<73C852>;Hidden check1
cmp eax,eax
nop
<73C994>;Hidden check1
jmp 0x0073D536

luego de alguna verificación, encuentro otra zona a parchar.

<img29:hiddencheck \t>
LUEGO de hacer las pruebas,
1) aplicación con comentario y información, guardo los cambios, se ven esos cambios
2) aplicación al reabrir no ha sido editado el comentario y funciona en orden

<5364FA>;HIDDENCHECK2
DB 00
<536503>;HIDDENCHECK2
db eb
<536504>;HIDDENCHECK2
db 20

19
20

Respecto a la validación de licencia en este caso es una variable adicional , honestamente


no hace mayor diferencia si se parcha o no, pero para los que son perfeccionistas aqui le
dejo lo que decodifica (restuner2.lic) y luego evaluation demo version:

<img30:que valida la licencia>

<img31:Decodificación de una licencia en una porción de memoria externa al pe>


para esto entonces podemos incrementar el valor y para el string Evaluation podemos
reemplazarlo por el string 2, pero no será usado (recuerden que solo era usado para el
about...así que eso la inexistencia de la licencia correcta decodifica la string de comentarios
“evaluation demo version” eso es todo, espero les hubiera gustado

Resumen de la experiencia
Se logró el objetivo, y el que le sirva , pues a usarlo, el que no, pues puede guardarlo
en un baúl de recuerdos, se aprecian varias opciones, así que puede ser prometedor ,
hago las pruebas y todo funciona bien :) , antes de mandar el tutorial no había visto el
programa en acción, sabía que podía tener algo más.

20
21

Palabras finales
Pues la mejor experiencia de aprender es intencionado, no hacer por hacer, el éxito
irá de la mano del compromiso que te propongas.
Mis Agradecimientos para quienes han logrado leer hasta aquí,les dejo cordialmente
invitados a conocer el proceso de Ingeniería inversa a través de los manuales, maestros y
conocimiento que existe hoy en día.
saludos cordiales a la lista de PeruCrackers, Crackslatinos,

Grupos webs cómo TSRh, Apuromafo.net, Seek and Destroy y cómo no, a ti por leer.

Apuromafo CLS

21

También podría gustarte