Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - .:UND3R:.

#181
ASM / Duda con diagrama de flujo
1 Enero 2012, 00:49 AM
En cuanto a los diagramas de flujo tengo las siguientes dudas:

1- las call's se deben colocar
2- ¿deben estar todas las instrucciones del código de fuente?


Se que un diagrama de flujo se utiliza por lo general en programación (por lo general en lenguajes de alto nivel), no en ASM específicamente pero me gustaría saber como lo realizan aquellos que los diseñan bajo ASM

Saludos
#182
ASM / problema con call propio ej: call hola
3 Diciembre 2011, 19:25 PM
hola estoy haciendo un mini programa con dos procedimientos uno es el principal que llama a otro a través de call hola, pero cuando intento ensamblarlo me aparece lo siguiente:

SumaEnteros.asm(17) : error A2006: undefined symbol : hola

la estructura del código es más o menos así:
Código (asm) [Seleccionar]
main PROC
        .
        .
        call hola
        .
        .
        INVOKE ExitProcess,NULL
main ENDP
END main

hola PROC
       .
       .
       ret
hola ENDP


No sé si se entiende el problema, intenté declarar el prototipo del procedimiento con la siguiente instrucción:
Código (asm) [Seleccionar]
hola PROTO

Pero no me funcionó jeje
Espero su ayuda
#183
Hola a todos estoy teniendo el siguiente problema con MASM32, cuando coloco:

Project->console Build ALL

Me aparece el siguiente error en consola: LINK : fatal error LNK1181: cannot open input file MASM32

Extrañamente me había funcionado con anterioridad, pero ahora me surge tal error, a ver si me dan una mano, Saludos
#184
Crackeando Wondershare Time Freeze

Nombre:Wondershare Time Freeze
Página web:www.wondershare.com
Descarga:http://www.wondershare.com/pro/time-freeze.html
Versión:2.0.3
Autor del tutorial:UND3R

I-Inspeccionando el programa:
Una vez instalado el programa, iniciamos el programa y veremos lo siguiente:




Si introducimos un mail y una contraseña, nos aparecerá el siguiente mensaje:

*En mi caso e-mail: UND3R@CRACK.COM Registration code: TUTORIAL


II-Usando OllyDBG:
Cargamos el programa OllyDBG y veremos el siguiente Entry Point


Si buscamos referencias de textos y buscamos REGISTERED nos encontraremos con lo siguiente:



Hacemos doble clic al texto encontrado:


Si subimos un poco encontraremos una serie de JMP'S SHORT pero ninguno interesante, hasta que encontraremos el siguiente salto que podría ser la bifurcación entre un serial válido y uno No válido:



Intentemos llenar con NOP (Not Operand):


Lo más probable es que sea el punto de bifurcación correcto, pero intentemos ver que realiza el programa para registrarlo. Colocamos un BP a continuación:


Entremos a la call 00426C3A:



Veremos la siguiente API GetSystemDirectoryW, esta API se encarga de devolver en el búfer la ruta de SYSTEM32:


Lleguemos hasta ella:


Si vemos en el STACK, podremos dirigirnos al parámetro buffer (Follow in Dump):


Si pasamos la CALL con F8 veremos la ruta en el buffer:


Si seguimos traceando llegaremos hasta la siguiente string, lo más probable es que se concatenará con la ruta de SYSTEM32:


Llegamos hasta la siguiente instrucción:


Si miramos los registros de propósito general, veremos que [EAX] y [ECX] apuntan
a una archivo con extensión.acy:


Si seguimos traceando llegaremos hasta la API CreateFileW, encargada de crear o abrir un objeto:



Si vemos en el dump veremos que el parámetro FileName apunta a la concatenación anterior realizada por el programa:


Ahora si presionamos F9, nos aparecerá el siguiente mensaje:


Intentemos ver el contenido del archivo creado por el programa, nos vamos a la ruta:



Lo abrimos con NOTEPAD y veremos lo siguiente:


Si movemos la barra de desplazamiento de ventana hacia la izquierda notaremos los siguientes datos:


Si nos vamos a REGISTER veremos lo siguiente:


Si borramos el archivo mkdw48.acy y reiniciamos el programa veremos que volvemos a tener el programa como NO registrado:



UND3R
#185
Ingeniería Inversa / Ayuda con ImportRec (Dump)
30 Noviembre 2011, 18:33 PM
Hola a todos, estoy teniendo un problema al querer guardar la IAT reparada en el dumpeado (Fix dump), cuando selecciono fix dump y elijo a dumpeado.exe

me aparece el siguiente mensaje:

Invalid dump file! can't match RVA to Offset in the Dump file

Buscando información no he conseguido nada, si alguien pudiera ayudarme, se los agradecería, Saludos
#186
ASM / [Ayuda!]Problema con procedimientos Irvine
29 Noviembre 2011, 20:40 PM
Hola a todos tengo el siguiente código que quiero lograr hacerlo funcionar, pero no hay caso, lo único que quiero es que me muestre en consola el mensaje hola a todos utilizando el archivo de inclusión Irvine32.inc (Aun no prefiero utilizar las APIS de MS-Windows), al internarlo iniciar solo se cierra y no muestra nada.

Código (asm) [Seleccionar]
TITLE Pruebas
INCLUDE c:\masm32\include\Irvine32.inc
INCLUDELIB c:\masm32\lib\kernel32.lib
INCLUDELIB c:\masm32\lib\Irvine32.lib
INCLUDELIB c:\masm32\lib\User32.lib

.data
TEXT1  BYTE "Hola a todos",0
.code
main PROC
    mov edx,OFFSET TEXT1
    call WriteString
exit
main ENDP
END main


Aclaro que el procedimiento WriteString se encarga de escribir una cadena en consola, requiere un solo parámetro que es el OFFSET de la cadena a mostrar.

Debuggeando he notado que que el error aparece retornando de la call y en last error me muestra lo siguiente: ERROR_INVALID_HANDLE

Por lo que deduzco que el manejador de la consola (lugar en donde se mostrará la cadena) es invalido, creo que retorna 0, mi duda es como solucionar esto ya que el mismo error ocurre cuando llamo al procedimiento DumpRegs (también perteneciente a la biblioteca de enlace de Irvine32.lib

Como soluciono esto?


Saludos

PD: he intentado iniciarlo desde la consola y con doble clic pero ninguno me muestra el mensaje

EDIT: he notado que por lo general cuando depuro programas que utilizan la consola para mostrar información o pedirla (E/S) estos estando detenidos en el EP ya me muestra la consola pero sin ningún contenido en OllyDBG pero en este caso con el programa que he ensamblado y posteriormente enlazado no me carga estando detenido en el EP
#187
ASM / [Solucionado]Problemas al enlazar (Irvine)
29 Noviembre 2011, 18:15 PM
Hola a todos, bueno les cuento estoy con IDE RadASM, poseo el siguiente código:

Código (asm) [Seleccionar]
TITLE Pruebas
INCLUDE c:\masm32\include\Irvine32.inc

.data
origen byte 10h,20h,30h,40h
origen2 byte 12h,34h,56h,78h
.code
main PROC
    mov ax,word PTR [origen]
    mov ax,word PTR [origen2]
    call DumpRegs
    exit
main ENDP
END main


Cuando coloco TOOLS->MASM32->BUILD

el código de objeto se genera sin ningún problema, pero en cuanto se quiere enlazar las bibliotecas de enlace me marca el siguiente error:
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

prueba2.obj : error LNK2001: unresolved external symbol _ExitProcess@4
prueba2.obj : error LNK2001: unresolved external symbol _DumpRegs@0
prueba2.exe : fatal error LNK1120: 2 unresolved externals
_
Link error
Presione una tecla para continuar . . .


En cuanto uso la bibliotecas de enlace de MS-Windows (kernel32.lib) y el INCLUDE kernel32.inc no tengo problema alguno.

Lo que poseo dentro de c:\masm32\include\ y \lib\ es lo siguiente:
SmallWin.inc
Irvine32.inc
Irvine16.inc
Irvine36.lib
Irvine16.lib
kernel32.lib


He intentado colocar las correspondientes lib en el path include (junto con las .inc) y en lib las include (junto con las .lib correspondientes)

y de ninguna forma consigo poder generar el ejectuable, si alguien me pudiera decir como se puede ensamblar y enlazar el codigo que adjunté se lo agradecería
entiendo que la librebría Irvine son parte de un libro pero las utilizo por que me estoy iniciando en la programación ASM

Muchas gracias

Solución se deben incluir las siguientes librerías:
Código (asm) [Seleccionar]
INCLUDELIB c:\masm32\include\Irvine32.lib
INCLUDELIB c:\masm32\include\Kernel32.lib
INCLUDELIB c:\masm32\include\User32.lib


esta se colocan después de INCLUDE c:\masm32\include\Irvine32.inc

¿El porqué?
El motivo se da que en el libro se utiliza Irvine32.inc este archivo contiene prototipos de procedimientos de la biblioteca Irvine32.lib y esta biblioteca se encarga de enlazarse con Kernel32.lib y User32.lib dependiendo del procedimiento.

El primer error ocurrió debido a que exit es equivalente a la API MS-Windows ExitProcess que corresponde a la biblioteca de vínculos dinámicos (Kernel32.lib)
como no estaba incluida ocasionaba el error. En cuanto a DumpRegs ocurrió debido a que no estaba incluida la librería Irvine32.lib

El segundo error ocurrió luego de agregar ambas librerías MessageBox que está dentro de la librería de enlace irvine32.lib esta se enlaza con user32.lib para mostrar mensajes y como no estaba incluida ocasionó el segundo error.




#188
Hola a todos, bueno estoy intentando sugerir que se coloque una descripción debajo del nombre del subforo, un pequeño mensaje adicional puesto debajo de Ingeniería inversa, esto con la finalidad de generar un mayor flujo, lamentablemente hay gente que está opinando y ni siquiera han entrado a este subforo y ni mucho menos conocen sobre ingeniería inversa o lo intentan. La idea es ver si me quieren apoyar, claro está si ustedes están de acuerdo con la sugerencia que estoy realizando.

Adjunto el link de la sugerencia:
http://foro.elhacker.net/sugerencias_y_dudas_sobre_el_foro/sugerencia_con_el_foro_de_ingenieria_inversa-t345926.0.html;msg1689590#new

La idea sería que comentaran que son usuarios de este subforo y si les parece la idea. en cuanto a cual sería la descripción eso lo verían los moderadores o el administrador del foro o quizás los mismos usuarios del subforo (en realidad desconozco quien está a cargo de elegir la descripción)

Basta que entren en el post y coloquen si están de acuerdo con esto obviamente diciendo que son parte del foro.

Para los que no saben cual es la idea. es colocar una pequeña reseña debajo del nombre del subforo (La idea no es cambiar el nombre sino agregar una descripción). como lo es en el caso de algunos subforos como:

Sugerencias y dudas sobre el Foro        (Nombre del subforo)
Nuevas ideas para el foro, quejas, comentarios, etc. (descripción)
Moderador: el-brujo (Moderadores del foro)

o

Bugs y Exploits
Heurística y Explotación de Vulnerabilidades
Moderador: berz3k
Subforos: Nivel Web

Estos cuentan con una pequeña reseña o descripción, el beneficio no es para mi si no para todos los que disfrutamos de aprender y enseñar en este subforo. Compartir ideas, proyectos, resolver keygens,crackmes,unpackmes, el beneficio sería para todos nosotros.....

Saludos  ;-)
#189
Cual es el opuesto de OR? es AND? o es el mismo OR?

Muchas gracias, Saludos
#190
Sinceramente este subforo, pasa muy desapercibido los los ojos de los usuarios y creo que es por que desconocen el nombre del subforo. para ello sería muy útil colocar como descripción (no cambiar el nombre si no agregar una descripción al inferior al nombre del foro)algo referente a crack ya que esa palabra es más conocida que ingeniería inversa

Bugs y Exploits
Heurística y Explotación de Vulnerabilidades
* como este tipo de descripción o esta:

Análisis y Diseño de Malware
Antes llamado Troyanos y Virus

¿Para que ello?
Para tener más flujo en el subforo, ya que no posee tanto en comparación a otros subforo y estoy completamente seguro que es por que la gente desconoce el nombre real de esta arte.

la descripción podría ser conversada con Karmanny y Shaddy que son los moderadores de este subforo.

una sugerencia podría ser:

Crack, unpacks, modding de software

Adjunto el link del subforo:
http://foro.elhacker.net/ingenieria_inversa-b26.0/

Saludo el-brujo

EDIT: adjunto el post dentro del subforo de ingeniería inversa en donde se comenta esto mismo:
http://foro.elhacker.net/ingenieria_inversa/a_todos_los_usuarios_de_este_subforo_entren_por_favor-t346018.0.html

EDIT2:
Gracias a la comprobación de drvy | BSM
podemos decir que puede ser discutible que una descripción podría influir en el flujo de visitantes y usuarios dentro de un subforo, la prueba fue reliazada por él mismo,buscando por la siguiente descripción Explotacion de Vulnerabilidades  hacker (Descripción del subforo Bugs y Exploits
obteniendo como primer  resultado el foro elhacker.net esto debido a que lo más probable es que google indexe las descripciones del subforo muchas gracias  drvy | BSM por tal información.
#191
F.A.Q Ingeniería inversa

última modificación: 13/06/2018

Introducción
El siguiente hilo contiene una recopilación de toda la información necesaria para poder indagar en el mundo de la Ingeniería Inversa sin poseer algún tipo de conocimientos previos, se sugiere considerablemente la lectura de este hilo antes de postear dudas en el sub-foro. El autor de esta recopilación de información no se responsabiliza por el mal uso que se brinde de este.

Reglas
Reglas generales del foro elhacker.net:
Clic aquí para ver las reglas

Las reglas del subforo Ingeniería Inversa:
-Los mensajes con pedidos de serial, crack, warez, etc. serán eliminados sin previo aviso.
-Los mensajes alusivos a programas comerciales serán eliminados sin previo aviso.



Preguntas frecuentes (F.A.Q)

-¿Qué es ingeniería inversa?

CitarEl objetivo de la ingeniería inversa es obtener información o un diseño a partir de un producto accesible al público, con el fin de determinar de qué está hecho, qué lo hace funcionar y cómo fue fabricado. Hoy en día los productos más comúnmente sometidos a ingeniería inversa son los programas.
para más información clic Clic aquí

-¿Qué es un cracker?
Se suele referir a una persona como cracker cuando:
Citar
Mediante ingeniería inversa realiza: seriales, keygens y cracks, los cuales sirven para modificar el comportamiento o ampliar la funcionalidad del software o hardware original al que se aplican, y se los suele utilizar para saltearse restricciones como por ejemplo que un programa deje de funcionar a un determinado tiempo, o que sólo funcione si es instalado desde un CD original, etc.
para más información clic Clic aquí

-¿Como empezar desde cero?
Para empezar desde cero con el arte de la Ingeniería inversa podemos estudiar los siguientes tutoriales:
-Tutorial:Introducción al cracking con OllyDBG desde cero
Autor: Ricardo narvaja
Link del tutorial:Clic aquí

-Tutorial:Introducción al reversing con IDA desde cero
Autor: Ricardo narvaja
Link del tutorial:Clic aquí

-Tutorial:Taller de cracking desde cero
Autores:Shaddy-karmany
Link del tutorial:Clic aquí

-Informativo:Guía para los que comienzan
Autor:Apuromafo
Link del tutorial:Clic aquí

-¿Donde encuentro herramientas?
Opción 1 foro:Clic aquí
Opción 2 web:Clic aquí

-¿De qué manera puedo estar al día con la ingeniería inversa?
Noticias:Clic aquí

-¿Donde encuentro información sobre temas interesantes que se hayan tratado en el foro?
Temas destacados:Clic aquí

-¿Donde encuentro crackme's, keygenme, unpackmes, etc.?
Contamos con un post con una gran diversidad de crackmes y keygens.
Clic aquí

-¿Retos de script's?
Los retos de script pueden ser de gran ayuda, ya que nos permiten practicar la creación y optimización de esta potente herramienta.
Clic aquí

-¿Donde buscar tutoriales?
Pare encontrar tutoriales, contamos como primera opción la página de Ricardo narvaja, en ella se encuentra una gran cantidad de contenido que pueden facilitarnos para lograr un objetivo.
opción 1:Clic aquí
opción 2:Clic aquí

-¿Como pedir un crack?
En primera instancia está absolutamente prohibido pedir un crack, si deseas conseguir uno hay un post especialmente dedicado a ello:Clic aquí
El subforo de ingeniería inversa, brinda ayuda a aquellos que se han quedado atascado en la obtención de un serial o crack,etc. Es decir aquellos usuarios que tienen un interés por aprender y entender el porqué de las cosas.

-¿Es necesario manejar algún lenguaje de programación sobre todo ASM para comenzar a crackear?
Esta es una de las preguntas más comunes planteadas por los usuarios o visitantes, La respuesta es NO ES NECESARIO aun que si es un complemento fundamental para un mejor entendimiento del código a reversear, es decir no se necesita manejar el lenguaje de manera directa ni mucho menos saber programar en ASM, tan solo se necesita conocer APIS o nemónicos de instrucciones importantes como operaciones booleanas o instrucciones de saltos condicionales, estas son claramente explicadas en el documento: "Introducción al cracking desde cero" por lo que para poder comenzar a crackear no se requiere conocimientos previos.
(*La adición de conocimiento y experiencia facilita el estudio y el entendimiento del porqué de las cosas pero aun así no es un requerimiento, de todas maneras puedes aprender haciendo clic aquí).

-¿Cual es el Sistema operativo(SO) más óptimo para reversear(crackear) programas?
En cuanto al depurador OllyDbg fue diseñado primerizamente bajo la plataforma de Windows XP de 32 bits, aun así es compatible para el SO Windows 7, de todas formas es recomendable utilizar XP, en caso de no disponer de tal SO se puede montar una máquina virtual:
Vmware player:Clic aquí
Virtualbox:Clic aquí

CitarSi van a usar vm de virtualbox tengan tildado en "aceleración" VT-x and AMD-V
esto permitirá usar hw bp, yo hoy bajé un sp3 y tildé aquella opción y ando testeando mis scripts funcionando sin problema (no como antes)

de lo contrario no podrán usarlo, esto es debido al registro dr5 y 6 que por defecto guarda cierto valor fijo, al tildar aquella opción usa otro módulo para guardar algun valor relacionado
puede confirmarse en tickets como
https://www.virtualbox.org/ticket/477
https://www.virtualbox.org/ticket/11302).

Apuromafo

-¿El estudio y conocimientos de protecciones de crackme's se podrían llevar a un programa comercial?
Claramente es posible aplicar los estudios y conocimientos pero generalmente nunca de manera directa, esto debido a que cada programa es diseñado por un programador distinto, por ende cada software posee un sistema de seguridad diferente, aunque si se pueden tomar ideas generalizadas que pueden ser muy útil en el logro de un objetivo.

-¿Cómo plantear una pregunta de manera correcta sin incumplir las normas del foro?
Las preguntas planteadas en este subforo generalmente carecen de información, esto por causa de querer evitar incumplir las normas. Se es muy difícil poder analizar un ejecutable al cual no poseamos o desconozcamos su nombre, por lo que subir el instalador nos sería de gran ayuda. Al igual que las preguntas mal redactadas, sin avances o sin intentos, debemos saber que redactar las opciones fallidas pueden ser muy útiles para aquellos usuarios que intentan solventar las preguntas, ya que se optimiza el tiempo en cuanto al análisis del ejecutable y descarte de posibilidades.
(*Se pide no aludir al nombre o empresa del programa dentro del post)

-He adquirido un programa comercial, el cual me exige la utilización de un pendrive (dongle) para que este se pueda ejecutar ¿Cómo podría ejecutar el programa sin utilizar dongles?
En el siguiente hilo, Karmany nos explica con lujo y detalle las diferentes formas de emular dongles (según el modelo de este):
Clic aquí
#192
Ingeniería Inversa / Protección de copiado de CD
24 Noviembre 2011, 07:27 AM
Protecciones de copiado de CD:

Estaba googleando y me he topado con algo que desconocía y es los tipos de protecciones que tiene un CD para evitar ser copiados, yo conocía por lógica el de agregar una sección dañada y que esta deba estar para que pueda funcionar el CD
Desconozco completamente del tema, pero me pareció interesante compartir algo nuevo...

Los sistemas de protección anti-copia para CD, son relativamente nuevos. Son posteriores a la puesta en el mercado de las unidades de CD, ya que un un principio estas no provocaron un boom debido a su escasa velocidad de lectura, con la aparición de las unidades de 4x, los freakers (piratas) comenzaron a copiar masivamente el software a este tipo de soporte, sabiendo donde buscar, una persona podía adquirir uno de estos CDs con más de 100 programas por un precio infinitamente inferior al precio de todo el software que contenia. Posteriormente con la aparición de las consolas; PSX y Saturn basicamente, la pirateria se multiplicó. Las grandes casas de software decidieron entrar en combate y como no, una vez más idearon diversos sistemas de protección para su preciado software. Existen varios tipos de protección de CDs:

Protecciones usando huellas digitales o marcas láser:

SecuROM: SecuROM es un sistema patentado por Sony que identifica al verdadero CD-ROM con un sistema de autentificación especial. Durante el proceso de masterización del DADC una huella digital electrónica es aplicada en la capa de plástico que asigna un numero a cada CD-ROM.

Identificación: Uno de estos ficheros debe estar en el directorio de instalación o en el directorio raíz del original.

CMS16.DLL
CMS_95.DLL
CMS_NT.DLL


Nota: En las últimas versiones de esta protección, estos ficheros no estan en ningún directorio, sino que se encuentran almacenados en una de las secciones del ejecutable.

El CD deberá contener este logotipo en el aro interior .

Eliminación: Existen varios parches genéricos creados por Pedro del grupo Laxity, que funcionan con algunas versiones de esta protección. Para la eliminación manual consulta el tutorial sobre la protección SecuROM.

http://club.myce.com/f81/illustrated-guide-copying-securom-7-rmps-emulation-144003/

SafeDisc C-Dilla: Es un sistema de protección basado en software que no requiere cambios en los sistemas hardware. Consiste en la combinación de una firma digital incrustada en el disco y una cifrado multicapa del ejecutable que asegura el contenido del CD. La firma digital que no es posible copiar con una CD-R es introducida mediante el láser durante la masterización del CD. Esta protección a sido creada por la compañia C-dilla, propiedad de Macrovision Corporation.

Identificación: Los siguientes ficheros existen el el CD original:

00000001.TMP
CLCD16.DLL
CLCD32.DLL
CLOKSPL.EXE


El icono del archivo clockspl.exe es un CD tachado con dos barras. Actualmente se conocen varias versiones de esta protección y en las últimas los ficheros mencionados anteriormente ya no existen.

Eliminación: Existe tambíen un programa creado por BlackChecks y otro creado por R!sc que usando fuerza bruta, consiguen obtener una copia funcional del ejecutable original, partiendo incluso de la copia. Para la eliminación manual de este protección, consulta los tutoriales sobre la protección C-Dilla.

LaserLock: Protección que usa una combinación de cifrado de software y marca láser en la superficie del CD creada durante un proceso de masterización especial. Cada aplicación tienen un parámetro de cifrado diferente.

Identificación: El CD original contiene un directorio oculto llamado LASERLOCK. En este directorio hay archivos con errores de lecturas. En las últimas versiones este directorio ya no existe.

Eliminación: Para la eliminación manual de este prot ección, consulta el tutorial sobre la protección LaserLock.

Protect-CD: Protección creada por VOB, para más info consulta el tutorial sobre la protección Protect-CD.

CD-Cops: Protección creada por Link Data Security y Spinner Software, es una protección añadida al ejecutable principal del CD. Las diferencias de tiempo son medidas para establecer una huella digital y para asegurar que no se pueda copiar.La huella habitualmente es expresada como un código de 8 dígitos o como un número clave.

Eliminación: Para la eliminación manual de este protección, consulta el tutorial sobre la protección CD-Cops.

DiscGuard: Protección creada por TTR Technologies Inc. Este sistema realiza dos cambios básicos en el software:

Los ejecutables principales están cifrados.
Una marca digital especial está inscrita en el disco esta marca contiene una llave de desencriptación de software. La marca digital no es reproducible mediante copia.

Cuando un disco original es utilizado, la firma está presente, la desencriptacion se produce y la aplicacion funciona. Cuando es una copia, la firma no está presente, no existe desencriptación y la aplicación no funciona, en su lugar un mensaje, una pequeña demo, un link a una web comercial o una presentación aparecen, transformando cada copia ilegal en una herramienta de marketing.

Protecciones mediante la alteración de la estructura del CD o de los datos de este:

Oversize: Algunos programas ocupan mas de 660 Mb y estos no pueden ser copiados por la mayoría de CDR's que no están preparadas para copiar mas de 659 Mb en un CD de 74 minutos. Con la aparición de los CD's de 80 minutos esta protección ya no es efectiva.

Illegal TOC: Esta protección se reconoce mirando las pistas del CD. Normalmente aparece una segunda pista de datos (después de algunas de audio). Las normas estándar CD ISO no permiten eso, de ahí el nombre Tabla de contenidos ilegal. Actualmente, todos los programas de duplicación de CD incluyen una opción para ignorar esta alteración, por lo que ya no es efectiva.

Dummy Files: Esta protección crea archivos falsos que señalan aleatoriamente a una parte del CD usada por otros archivos. Cuando se copia el contenido del CD al disco duro la imagen es mucho mas grande que el tamaño de las pistas originales (normalmente las pistas parecen tener 2 Gb). Esta protección suele aparecer en combinación con la de Oversize. Para saltarse esta protección, si el original tiene menos de 659 Mb, hacer una copia directa (DAO/TAO) y recreara los archivos en el CD copiado.Cuando el CD tenga mas de 659 Mb hacer lo mismo mediante overburning o usar un CD de 80 minutos.

Sectores Ilegibles: Este sistema es facilmente reconocible por aparecer un aro en el CD. Este aro es una sección del CD "estropeada" dentro hay unos ficheros que no se usan en el juego, pero que el programa testea que estén y que no son posibles copiar. Las posibles maneras de saltarse esta protección son dos, usar el LeeTodo/BlindRead o volcar el contenido del CD y crear los ficheros con cualquier editor de texto con la extension del fichero corrupto.

Link's:
bypass Star force:
http://club.myce.com/f80/starforce-bypass-method-without-unplugging-162993/

http://fileforums.com/showthread.php?t=74851

info: http://www.prysmax.com/forum/windows/1841-como-saltear-proteccion-securom-7-a.html

http://es.wikipedia.org/wiki/SecuROM

Saludos
#193
Hola tengo los siguientes datos:

Código (asm) [Seleccionar]
misBytes     BYTE   10h,20h,30h,40h
misPalabras WORD 8Ah,3Bh,72h,44h,66h


y la siguiente instrucción:
Código (asm) [Seleccionar]
mov esi, OFFSET misBytes
mov ax,WORD PTR [esi]                      ; a.AX =
mov eax,DWORD PTR misPalabras       ; b.EAX =


Cuales son los valores de AX y EAX en sus respectivas líneas?
en la pregunta a yo creo que AX = 4030h debido que el procesador trabaja en little endian, por eso los dos valores finales del arreglo misBytes
en la b creo que EAX = 6644723B8Ah

a ver si me pueden aclarar, que dudo de las respuesta de la tapa de mi libro

Saludos
#194
ASM / Duda con la bandera de desbordamiento
21 Noviembre 2011, 16:23 PM
Hola a todos, tengo la siguiente duda con la bandera de desbordamiento (OF)

tengo dos instrucciones:
mov ax,7FF0h
add al,10h     ; CF=1 SF=0 ZF=1 0F=0

11110000
00010000
100000000

mov al,80
add al,80       ; CF=1 SF=0 ZF=1 0F=1

10000000
10000000
100000000

Mi duda es por qué la diferencia, tengo entendido que es el resultado de un xor del bit que es acarreado a MSB con el que bit que se acarrea hacia a fuera de MSB

por lo que en ambos sería xor 1,0 (1=bit acarreado hacia afuera de MSB y 0=bit acarreado hacia MSB) por lo que en resumen en ambos casos se activaría la bandera OF

Saludos
#195
ASM / Por que esta instrucción no es válida?
18 Noviembre 2011, 17:46 PM
1)He aquí la instrucción:

Código (asm) [Seleccionar]
mov ds, 1000h


2)Otra cosa, un programa en modo protegido mov puede tener como destino registros de segmento exceptuando a CS?

Saludos

EDIT:

3) movzx var2,al    ; es válida??? var2 WORD 1000h (yo creo que sí)


#196
ASM / Posición de las constantes simbólicas
18 Noviembre 2011, 01:40 AM
Pues eso, donde van las constantes simbólicas? (=, EQU,TEXTEQU)
(Recién me inicio)

Ejemplo tomado de un libro:

Código (asm) [Seleccionar]
TITLE Resta  (Resta.asm)
; este programa resta enteros de 16 bits
; y almacena el resultado en una variable
; luego muestra los registros

INCLUDE Irvine32.inc

.data
var1       word 40000h
var2       word 20000h
var3       word 10000h
var4       word   500h
Resultado  word ?

.code

main PROC
    mov eax,var1      ; EAX valdrá 40000h
    sub eax,var2      ; sustrae a EAX 20000h
    sub eax,var3      ; sustrae a EAX 10000h
    sub eax,var4      ; sustrae a EAX 500h
    mov Resultado,eax ; mueve a Resultado el contenido de EAX
    call DumpRegs
    exit
main ENDP
END main


entre INCLUDE Irvine32.inc y .data?

EDIT: creo que en después de .code también pueden ir

Saludos
#197
Datos importantes:
El Usuario debe cumplir los siguientes requisitos:
-6 caracteres como mínimo
-letras solo en mayúsculas
-letras entre la "A" a la "K"

Si traceamos un poco notaremos funciones muy importantes dentro del crackme:
Citar004015A5  |.  E8 0AFDFFFF   |CALL CrackMe_.004012B4
004012BD  |.  83E8 30       SUB EAX,30                         ; resta a cada valor de ID 30
004015AA  |.  35 4D000000   |XOR EAX,4D                        ; realiza un XOR 4D con el resultado de la resta anterior
004015AF  |.  8981 C8404000 |MOV DWORD PTR DS:[ECX+4040C8],EAX ; mueve el resultado

Esto quiere decir que si introducimos como serial ABCDEF

Ocurrirá lo siguiente:
A    B   C    D    E    F   (Serial introducido)
41  42  43   44  45  46  (Serial en hexadecimal)

Resta a cada valor del ID 30

41-30 42-30 43-30 44-30 45-30 46-30  (Operación)
11      12     13      14      15      16       (Resultado)

Luego realiza un xor con cada valor modificado(- 30) de la ID con 4D
x XOR 4D

XOR 11,4D
XOR 12,4D
XOR 13,4D
XOR 14,4D
XOR 15,4D
XOR 16,4D

Nos dará como resultado lo siguiente:

A  B  C  D  E  F
5C 5F 5E 59 58 5B

Si seguimos traceando llegaremos a otra función muy interesante:
Citar004015CB  |.  E8 F8FCFFFF   |CALL CrackMe_.004012C8
004012D1  |.  83F0 4A       XOR EAX,4A                         ; realiza un XOR 4A con el contenido de [ECX+4040C8] (izquierda a derecha)
004015D1  |.  8882 48414000 |MOV BYTE PTR DS:[EDX+404148],AL   ; mueve el resultado
*En los comentarios podemos ver que realizará

XOR 5C,4A

XOR 5F,4A

XOR 5E,4A

XOR 59,4A

XOR 58,4A

XOR 5B,4A

obtendremos como resultado:
5C 5F 5E 59 58 5B
15 14 13 12 11 4A

Suma todos los caracteres=A9 (15 14 13 12 11 4A)

Suma todos los caracteres=195 (A B C D E F)
(41+42+43+44+45+46)

Fórmula del serial:

Usuario: ABCDEF
Clave: 6566676869706656667-87-1071

-Cada carácter es pasado de hexadecimal a decimal:
ABCDEF:
41=65
42=66
43=67
44=68
45=69
46=70

65 66 67 68 69 70

concatena (strcat) el número de caracteres del USUARIO

65 66 67 68 69 70 6

concatena las tres primeras letras del USUARIO

65 66 67 68 69 70 6 65 66 67

*NOTA: Copia hasta 70 (F) y lo concatena como 07
explicación:
si introducimos como serial DFGHJK el serial hasta lo explicado será de la siguiente manera:

68 70 71 72 74 75 6 68 7

verde=usuario convertido a decimal
naranja=nº de caracteres del usuario
rojo=concatena 68 7 lo lógico sería 68 70 71 pero concatena hasta 70 y no considera el 0 es decir 68 07.

Si el tercer carácter fuese una F quedaría de la siguiente forma:
ABFDEF 656670686970 6 65 66 7

luego concatena A9 en decimal (suma de todas los caracteres modificados, explicado anteriormente)

*Aclaramos que los números hexadecimales menores o iguales a 7 son positivos y mayor o igual a 8 son negativos por lo que A9 es un número negativo

FFFFFFA9 (DWORD)

por lo que quedará en negativo, nunca había visto un serial que utilizara el signo de un número como guiones intermedios.

quedando:
6566676869706656667-87

últimamente concatena FFFFF195 en decimal:
obteniendo:
6566676869706656667-87-1071

NOTA:Si el primer carácter es una F cambia queda de la siguiente manera la fórmula

ID usuario en decimal+último carácter de ID de usuario en decimal+suma de caracteres mod + suma de caracteres.

Gráfico de fórmula general:
00404010  41 42 43 44 45 46 06 41 42 43  A9 95 01 
ID......................................|
                                  LEN ID..|
                                  3 Dígitos ID........|
                                                  Suma MOD|suma ID|

KEYGEN:

El keygen está hecho en OllyScript tiene un solo error y es que cuando muestra el serial antepone un 0, solo permite 6 caracteres, ni más ni menos (el error y la restricción se debe a que OllyScript no es un lenguaje muy fuerte), una vez mostrado el ID y SERIAL, estos son guardados en un documento .txt (ubicado en el path del mismo crackme) para su fácil copia al crackme

Código (asm) [Seleccionar]
VAR VAR70
VAR VF
VAR VALLOC3
VAR LEN_AUX
VAR AUX_N
VAR AUX_W
VAR CONTADORU
VAR CONT_FIN
VAR AUX_Z
VAR VALLOC9_
VAR AUX__2
VAR VALLOC_TAM2
VAR VALLOC_TAM
VAR VALLOC___
VAR COMPS
VAR CONT4_
VAR AUX_3
VAR AUX_2
VAR CONTMOD
VAR VALLOC_
VAR AUX_
VAR AUX
VAR AUX2
VAR VALLOC
VAR VALLOC
VAR CARACTERES
VAR RESP
PREGUNTA:
ASK "Introduzca su ID (en mayúsculas, solo letras de la A a la K, seis caracteres)."
MOV RESP,$RESULT
CMP RESP,0
JE EXIT
EVAL "{RESP}"
LEN $RESULT
MOV CARACTERES,$RESULT
CMP CARACTERES,6
JNE ERROR1
ALLOC 50
MOV VALLOC,$RESULT
MOV VALLOC2,VALLOC
MOV VALLOC3,VALLOC
CMP 0,VALLOC
JE ERROR2
EVAL "{RESP}"
MOV [VALLOC],$RESULT,CARACTERES
BUCLE:
MOV AUX2,[VALLOC2],1
CMP AUX2,0
JE CONTINUAR
ADD AUX,AUX2
INC VALLOC2
JMP BUCLE
CONTINUAR:
CMP [VALLOC],46,1
JE CONTINUAR2
MOV [VALLOC2],CARACTERES,1
JMP CONTINUAR2_
CONTINUAR2:
ADD VALLOC3,CARACTERES
DEC VALLOC3
MOV VALLOC3,[VALLOC3],1
MOV [VALLOC2],VALLOC3,1
MOV VF,1
JMP CONTINUAR3
CONTINUAR2_:
INC VALLOC2
MOV [VALLOC2],[VALLOC],3
CONTINUAR3:
MOV VALLOC2,VALLOC
ALLOC 50
MOV VALLOC_,$RESULT
MOV VALLOC_2,VALLOC_
SUB CARACTERES,1
INC VALLOC2
CONTINUAR3_:
MOV AUX_,[VALLOC2],1
CMP CONTMOD,CARACTERES
JE CONTINUAR4
SUB AUX_,30
XOR AUX_,4D
XOR AUX_,4A
MOV [VALLOC_],AUX_
INC VALLOC2
INC VALLOC_
INC CONTMOD
JMP CONTINUAR3_
CONTINUAR4:
MOV [VALLOC_],4A
INC CARACTERES
CONTINUAR4_:
CMP CONT4_,CARACTERES
JE CONTINUAR5
MOV AUX_2,[VALLOC_2],1
ADD AUX_3,AUX_2
INC VALLOC_2
INC CONT4_
JMP CONTINUAR4_
CONTINUAR5:
ALLOC 50
MOV VALLOC_TAM,$RESULT
MOV VALLOC_TAM2,VALLOC_TAM
MOV [VALLOC_TAM2],AUX
MOV AUX,[VALLOC_TAM2],1
INC VALLOC_TAM2
MOV AUX__2,[VALLOC_TAM2],1
CONTINUAR5_:
ALLOC 50
MOV VALLOC___,$RESULT
MOV [VALLOC___],#FFFFFF#,6
ADD VALLOC___,3
MOV [VALLOC___],AUX
SUB VALLOC___,3
MOV AUX,[VALLOC___]
REV AUX
MOV AUX,$RESULT
ITOA AUX, 10.
MOV AUX,$RESULT
CONTINUAR6:
ALLOC 50
MOV VALLOC9_,$RESULT
MOV [VALLOC9_],#FFFFFF#,6
ADD VALLOC9_,3
MOV [VALLOC9_],AUX_3
SUB VALLOC9_,3
MOV AUX_3,[VALLOC9_]
REV AUX_3
MOV AUX_3,$RESULT
ITOA AUX_3, 10.
MOV AUX_3,$RESULT
MOV VALLOC2,VALLOC
MOV CARACTERES2,CARACTERES
CMP VF,1
JE CONTINUAR6_
ADD CARACTERES2,4
JMP CONTINUAR7
CONTINUAR6_:
INC CARACTERES2
CONTINUAR7:
CMP CONT_FIN,CARACTERES2
JE SALIR_
MOV AUX_Z,[VALLOC2],1
ITOA AUX_Z, 10.
MOV AUX_Z,$RESULT
EVAL "#{AUX_Z}#"
MOV [VALLOC2],$RESULT,1
INC VALLOC2
INC CONT_FIN
MOV AUX_Z,0
JMP CONTINUAR7
SALIR_:
SUB VALLOC2,2
MOV VAR70,[VALLOC2],1
CMP VAR70,70
JNE SALIR__
MOV [VALLOC2],#07#
DEC CARACTERES2
JMP SALIR
SALIR__:
INC VALLOC2
MOV VAR70,[VALLOC2],1
CMP VAR70,70
JNE SALIR
MOV [VALLOC2],#07#
SALIR:
CMP CARACTERES2,CONTADORU
JE SALIR2
MOV AUX_N,[VALLOC],1
ITOA AUX_N
MOV AUX_N,$RESULT
ADD AUX_W,AUX_N
INC CONTADORU
INC VALLOC
MOV AUX_N,0
JMP SALIR
SALIR2:
EVAL "Usuario:{RESP} Clave:{AUX_W}{AUX_3}{AUX}{AUX__2}"
MSG $RESULT
FREE VALLOC
FREE VALLOC_
FREE VALLOC_TAM
FREE VALLOC___
WRT "Serial.txt", $RESULT
MSG "Se ha creado un .txt con el ID y SERIAL en el path del crackme"
JMP EXIT
ERROR1:
MSG "Error:el ID debe ser de seis caracteres!!"
JMP PREGUNTA
ERROR2:
MSG "Error inesperado"
EXIT:
RET


Comentario:
Primero que todo darles las gracias a cibergolen por compartir tal crackme que debe haberle quitado su buena cantidad de tiempo, considerando que utilizó ASM, también decirle que es bienvenido por todos los usuarios de este subforo, será entretenido contar con su ayuda. También disculparme por la falta de tutorial pero codear el keygen en OllyScript me quitó demasiado tiempo ya que tuve que inventar muchas ideas para poder hacer que OllyScript hiciera lo que yo quisiera.
También decirle a MCKSys Argentina que es un desesperado, le dije que me esperara un poco que estaba haciendo el keygen pero no se aguantó  :xD aun espero su tutorial de como injertar una DLL en visualbasic en fin saludos para el y para todos los que se tomaron la molestia de leer este mini tutorial y un saludo para mi.
#198
Hola a todos tengo una sencilla duda como tomo los valores hexadecimales de un address ya que si los tomo y los paso a una variable me los toma como ascii

Saludos


[401000]
#199
Pues eso, por lo general los programas siempre muestran un MessageBox pero en varias circunstancias me he topado con mensajes que modifican el texto dentro de la misma ventana agregando un signo (imagen) de alerta o error, que api sería la encargada de alterar eso?.

Saludos
#200
ASM / que es MOD?
9 Noviembre 2011, 17:47 PM
Hola a todos, bueno estoy iniciándome en ASM y me topé con:

23 mod 5 es 1

que es mod?
alguien podría ponerme más ejemplos y aclarar como calculo aquello?

Saludos

EI: juntando mensajes.

creo que es el resto o residuo del resultado de una división

Saludos
#201
Hola a todos, estoy modificando cheat engine, por el momento funciona de maravilla pero tengo problemas al querer modificar el logo que aparece al costado a la derecha con exescope, reshack, xn resource editor no me muestran la imagen para editar, el programa no está empaquetado y se puede encontrar facilmente en la página oficial, si alguien puediera guiarme se lo agradecería

Saludos
#202
Ingeniería Inversa / Desempaquetar DLL?
5 Noviembre 2011, 01:30 AM
Hola a todos bueno esa es mi duda cuales son los procedimientos standar para desempaquetar una dll como llego al OEP cargo la dll directamente con Olly o con el programa que la utiliza? más que nada esa es mi duda

Saludos
#203
Hola a todos tengo la siguiente duda:

utilizo ALLOC y guardo el resultado en una variable var aux
luego de realizar unas ciertas operaciones la libero con FREE aux
luego el script se dirige nuevamente a ALLOC y esta vez el resultado es distinto, mi duda es si esto es normal siendo que cada vez lo libero la memoria virtual con FREE

Saludos
#204
Dudas Generales / duda con expresión booleana
3 Noviembre 2011, 16:05 PM
Hola a todos siguiendo un libro me topo con que tengo que resolver la expresión booleana pero en el último ejemplo quedo en desacuerdo con el libro:

¬F^¬V

el libro dice que es V pero yo creo que es F ya que ¬(NOT) tiene mayor procedencia por lo que invierto F Y V quedándo

V^F y esto es F, alguien que me pueda corregir?, Gracias
#205
Ingeniería Inversa / Problemas con aspack 2.12
27 Octubre 2011, 16:18 PM
Hola a todos, estoy teniendo un problema con intentar desempaquetar este packer

Los datos que he obtenido:
OEP:
00401524

FINAL:
00591018

INICIO:
00590164

LARGO:
EB4

La IAT está perfecta solo con código basura, por lo que no hay que reparar nada:


; Syntax for each function in a thunk (the separator is a TAB)
; ------------------------------------------------------------
; Flag   RVA   ModuleName   Ordinal   Name
;
; Details for <Valid> parameter:
; ------------------------------
; Flag:  0 = valid: no  -> - Name contains the address of the redirected API (you can set
;                            it to zero if you edit it).
;                          - Ordinal is not considered but you should let '0000' as value.
;                          - ModuleName is not considered but you should let '?' as value.
;
;        1 = valid: yes -> All next parameters on the line will be considered.
;                          Function imported by ordinal must have no name (the 4th TAB must
;                                                                          be there though).
;
;        2 = Equivalent to 0 but it is for the loader.
;
;        3 = Equivalent to 1 but it is for the loader.
;
;        4 = Equivalent to 0 with (R) tag.
;
;        5 = Equivalent to 1 with (R) tag.
;
; And finally, edit this file as your own risk! :-)

Target: C:\Documents and Settings\Administrador\Escritorio\DFStd.exe
OEP: 00001524 IATRVA: 00190164 IATSize: 00000EB4

FThunk: 00190164 NbFunc: 00000021
1 00190164 advapi32.dll 001E AdjustTokenPrivileges
1 00190168 advapi32.dll 0038 ChangeServiceConfigA
1 0019016C advapi32.dll 0040 CloseServiceHandle
1 00190170 advapi32.dll 0044 ControlService
1 00190174 advapi32.dll 0061 CreateProcessAsUserA
1 00190178 advapi32.dll 0066 CreateServiceA
1 0019017C advapi32.dll 00B1 DeleteService
1 00190180 advapi32.dll 0135 InitiateSystemShutdownA
1 00190184 advapi32.dll 0142 LogonUserA
1 00190188 advapi32.dll 0146 LookupAccountNameA
1 0019018C advapi32.dll 014E LookupPrivilegeValueA
1 00190190 advapi32.dll 01AB OpenProcessToken
1 00190194 advapi32.dll 01AC OpenSCManagerA
1 00190198 advapi32.dll 01AE OpenServiceA
1 0019019C advapi32.dll 01C2 QueryServiceStatus
1 001901A0 advapi32.dll 01CB RegCloseKey
1 001901A4 advapi32.dll 01CF RegCreateKeyExA
1 001901A8 advapi32.dll 01D0 RegCreateKeyExW
1 001901AC advapi32.dll 01D2 RegDeleteKeyA
1 001901B0 advapi32.dll 01D4 RegDeleteValueA
1 001901B4 advapi32.dll 01D9 RegEnumKeyExA
1 001901B8 advapi32.dll 01DC RegEnumValueA
1 001901BC advapi32.dll 01DE RegFlushKey
1 001901C0 advapi32.dll 01E3 RegOpenCurrentUser
1 001901C4 advapi32.dll 01E5 RegOpenKeyExA
1 001901C8 advapi32.dll 01E6 RegOpenKeyExW
1 001901CC advapi32.dll 01EA RegQueryInfoKeyA
1 001901D0 advapi32.dll 01EF RegQueryValueExA
1 001901D4 advapi32.dll 01F0 RegQueryValueExW
1 001901D8 advapi32.dll 01FB RegSetValueA
1 001901DC advapi32.dll 01FC RegSetValueExA
1 001901E0 advapi32.dll 01FD RegSetValueExW
1 001901E4 advapi32.dll 0241 StartServiceA

FThunk: 00190438 NbFunc: 00000092
1 00190438 kernel32.dll 0032 CloseHandle
1 0019043C kernel32.dll 0038 CompareStringA
1 00190440 kernel32.dll 0040 CopyFileA
1 00190444 kernel32.dll 0048 CreateDirectoryA
1 00190448 kernel32.dll 004C CreateEventA
1 0019044C kernel32.dll 0050 CreateFileA
1 00190450 kernel32.dll 005D CreateMutexA
1 00190454 kernel32.dll 0063 CreateProcessA
1 00190458 kernel32.dll 006D CreateThread
1 0019045C kernel32.dll 0070 CreateToolhelp32Snapshot
1 00190460 kernel32.dll 0080 DeleteCriticalSection
1 00190464 kernel32.dll 0082 DeleteFileA
1 00190468 kernel32.dll 0089 DeviceIoControl
1 0019046C kernel32.dll 008E DosDateTimeToFileTime
1 00190470 kernel32.dll 0097 EnterCriticalSection
1 00190474 kernel32.dll 0098 EnumCalendarInfoA
1 00190478 kernel32.dll 00B7 ExitProcess
1 0019047C kernel32.dll 00B8 ExitThread
1 00190480 kernel32.dll 00BA ExpandEnvironmentStringsA
1 00190484 kernel32.dll 00C2 FileTimeToDosDateTime
1 00190488 kernel32.dll 00C3 FileTimeToLocalFileTime
1 0019048C kernel32.dll 00CD FindClose
1 00190490 kernel32.dll 00D1 FindFirstFileA
1 00190494 kernel32.dll 00DA FindNextFileA
1 00190498 kernel32.dll 00E0 FindResourceA
1 0019049C kernel32.dll 00EC FormatMessageA
1 001904A0 kernel32.dll 00F1 FreeLibrary
1 001904A4 kernel32.dll 00F3 FreeResource
1 001904A8 kernel32.dll 00F7 GetACP
1 001904AC kernel32.dll 00FE GetCPInfo
1 001904B0 kernel32.dll 010A GetCommandLineA
1 001904B4 kernel32.dll 010E GetComputerNameA
1 001904B8 kernel32.dll 013A GetCurrentDirectoryA
1 001904BC kernel32.dll 013C GetCurrentProcess
1 001904C0 kernel32.dll 013D GetCurrentProcessId
1 001904C4 kernel32.dll 013F GetCurrentThreadId
1 001904C8 kernel32.dll 0140 GetDateFormatA
1 001904CC kernel32.dll 0146 GetDiskFreeSpaceA
1 001904D0 kernel32.dll 0147 GetDiskFreeSpaceExA
1 001904D4 kernel32.dll 014C GetDriveTypeA
1 001904D8 kernel32.dll 014E GetEnvironmentStrings
1 001904DC kernel32.dll 0153 GetExitCodeProcess
1 001904E0 kernel32.dll 0157 GetFileAttributesA
1 001904E4 kernel32.dll 015B GetFileInformationByHandle
1 001904E8 kernel32.dll 015C GetFileSize
1 001904EC kernel32.dll 015E GetFileTime
1 001904F0 kernel32.dll 015F GetFileType
1 001904F4 kernel32.dll 0162 GetFullPathNameA
1 001904F8 kernel32.dll 0169 GetLastError
1 001904FC kernel32.dll 016B GetLocalTime
1 00190500 kernel32.dll 016C GetLocaleInfoA
1 00190504 kernel32.dll 016E GetLogicalDriveStringsA
1 00190508 kernel32.dll 0170 GetLogicalDrives
1 0019050C kernel32.dll 0175 GetModuleFileNameA
1 00190510 kernel32.dll 0177 GetModuleHandleA
1 00190514 kernel32.dll 018C GetOEMCP
1 00190518 kernel32.dll 0199 GetProcAddress
1 0019051C kernel32.dll 019D GetProcessHeap
1 00190520 kernel32.dll 01AA GetProfileStringA
1 00190524 kernel32.dll 01AD GetShortPathNameA
1 00190528 kernel32.dll 01AF GetStartupInfoA
1 0019052C kernel32.dll 01B1 GetStdHandle
1 00190530 kernel32.dll 01B2 GetStringTypeA
1 00190534 kernel32.dll 01B5 GetStringTypeW
1 00190538 kernel32.dll 01B7 GetSystemDefaultLCID
1 0019053C kernel32.dll 01B8 GetSystemDefaultLangID
1 00190540 kernel32.dll 01BA GetSystemDirectoryA
1 00190544 kernel32.dll 01C1 GetSystemTimeAsFileTime
1 00190548 kernel32.dll 01CA GetTempFileNameA
1 0019054C kernel32.dll 01CC GetTempPathA
1 00190550 kernel32.dll 01D0 GetThreadLocale
1 00190554 kernel32.dll 01D5 GetTickCount
1 00190558 kernel32.dll 01D8 GetTimeZoneInformation
1 0019055C kernel32.dll 01D9 GetUserDefaultLCID
1 00190560 kernel32.dll 01DE GetVersion
1 00190564 kernel32.dll 01DF GetVersionExA
1 00190568 kernel32.dll 01E1 GetVolumeInformationA
1 0019056C kernel32.dll 01E9 GetWindowsDirectoryA
1 00190570 kernel32.dll 01EC GlobalAddAtomA
1 00190574 kernel32.dll 01EE GlobalAlloc
1 00190578 kernel32.dll 01F0 GlobalDeleteAtom
1 0019057C kernel32.dll 01F1 GlobalFindAtomA
1 00190580 kernel32.dll 01F5 GlobalFree
1 00190584 kernel32.dll 01F9 GlobalLock
1 00190588 kernel32.dll 0200 GlobalUnlock
1 0019058C kernel32.dll 0206 HeapAlloc
1 00190590 kernel32.dll 020C HeapFree
1 00190594 kernel32.dll 0219 InitializeCriticalSection
1 00190598 kernel32.dll 021D InterlockedDecrement
1 0019059C kernel32.dll 021E InterlockedExchange
1 001905A0 kernel32.dll 0221 InterlockedIncrement
1 001905A4 kernel32.dll 0234 IsValidLocale
1 001905A8 kernel32.dll 0237 LCMapStringA
1 001905AC kernel32.dll 0244 LeaveCriticalSection
1 001905B0 kernel32.dll 0245 LoadLibraryA
1 001905B4 kernel32.dll 0246 LoadLibraryExA
1 001905B8 kernel32.dll 024A LoadResource
1 001905BC kernel32.dll 024B LocalAlloc
1 001905C0 kernel32.dll 024F LocalFree
1 001905C4 kernel32.dll 0258 LockResource
1 001905C8 kernel32.dll 0262 MoveFileExA
1 001905CC kernel32.dll 0267 MulDiv
1 001905D0 kernel32.dll 0268 MultiByteToWideChar
1 001905D4 kernel32.dll 0278 OpenProcess
1 001905D8 kernel32.dll 027F OutputDebugStringA
1 001905DC kernel32.dll 0288 Process32First
1 001905E0 kernel32.dll 028A Process32Next
1 001905E4 kernel32.dll 029A RaiseException
1 001905E8 kernel32.dll 02A7 ReadFile
1 001905EC kernel32.dll 02B6 RemoveDirectoryA
1 001905F0 kernel32.dll 02C0 ResetEvent
1 001905F4 kernel32.dll 02C3 ResumeThread
1 001905F8 kernel32.dll 02C8 RtlUnwind
1 001905FC kernel32.dll 02DF SetConsoleCtrlHandler
1 00190600 kernel32.dll 0301 SetEndOfFile
1 00190604 kernel32.dll 0304 SetErrorMode
1 00190608 kernel32.dll 0305 SetEvent
1 0019060C kernel32.dll 0308 SetFileAttributesA
1 00190610 kernel32.dll 030A SetFilePointer
1 00190614 kernel32.dll 030E SetFileTime
1 00190618 kernel32.dll 0258 LockResource
1 0019061C kernel32.dll 02C2 SetLastError
1 00190620 kernel32.dll 0331 SetThreadLocale
1 00190624 kernel32.dll 0342 SizeofResource
1 00190628 kernel32.dll 0343 Sleep
1 0019062C kernel32.dll 0344 SleepEx
1 00190630 kernel32.dll 034B TerminateProcess
1 00190634 kernel32.dll 034C TerminateThread
1 00190638 kernel32.dll 0350 TlsAlloc
1 0019063C kernel32.dll 0351 TlsFree
1 00190640 kernel32.dll 0352 TlsGetValue
1 00190644 kernel32.dll 0353 TlsSetValue
1 00190648 kernel32.dll 035C UnhandledExceptionFilter
1 0019064C kernel32.dll 036F VirtualAlloc
1 00190650 kernel32.dll 0372 VirtualFree
1 00190654 kernel32.dll 0375 VirtualProtect
1 00190658 kernel32.dll 0377 VirtualQuery
1 0019065C kernel32.dll 037F WaitForSingleObject
1 00190660 kernel32.dll 0383 WideCharToMultiByte
1 00190664 kernel32.dll 0390 WriteFile
1 00190668 kernel32.dll 03A8 lstrcat
1 0019066C kernel32.dll 03AB lstrcmp
1 00190670 kernel32.dll 03AE lstrcmpi
1 00190674 kernel32.dll 03B1 lstrcpy
1 00190678 kernel32.dll 03B4 lstrcpyn
1 0019067C kernel32.dll 03B7 lstrlen

FThunk: 00190694 NbFunc: 00000003
1 00190694 netapi32.dll 00F2 NetUserAdd
1 00190698 netapi32.dll 00F4 NetUserDel
1 0019069C netapi32.dll 00A7 NetLocalGroupAddMembers

FThunk: 001906B4 NbFunc: 00000003
1 001906B4 version.dll 0001 GetFileVersionInfoA
1 001906B8 version.dll 0002 GetFileVersionInfoSizeA
1 001906BC version.dll 000B VerQueryValueA

FThunk: 001906D0 NbFunc: 00000002
1 001906D0 ws2_32.dll 0008 htonl
1 001906D4 ws2_32.dll 0008 htonl

FThunk: 001906F0 NbFunc: 00000004
1 001906F0 winspool.drv 0086 ClosePrinter
1 001906F4 winspool.drv 00B1 DocumentPropertiesA
1 001906F8 winspool.drv 00EA EnumPrintersA
1 001906FC winspool.drv 0105 OpenPrinterA

FThunk: 00190764 NbFunc: 00000017
1 00190764 comctl32.dll 0027 ImageList_Add
1 00190768 comctl32.dll 002A ImageList_BeginDrag
1 0019076C comctl32.dll 002D ImageList_Destroy
1 00190770 comctl32.dll 002E ImageList_DragEnter
1 00190774 comctl32.dll 002F ImageList_DragLeave
1 00190778 comctl32.dll 0030 ImageList_DragMove
1 0019077C comctl32.dll 0031 ImageList_DragShowNolock
1 00190780 comctl32.dll 0032 ImageList_Draw
1 00190784 comctl32.dll 0033 ImageList_DrawEx
1 00190788 comctl32.dll 0036 ImageList_EndDrag
1 0019078C comctl32.dll 0037 ImageList_GetBkColor
1 00190790 comctl32.dll 0038 ImageList_GetDragImage
1 00190794 comctl32.dll 003B ImageList_GetIconSize
1 00190798 comctl32.dll 003C ImageList_GetImageCount
1 0019079C comctl32.dll 0043 ImageList_Read
1 001907A0 comctl32.dll 0044 ImageList_Remove
1 001907A4 comctl32.dll 0045 ImageList_Replace
1 001907A8 comctl32.dll 004B ImageList_SetBkColor
1 001907AC comctl32.dll 004F ImageList_SetIconSize
1 001907B0 comctl32.dll 0052 ImageList_Write
1 001907B4 comctl32.dll 0011 InitCommonControls
1 001907B8 comctl32.dll 005A _TrackMouseEvent
1 001907BC comctl32.dll 002C ImageList_Create

FThunk: 00190904 NbFunc: 0000004F
1 00190904 gdi32.dll 0013 BitBlt
1 00190908 gdi32.dll 0024 CopyEnhMetaFileA
1 0019090C gdi32.dll 0028 CreateBitmap
1 00190910 gdi32.dll 002A CreateBrushIndirect
1 00190914 gdi32.dll 002D CreateCompatibleBitmap
1 00190918 gdi32.dll 002E CreateCompatibleDC
1 0019091C gdi32.dll 002F CreateDCA
1 00190920 gdi32.dll 0033 CreateDIBSection
1 00190924 gdi32.dll 0034 CreateDIBitmap
1 00190928 gdi32.dll 003B CreateFontIndirectA
1 0019092C gdi32.dll 0040 CreateHalftonePalette
1 00190930 gdi32.dll 0042 CreateICA
1 00190934 gdi32.dll 0046 CreatePalette
1 00190938 gdi32.dll 0049 CreatePenIndirect
1 0019093C gdi32.dll 0051 CreateSolidBrush
1 00190940 gdi32.dll 008D DeleteDC
1 00190944 gdi32.dll 008E DeleteEnhMetaFile
1 00190948 gdi32.dll 0090 DeleteObject
1 0019094C gdi32.dll 0097 EndDoc
1 00190950 gdi32.dll 0099 EndPage
1 00190954 gdi32.dll 00D8 ExcludeClipRect
1 00190958 gdi32.dll 00DE ExtTextOutA
1 0019095C gdi32.dll 011C GdiFlush
1 00190960 gdi32.dll 014C GetBitmapBits
1 00190964 gdi32.dll 0152 GetBrushOrgEx
1 00190968 gdi32.dll 0162 GetClipBox
1 0019096C gdi32.dll 0167 GetCurrentPositionEx
1 00190970 gdi32.dll 0169 GetDCOrgEx
1 00190974 gdi32.dll 016B GetDIBColorTable
1 00190978 gdi32.dll 016C GetDIBits
1 0019097C gdi32.dll 016D GetDeviceCaps
1 00190980 gdi32.dll 0173 GetEnhMetaFileBits
1 00190984 gdi32.dll 0176 GetEnhMetaFileHeader
1 00190988 gdi32.dll 0177 GetEnhMetaFilePaletteEntries
1 0019098C gdi32.dll 0197 GetObjectA
1 00190990 gdi32.dll 019C GetPaletteEntries
1 00190994 gdi32.dll 019E GetPixel
1 00190998 gdi32.dll 01A6 GetRgnBox
1 0019099C gdi32.dll 01A7 GetStockObject
1 001909A0 gdi32.dll 01AB GetSystemPaletteEntries
1 001909A4 gdi32.dll 01B6 GetTextExtentPoint32A
1 001909A8 gdi32.dll 01B8 GetTextExtentPointA
1 001909AC gdi32.dll 01BE GetTextMetricsA
1 001909B0 gdi32.dll 01C3 GetWinMetaFileBits
1 001909B4 gdi32.dll 01C5 GetWindowOrgEx
1 001909B8 gdi32.dll 01C9 IntersectClipRect
1 001909BC gdi32.dll 01CF LineTo
1 001909C0 gdi32.dll 01D0 MaskBlt
1 001909C4 gdi32.dll 01D3 MoveToEx
1 001909C8 gdi32.dll 01DF PatBlt
1 001909CC gdi32.dll 01E2 PlayEnhMetaFile
1 001909D0 gdi32.dll 01F0 Polyline
1 001909D4 gdi32.dll 01F5 RealizePalette
1 001909D8 gdi32.dll 01F7 RectVisible
1 001909DC gdi32.dll 01F8 Rectangle
1 001909E0 gdi32.dll 0202 RestoreDC
1 001909E4 gdi32.dll 0209 SaveDC
1 001909E8 gdi32.dll 020E SelectClipRgn
1 001909EC gdi32.dll 0210 SelectObject
1 001909F0 gdi32.dll 0211 SelectPalette
1 001909F4 gdi32.dll 0212 SetAbortProc
1 001909F8 gdi32.dll 0217 SetBkColor
1 001909FC gdi32.dll 0218 SetBkMode
1 00190A00 gdi32.dll 021B SetBrushOrgEx
1 00190A04 gdi32.dll 0220 SetDIBColorTable
1 00190A08 gdi32.dll 0224 SetEnhMetaFileBits
1 00190A0C gdi32.dll 022D SetMapMode
1 00190A10 gdi32.dll 0233 SetPixel
1 00190A14 gdi32.dll 0237 SetROP2
1 00190A18 gdi32.dll 023A SetStretchBltMode
1 00190A1C gdi32.dll 023E SetTextColor
1 00190A20 gdi32.dll 0241 SetViewportOrgEx
1 00190A24 gdi32.dll 0243 SetWinMetaFileBits
1 00190A28 gdi32.dll 0245 SetWindowOrgEx
1 00190A2C gdi32.dll 0247 StartDocA
1 00190A30 gdi32.dll 024A StartPage
1 00190A34 gdi32.dll 024B StretchBlt
1 00190A38 gdi32.dll 0252 TranslateCharsetInfo
1 00190A3C gdi32.dll 0254 UnrealizeObject

FThunk: 00190D18 NbFunc: 000000B4
1 00190D18 user32.dll 0001 ActivateKeyboardLayout
1 00190D1C user32.dll 0003 AdjustWindowRectEx
1 00190D20 user32.dll 000E BeginPaint
1 00190D24 user32.dll 001B CallNextHookEx
1 00190D28 user32.dll 001C CallWindowProcA
1 00190D2C user32.dll 0027 CharLowerA
1 00190D30 user32.dll 0028 CharLowerBuffA
1 00190D34 user32.dll 002B CharNextA
1 00190D38 user32.dll 0031 CharToOemA
1 00190D3C user32.dll 0036 CharUpperBuffA
1 00190D40 user32.dll 003A CheckMenuItem
1 00190D44 user32.dll 003D ChildWindowFromPoint
1 00190D48 user32.dll 0041 ClientToScreen
1 00190D4C user32.dll 0049 CopyIcon
1 00190D50 user32.dll 0058 CreateIcon
1 00190D54 user32.dll 005E CreateMenu
1 00190D58 user32.dll 005F CreatePopupMenu
1 00190D5C user32.dll 0061 CreateWindowExA
1 00190D60 user32.dll 008A DefFrameProcA
1 00190D64 user32.dll 008C DefMDIChildProcA
1 00190D68 user32.dll 008F DefWindowProcA
1 00190D6C user32.dll 0092 DeleteMenu
1 00190D70 user32.dll 0096 DestroyCursor
1 00190D74 user32.dll 0096 DestroyCursor
1 00190D78 user32.dll 0098 DestroyMenu
1 00190D7C user32.dll 009A DestroyWindow
1 00190D80 user32.dll 009F DialogBoxParamA
1 00190D84 user32.dll 00A2 DispatchMessageA
1 00190D88 user32.dll 00A3 DispatchMessageW
1 00190D8C user32.dll 00B3 DrawEdge
1 00190D90 user32.dll 00B4 DrawFocusRect
1 00190D94 user32.dll 00B6 DrawFrameControl
1 00190D98 user32.dll 00B7 DrawIcon
1 00190D9C user32.dll 00B8 DrawIconEx
1 00190DA0 user32.dll 00B9 DrawMenuBar
1 00190DA4 user32.dll 00BD DrawTextA
1 00190DA8 user32.dll 00C3 EnableMenuItem
1 00190DAC user32.dll 00C4 EnableScrollBar
1 00190DB0 user32.dll 00C5 EnableWindow
1 00190DB4 user32.dll 00C7 EndDialog
1 00190DB8 user32.dll 00C9 EndPaint
1 00190DBC user32.dll 00CC EnumChildWindows
1 00190DC0 user32.dll 00DC EnumThreadWindows
1 00190DC4 user32.dll 00DF EnumWindows
1 00190DC8 user32.dll 00E0 EqualRect
1 00190DCC user32.dll 00E2 ExitWindowsEx
1 00190DD0 user32.dll 00E3 FillRect
1 00190DD4 user32.dll 00E4 FindWindowA
1 00190DD8 user32.dll 00EA FrameRect
1 00190DDC user32.dll 00EC GetActiveWindow
1 00190DE0 user32.dll 00F4 GetCapture
1 00190DE4 user32.dll 00F7 GetClassInfoA
1 00190DE8 user32.dll 00FB GetClassLongA
1 00190DEC user32.dll 00FD GetClassNameA
1 00190DF0 user32.dll 0100 GetClientRect
1 00190DF4 user32.dll 0102 GetClipboardData
1 00190DF8 user32.dll 0109 GetCursor
1 00190DFC user32.dll 010C GetCursorPos
1 00190E00 user32.dll 010D GetDC
1 00190E04 user32.dll 010E GetDCEx
1 00190E08 user32.dll 010F GetDesktopWindow
1 00190E0C user32.dll 0112 GetDlgItem
1 00190E10 user32.dll 0117 GetFocus
1 00190E14 user32.dll 0118 GetForegroundWindow
1 00190E18 user32.dll 011B GetIconInfo
1 00190E1C user32.dll 0120 GetKeyNameTextA
1 00190E20 user32.dll 0122 GetKeyState
1 00190E24 user32.dll 0123 GetKeyboardLayout
1 00190E28 user32.dll 0124 GetKeyboardLayoutList
1 00190E2C user32.dll 0125 GetKeyboardLayoutNameA
1 00190E30 user32.dll 0127 GetKeyboardState
1 00190E34 user32.dll 0128 GetKeyboardType
1 00190E38 user32.dll 0129 GetLastActivePopup
1 00190E3C user32.dll 012D GetMenu
1 00190E40 user32.dll 0133 GetMenuItemCount
1 00190E44 user32.dll 0134 GetMenuItemID
1 00190E48 user32.dll 0135 GetMenuItemInfoA
1 00190E4C user32.dll 0138 GetMenuState
1 00190E50 user32.dll 0139 GetMenuStringA
1 00190E54 user32.dll 013D GetMessagePos
1 00190E58 user32.dll 0146 GetParent
1 00190E5C user32.dll 014B GetPropA
1 00190E60 user32.dll 0156 GetScrollInfo
1 00190E64 user32.dll 0157 GetScrollPos
1 00190E68 user32.dll 0158 GetScrollRange
1 00190E6C user32.dll 015A GetSubMenu
1 00190E70 user32.dll 015B GetSysColor
1 00190E74 user32.dll 015C GetSysColorBrush
1 00190E78 user32.dll 015D GetSystemMenu
1 00190E7C user32.dll 0164 GetTopWindow
1 00190E80 user32.dll 0165 GetUpdateRect
1 00190E84 user32.dll 016B GetWindow
1 00190E88 user32.dll 016D GetWindowDC
1 00190E8C user32.dll 016F GetWindowLongA
1 00190E90 user32.dll 0170 GetWindowLongW
1 00190E94 user32.dll 0174 GetWindowPlacement
1 00190E98 user32.dll 0175 GetWindowRect
1 00190E9C user32.dll 0178 GetWindowTextA
1 00190EA0 user32.dll 017C GetWindowThreadProcessId
1 00190EA4 user32.dll 018B InflateRect
1 00190EA8 user32.dll 018E InsertMenuA
1 00190EAC user32.dll 018F InsertMenuItemA
1 00190EB0 user32.dll 0193 IntersectRect
1 00190EB4 user32.dll 0194 InvalidateRect
1 00190EB8 user32.dll 019D IsCharUpperA
1 00190EBC user32.dll 019F IsChild
1 00190EC0 user32.dll 01A1 IsDialogMessage
1 00190EC4 user32.dll 01A3 IsDialogMessageW
1 00190EC8 user32.dll 01A7 IsIconic
1 00190ECC user32.dll 01A9 IsRectEmpty
1 00190ED0 user32.dll 01AC IsWindow
1 00190ED4 user32.dll 01AD IsWindowEnabled
1 00190ED8 user32.dll 01AF IsWindowUnicode
1 00190EDC user32.dll 01B0 IsWindowVisible
1 00190EE0 user32.dll 01B1 IsZoomed
1 00190EE4 user32.dll 01B3 KillTimer
1 00190EE8 user32.dll 01B6 LoadBitmapA
1 00190EEC user32.dll 01B8 LoadCursorA
1 00190EF0 user32.dll 01BC LoadIconA
1 00190EF4 user32.dll 01C0 LoadKeyboardLayoutA
1 00190EF8 user32.dll 01C9 LoadStringA
1 00190EFC user32.dll 01D4 MapVirtualKeyA
1 00190F00 user32.dll 01D8 MapWindowPoints
1 00190F04 user32.dll 01DC MessageBeep
1 00190F08 user32.dll 01DD MessageBoxA
1 00190F0C user32.dll 01EF OemToCharA
1 00190F10 user32.dll 01F3 OffsetRect
1 00190F14 user32.dll 01FE PeekMessageA
1 00190F18 user32.dll 01FF PeekMessageW
1 00190F1C user32.dll 0200 PostMessageA
1 00190F20 user32.dll 0202 PostQuitMessage
1 00190F24 user32.dll 020C PtInRect
1 00190F28 user32.dll 0216 RedrawWindow
1 00190F2C user32.dll 0217 RegisterClassA
1 00190F30 user32.dll 021B RegisterClipboardFormatA
1 00190F34 user32.dll 021B RegisterClipboardFormatA
1 00190F38 user32.dll 022A ReleaseCapture
1 00190F3C user32.dll 022B ReleaseDC
1 00190F40 user32.dll 022C RemoveMenu
1 00190F44 user32.dll 022D RemovePropA
1 00190F48 user32.dll 0232 ScreenToClient
1 00190F4C user32.dll 0235 ScrollWindow
1 00190F50 user32.dll 0237 SendDlgItemMessageA
1 00190F54 user32.dll 023C SendMessageA
1 00190F58 user32.dll 0241 SendMessageW
1 00190F5C user32.dll 0244 SetActiveWindow
1 00190F60 user32.dll 0245 SetCapture
1 00190F64 user32.dll 0248 SetClassLongA
1 00190F68 user32.dll 024E SetCursor
1 00190F6C user32.dll 0257 SetFocus
1 00190F70 user32.dll 0258 SetForegroundWindow
1 00190F74 user32.dll 025E SetMenu
1 00190F78 user32.dll 0263 SetMenuItemInfoA
1 00190F7C user32.dll 0267 SetParent
1 00190F80 user32.dll 026B SetPropA
1 00190F84 user32.dll 026D SetRect
1 00190F88 user32.dll 026F SetScrollInfo
1 00190F8C user32.dll 0270 SetScrollPos
1 00190F90 user32.dll 0271 SetScrollRange
1 00190F94 user32.dll 027B SetTimer
1 00190F98 user32.dll 0281 SetWindowLongA
1 00190F9C user32.dll 0282 SetWindowLongW
1 00190FA0 user32.dll 0283 SetWindowPlacement
1 00190FA4 user32.dll 0284 SetWindowPos
1 00190FA8 user32.dll 0287 SetWindowTextA
1 00190FAC user32.dll 028B SetWindowsHookExA
1 00190FB0 user32.dll 0290 ShowOwnedPopups
1 00190FB4 user32.dll 0291 ShowScrollBar
1 00190FB8 user32.dll 0293 ShowWindow
1 00190FBC user32.dll 029A SystemParametersInfoA
1 00190FC0 user32.dll 02A5 TrackPopupMenu
1 00190FC4 user32.dll 02AA TranslateMDISysAccel
1 00190FC8 user32.dll 02AB TranslateMessage
1 00190FCC user32.dll 02AF UnhookWindowsHookEx
1 00190FD0 user32.dll 02B4 UnregisterClassA
1 00190FD4 user32.dll 02BC UpdateWindow
1 00190FD8 user32.dll 02D1 WaitMessage
1 00190FDC user32.dll 02D6 WindowFromPoint
1 00190FE0 user32.dll 02D9 wsprintfA
1 00190FE4 user32.dll 015E GetSystemMetrics

FThunk: 00191004 NbFunc: 00000005
1 00191004 ole32.dll 0012 CoCreateInstance
1 00191008 ole32.dll 003C CoInitialize
1 0019100C ole32.dll 003E CoInitializeSecurity
1 00191010 ole32.dll 0065 CoTaskMemAlloc
1 00191014 ole32.dll 006A CoUninitialize


Los pasos que hago son:
Detenido en EP traceo paso el PUSHAD, luego follow in dump en el registro ESP y coloco un hardware breakpoint on access una vez detenido llego hasta el retn (Ctrl+F9) paso con F7 y llego al OEP, luego de eso busco alguna API que apunte a la IAT, verifico el inicio y final de la IAT, dumpeo abro import rect coloco RVA INICIO LARGO reparo con fix dump pero al iniciar el dump con la IAT reparada me aparecer

Error 00004

Si alguien me pudiera explicar cual es mi error por que desempaquetar aspack hay programas pero quiero aprender como desempaquetarlo de manera manual

Adjunto el link del programa:
http://www.mediafire.com/?ny17t4az6yh1whc
#206
Ingeniería Inversa / Feliz cumpleaños MCKSys
24 Octubre 2011, 17:29 PM
Pues eso desearte un feliz cumpleaños y agradecerte humildemente por todo ese esfuerzo que haz dedicado para ayudar en especial agradecerte personalmente por tu apoyo frente a mi muchas gracias por todo

UND3R
#207
OllyDBG y Cheat engine

OllyDBG puede ser muy útil junto con Cheat engine al momento de querer
alterar, modificar un proceso en tiempo de ejecución y en este tutorial veremos cómo podemos aprovechar estos dos grandes programas en la creación de un trainer que funcione en cualquier máquina.

En esta ocasión utilizaremos como ejemplo un juego llamado: PlantsVsZombies versión 1.2.0.1073 Un juego simple pero muy adictivo.

Descarga:http://www.mediafire.com/download.php?6s16ifbo81evav9
(Subido por Wildseba)

Cheat engine:
Cheat engine es un potente buscador de address que por lo general es usado para modificar valores de juegos.

OllyDBG:
Excelente debugger con un sin fin de opciones que facilitan considerablemente su uso.

I)Conociendo al objetivo
Si iniciamos y luego de esperar que cargue el juego veremos el menú principal:


Iniciamos una nueva partida en modo aventura y al comenzar el juego veremos lo siguiente:


Explicaré rápidamente el juego, como podemos apreciar vemos una línea de césped esa línea es el lugar en donde nosotros podemos plantar plantas que se encargarán de combatir a los zombies y evitar que estos entren a "nuestra casa" y que nos coman el cerebro, para poder plantar requerimos soles, en la parte superior de la pantalla a la derecha podemos ver la cantidad de soles totales que tenemos y al lado las plantas que podemos plantar. Estas plantas tienen un coste de soles y podemos verlo en la parte inferior de la planta:


Para poder colocar una planta debemos seleccionarla con un clic y luego seleccionar en qué posición de nuestro césped la queremos plantar:


Una vez plantada se nos descontará de nuestros soles totales el coste de la planta, que en este caso su coste era de 100 soles quedándonos solo 50:


Para poder tener más soles podemos recoger los que caen del cielo, estos equivalen a 25 soles:


Si atrapamos 2 se nos sumarán 50 soles a nuestra cantidad total:


Lo que intentaremos en este tutorial será evitar que al plantar plantas se nos descuenten soles. para ello debemos entender que los juegos al igual que cualquier aplicación trabajan lógicamente con valores y estos están ubicados en una cierta dirección(Address) esta dirección puede estar dentro del ejecutable(rango de address) o fuera de él (Address generado en tiempo de ejecución) por lo que nuestro objetivo será encontrar el address que opera con la cantidad de soles totales, para localizar address utilizaremos Cheat engine.

II)Cheat engine
Abrimos la herramienta Cheat engine y veremos lo siguiente:


veremos un botón que tiene un borde que cambia de color, este botón se encarga de indicarle a la herramienta Cheat engine cual será su objetivo, hacemos clic en el botón y veremos nuestra lista de procesos activos:


en este caso el proceso del juego es popcapgame1.exe lo seleccionamos y presionamos Open

Una vez seleccionado podremos buscar el address de los soles:

en mi caso actualmente poseo 100 por lo que Cheat engine buscará en todos los address aquellos que tengan valor 100, aclaro que por defecto Cheat engine utiliza números decimales pero si deseamos buscar valores hexadecimales tildamos el cuadro hex y podremos buscarlos sin ningún problema

Si desconociéramos el valor inicial del address que queremos encontrar podemos utilizar la siguiente opción:

esto nos puede ser útil para aquellos valores que no son expresados de forma numérica como por ejemplo una barra de vida.

No entraremos en detalle de las opciones de búsqueda que trae Cheat engine ya que actualmente existe mucha información sobre esta herramienta

Presionamos First scan y en el lado izquierdo nos mostrará los address que contienen el valor que hemos buscado(la idea es llegar a 1 address):


Ahora es momento de alterar el valor, nos situamos en el juego y recogemos un sol al realizar esta operación el valor 100 se transformará en 125 ya que cada sol que cae suma 25 a nuestra cantidad total de soles:




Ahora de todos los valores que anteriormente encontró Cheat engine haremos que busqué el valor 125:

Presionamos Next scan

Si miramos en la parte izquierda del programa notaremos que encontramos el address correcto :


Le hacemos doble clic y nos aparecerá en la parte inferior del programa:


Active:congela o descongela el valor del address, esto nos da la posibilidad si es que está activado nuestra cantidad de soles totales serán siempre 125

Description:Nos da la posibilidad de cambiar o colocar un nombre al address para no confundirlo con otros que tengamos en la parte inferior del programa

Address:Dirección en donde está contenido el valor encontrado

Value:Valor decimal por defecto que contiene el address

Una vez encontrado el valor podremos crear un programa que se encargue de congelar o modificar un valor de un address de un proceso en tiempo de ejecución con tan solo presionar una cierta combinación de teclas, estos programas en el área de los juegos son conocidos como trainer's

pero para poder crear un trainer el address que debemos encontrar debe estar localizado dentro del rango del ejecutable y no afuera de él ya que los address creados en tiempo de ejecución varían en cada máquina e inclusive cada vez que cargamos el juego por lo que el trainer creado funcionaría una sola vez lo cual no es la idea, esto se debe a que los programas generalmente le piden al sistema memoria virtual (VirtualAlloc) para almacenar información que solo será útil mientras se esté ejecutando, como lo son la información de una partida de un juego, no así los avances o progresos ya que estos si los debe tener el programa de manera permanente ya que cada vez que se inicie el juego se cargarán tales datos por lo que son guardados en archivos. Nuestro objetivo será localizar el address en donde operará con nuestro valor ubicado en tiempo de ejecución y modificar la operación para nuestra propia ventaja

III)OllyDBG
Atachamos con OllyDBG popcapgame1.exe:


ya cargado nos encontraremos detenido en la siguiente address:


Ahora volvemos a Cheat engine y nos dirigimos a la address en la parte inferior, presionamos clic derecho y seleccionamos "Show as hexadecimal",esto para visualizar de la misma manera que OllyDBG:


Nos quedará de la siguiente forma:


Ahora desde el dump de OllyDBG nos dirigimos al address encontrado con Cheat engine:




ya localizada la address desde OllyDBG intentaremos encontrar el lugar en donde el programa tendrá acceso al valor de la address, para ello colocamos un hardware breakpoint on write:


Presionamos F9 y plantamos una planta:


Nos detendremos en la siguiente address:


Subamos un poco más arriba para ver si encontramos alguna operación llamativa:


Notaremos que se realiza una resta, lo más probable es que se reste el valor de la planta con la cantidad total de soles, intentemos invertir el OP-Code por un ADD para que en vez de restar sume el costo de la planta con nuestra cantidad total



Quitamos el hardware breakpoint y damos RUN al comprar una planta el coste se adicionará:

En este caso de 150 aumentó a 250

Obtenido el address ubicado en el ejecutable podremos crear un trainer genérico es decir que sirva para cualquier máquina en donde sea usado

Ahora modificamos el address que está en la parte inferior del Cheat engine:


Nos quedará así:


Ahora solo nos queda crear el trainer, para ello contamos con la opción de crearlo desde el mismo Cheat engine, nos vamos a:


Veremos dos ventanas:

Esta es la ventana de configuraciones, en donde podremos seleccionar el icono, el título de la ventana, los atajos del teclado para activar las opciones del trainer, entre otras opciones

La siguiente ventana nos mostrará como quedará nuestro trainer finalizado con las configuraciones actuales que hemos hecho:


Nos ubicamos en la ventana de configuraciones  y presionamos Add Hotkey para agregar un atajo y nos aparecerá la siguiente ventana:

En esta ventana seleccionamos el addres que queramos que modifique o congele su contenido el trainer, en este caso al tener un solo address en la parte inferior, no nos aparecen más opciones

Seleccionamos el address a agregar el trainer y nos aparecerá lo siguiente:


Colocamos los siguientes datos:


Type the keys.....
Es la combinación de teclas que debemos digitar para que el trainer modifique el address

Set Value To
Cuando activemos la combinación cambiará el contenido del address al valor actual (ya que el valor actual del address lo hemos cambiado desde OllyDBG)

Description
Texto que aparecerá al lado de la combinación de teclas

Presionamos "OK" y si nos fijamos en la parte izquierda de la ventana de configuraciones veremos lo siguiente:


Ya agregada la combinación de tecla junto con su efecto presionamos "Generate trainer"

Seleccionamos la ruta en donde se generará el trainer, presionamos Guardar

Luego Presionamos Generate:


Esperamos hasta el siguiente mensaje:


Si abrimos el trainer y todo ha salido correctamente veremos lo siguiente:


Obviamente al ser un ejemplo no se ve bien estéticamente ni mucho menos posee múltiples opciones, pero de esta forma podremos crear Trainer genéricos:


#208
Crackme 3 de flamer

Nombre:Crackme 3
Autor del crack:flamer
Compilador:Visual Basic
Dificultad:1

Cargamos el crackme desde OllyDBG:


Buscamos las API'S que utiliza el crackme (Ctrl+N):

Notamos la API __vbaStrCmp

Colocamos un BP en ella:


Le damos RUN (F9) e introducimos un serial cualquiera, presionamos acceder:


Se detiene en la API __vbaStrCmp:


Notamos que compara con 0 el serial introducido, retornamos de la API:


Llegamos hasta el siguiente salto:

en donde no saltará si no introducimos ningún serial

Si damos RUN se detendrá nuevamente en el BP:


Si llegamos hasta __vbaStrComp notaremos en el registro la comparación:
EAX con ECX en donde ECX es el serial correcto

Serial Correcto:subliminal_nexus

otra forma es nopear la comprobación:




Nopeando o introduciendo como serial subliminal_nexus obtendremos el siguiente mensaje:




UND3R
#209
Ingeniería Inversa / [TUTORIAL]Crackme edu
20 Octubre 2011, 06:21 AM
Tutorial Crackme edu

Nombre:Crackme edu
Dificultad:1-2
Compilador:Visual Basic
Autor del crack:$Edu$

Cargamos el crackme desde OllyDBG, Notamos claramente que es un Visual Basic 6.0:


Veamos las API'S que utiliza el crackme (Ctrl+N):


Notaremos dos API'S muy interesantes coloquemos BP'S en ellas:




La primera se encarga de comparar string's y la segunda se encarga de obtener el número de caracteres de una string, las veremos más detalladamente a continuación mientras vayamos desarrollando el tutorial

Iniciamos el crackme (F9) e introducimos ID,SERIAL y luego verificar:


Vemos que se detiene en la API __vbaStrCmp:




Llegamos hasta la call __vbaStrComp, si nos fijamos en el stack podremos ver la comparación que se va a realizar (arg2 con arg3) notaremos que comprueba el serial falso con 0, por lo que lo más probable es que esté comprobando que si es que NO introdujimos algún valor.(para ver los datos que compara debemos hacer click derecho en alguno de los dos argumentos y seleccionar follow in dump):



Pasando la call __vbaStrComp y estando detenidos en RETN 8 veremos que EAX=1 por lo que deducimos que la API __vbaStrCmp retornará 1 si es que los string comparados no son iguales:



Luego mueve el valor de EAX a EDX y luego de algunas operaciones toma el EDX(1)y lo mueve dentro de [EBP-E4]  :


Ahora realizará los mismos pasos pero con la string ID:




Compara 0 con la ID que introdujimos esto devolverá 1 al retornar de la CALL:


una vez realizada las mismas operaciones mueve respectivamente ambos valores obtenidos de las llamadas a __vbaStrCmp (Ambos retornaron 1) a EAX y ECX:



realizando un TEST EAX,ECX:

Sabemos que la única forma de que no se active el flag Z (para que salte) es que EAX y ECX sean 1 con lo cual contamos de manera correcta

Si no se cumpliera nos mostrará un mensaje diciendo que debemos ingresar los datos


Si continuamos traceando el programa hará un llamado a la API __vbaLenBstr:


retornando la call EAX contiene el número de caracteres del serial que en este caso son 4 (serial falso:1234):


Continuando se llamará nuevamente a la API:

en esta nos retornará el valor 5 ya que UND3R contiene 5 caracteres

Luego se realiza una comparación entre EAX y ECX en donde EAX es el largo de la ID y ECX el largo del serial, notaremos que si no se realiza el salto obtendremos como resultado que el serial es incorrecto, para que pueda saltar el serial no puede ser mayor(más largo) que el ID en este caso cumplimos con el requisito:


Luego de esto no creo que se utilice nuevamente la API __vbaLenBstr debido a que ya se ha calculado el largo que hemos ingresado tanto del serial y del ID por lo que lo borraremos:


Ahora si damos nuevamente F9 se detiene en la API __vbaStrCmp:


si pusheamos hasta el call __vbaStrComp y miramos el stack notaremos que se está comparando 1 con Z, siendo 1 el primer digito que introdujimos en el serial falso:






Retornando de la API EAX toma el valor de FFFFFFFF y este es movido a ESI para luego pasar por un TEST SI,SI


:
en donde la única forma de que no salte es que ESI=0, por lo que podemos colocar un BP en el salto JNZ e introducir como serial Z234 o modificar el flag Z para que no salte ya que si salta notaremos se dirigirá a la string "Serial incorrecto"

Si seguimos traceando llegaremos a la siguiente address:

previamente vemos una comparación que es 1 con 3 en donde saltará si lo que está en DI sea mayor a 3, si vemos hacia donde salta notaremos que es hacia el cartel de que el serial es correcto, aquí veo un posible pequeño bug en la programación del crackme ya lo comentaré

[EBP-D0]:


Si seguimos traceando sin alterar el salto que nos dirige al cartel de serial correcto llegaremos hasta la siguiente address:


Si bajamos un poco notaremos un salto que anteriormente habíamos pasado por el, lo más probable es que tengamos a continuación la manera de como el crackme obtuvo la letra Z como respuesta correcta para el primer carácter del serial. obviamente en este caso obtendremos el valor del segundo carácter correcto:


Lleguemos hasta la siguiente address:


Aquí notamos algo muy interesante si miramos el registro y el OP-Code del address en donde estamos detenidos:


Sabemos que ECX apunta a nuestro ID, aquí moverá a DX el valor de ECX+2 por lo que moverá el segundo carácter a DX que en este caso es una N:




Quedando EDX con de la siguiente manera:


luego a EDX le suma 5, una vez sumado mueve a EAX el valor de DX y lo pushea para la API __vbaStrCmp:


luego llega nuevamente a una comprobación que es la misma en la que nos detuvimos cuando se comparó 1 con Z:


si vemos en el stack notaremos la comparación entre nuestro segundo caracter del serial con S:






Por lo que ya contamos con la fórmula y de alguna manera el entendimiento de como trabaja el crackme

Resumimos:
-verifica que ambas cajas de textos no estén vacías
-luego verifica que el SERIAL introducido no sea mayor a la ID
-luego toma el primer carácter del serial y le suma 5
-compara el resultado del primer carácter+5 con el primer carácter del serial
-luego continua sucesivamente con un contador que es hasta el tercer carácter
-Cumpliéndose los 3 primeros caracteres obtendremos el cartel de serial correcto

Aquí el problema de $Edu$, quizás es intencional pero la comprobación es solo hasta el tercer carácter por lo que podríamos colocar tan solo 3 caracteres este sería el pequeño bug del crackme

UND3R
U=55+5=Z
N=4e+5=S
D=44+5=I
3=3+5=8
R=52+5=W


Otra forma de crackearlo es nopear el salto que viene a continuación de la comparación del serial ya que si recordamos $Edu$ colocó un contador que si se pasa por el por tercera vez es considerado el serial como correcto:





Saludos a $Edu$

EDIT:
Adjunto el keygen hecho en OllyScript:


Código (asm) [Seleccionar]
VAR CONT
VAR VMEMORY
VAR SIZE
VAR AUX
VAR RESP
PREG:
ASK "Introduzca su ID"
MOV RESP,$RESULT
LEN RESP
MOV SIZE,$RESULT
ALLOC 100
MOV VMEMORY,$RESULT
MOV VMEMORY2,VMEMORY
CMP VMEMORY,0
JE ERROR1
MOV [VMEMORY],RESP
OPERACION:
CMP CONT,SIZE
JE EXIT
MOV AUX,[VMEMORY],1
ADD AUX,5
MOV [VMEMORY],AUX,1
INC VMEMORY
INC CONT
JMP OPERACION
ERROR:
MSG "Debe ingresar un serial"
JMP PREG
ERROR1:
MSG "Error inesperado"
RET
EXIT:
MOV AUX,[VMEMORY2], SIZE
BUF AUX
STR AUX
EVAL "ID:{RESP} SERIAL:{AUX}"
MSG $RESULT
FREE VMEMORY2
RET

#210
pues eso, como puedo ir adicionando valores me explico

tengo 3 valores

A B y C

como puedo hacer para que una variable vaya adicionando esos 3 valores

VAR AUX

que AUX sea A luego AB y luego ABC

No sé si se entienda bien mi duda jeje

Saludos y gracias
#211
Pues eso, algo así como GREFF existirá algún comando que tome valores de un txt o mejor todavía del log

Saludos
#212
Versión V1.2
¿Para que sirve?
-Si tenemos un programa trial podremos lanzar el script, luego caducarlo (cambiar la fecha) e ejecutar el script nuevamente, luego de eso comparamos y obtendremos el salto que nos bloquea el acceso al programa.
-Si dumpeamos un programa y tiene detección CRC podemos realizar los pasos comentados anteriormente y obtendremos el salto CRC.
-Si tenemos un serial verdadero podemos obtener el salto que nos considera el serial como válido.

Mejoras:
-Reparado error con 2 opciones activadas al mismo tiempo (filtro bucle con  detenerse en address específico, generaban un error que ya está solucionado)
-Log tipo de salto(idea de tinkipinki)
-Anterior versión solo logeaba saltos SHORT, ahora logea JMP NEAR
-Optimizado el código: V1.0=367 lineas V1.2=309 lineas (incluyendo las opciones adicionales)
-Filtrar los saltos SHORT
EDIT:tenía un pequeño error el código cuando lo subí, ahora está editado y funciona correctamente.

Imágenes:










Código de la versión 1.2:
Código (asm) [Seleccionar]
/*
   -=================================================================-

       Script realizado por :UND3R                                      
       Script para : Logear saltos condicionales                                              
       Configuracion: Saltar todas las excepciones y no tener ningún BP                                              
       Fecha : 12/10/2011                                          

                   -=[ Comentario del Script ]=-                    
    Ideal para logear todo tipo de saltos condicionales para posteriormente                                                              
    compararlo con otro log con el fin de localizar saltos mágicos                                                                

   -=================================================================-
*/
VAR AUX_EXIT
VAR T_F_N_LOG
VAR CONT_LOG_N
VAR FILTRO
VAR VEIP
VAR RESP
VAR N_LOGTXT
VAR LOG_SALTO
VAR VMEMORY
VAR VMEMORY2
VAR VMEMORY3
VAR AUX_TS
VAR TIPO_SALTO
VAR AUX_TS2
VAR LOG_BUCLE1
VAR LOG_BUCLE2
VAR COMP
VAR VEIP2
VAR MAX
VAR MIN
VAR CONT_LOG_N2
VAR CANTI_LOG_SAVE
VAR COMPROBAR_SALTO
VAR SI_NO
VAR VAR_EIP
VAR CONT_JUMP
VAR LOG_TIPO_SALTO
VAR ANTIBUCLE2
VAR ANTIBUCLE1
VAR N_BUCLE1
VAR CONT
VAR INF_BUCLE2
VAR INF_BUCLE1
VAR INF_BUCLE
VAR VEIP_2
VAR FILTRAR_JMP_SHORT
ASK "Introduzca el nombre del archivo a crear EJ: LOG1.TXT"
MOV N_LOGTXT,$RESULT
EVAL "{N_LOGTXT}"
WRT $RESULT, "|N:   |ADDRESS:|EIP:    |SALTA: |BUCLE: |TIPO SALTO:|"
WRTA $RESULT, "|---------------------------------------------------|"  
PREG_FILTRO:
MSGYN "¿Opciones avanzadas?"
CMP 1,$RESULT
JE AVANZADO
TRACE:
TICND "byte [EIP] > 6F && byte [EIP] < 80 || byte [EIP+1] > 7F && byte [EIP+1] < 90 && byte [EIP]==0F"
CMP RESP,eip
JE EXIT1
OPCODE eip
MOV LOG_SALTO,$RESULT_1
ALLOC 50
MOV VMEMORY,$RESULT
MOV [VMEMORY],LOG_SALTO
MOV VMEMORY2,VMEMORY
ADD VMEMORY2,2
BUCLE_TS:
CMP [VMEMORY2],20,1
JNE INC_VMEMORY2
MOV VMEMORY3,VMEMORY2
COMP_SHORT:
INC VMEMORY3
MOV AUX_TS,[VMEMORY3],5
CMP AUX_TS,"SHORT"
JE SALTO_TIPO1
SALTO_TIPO2:
SUB VMEMORY2,VMEMORY
MOV TIPO_SALTO,[VMEMORY],VMEMORY2
STR TIPO_SALTO
FREE VMEMORY
JMP TRACE0
SALTO_TIPO1:
ADD VMEMORY3,5
MOV AUX_TS2,[VMEMORY3],1
CMP AUX_TS2,2E
JE SALTO_TIPO2
SUB VMEMORY3,VMEMORY
MOV TIPO_SALTO,[VMEMORY],VMEMORY3
LOG TIPO_SALTO
FREE VMEMORY
CMP FILTRAR_JMP_SHORT,1
JE TRACE
JMP TRACE0
INC_VMEMORY2:
INC VMEMORY2
JMP BUCLE_TS
TRACE0:
CMP eip,VEIP
JE CONT_BUCLE
MOV LOG_BUCLE1,0
MOV LOG_BUCLE2,0
TRACE1:
OPCODE eip
MOV VEIP,eip
MOV VEIP2,VEIP
ADD VEIP2,$RESULT_2
STI
CMP FILTRO,1
JNZ TRACE2
CMP eip,MAX
JA TRACE2
CMP eip,MIN
JAE TRACE
TRACE2:
CMP LOG_BUCLE1,1
JNE TRACE3
MOV LOG_BUCLE2,"!"
TRACE3:
INC CONT_LOG_N
ITOA CONT_LOG_N, 10.
MOV CONT_LOG_N2,$RESULT
CMP T_F_N_LOG,1
JNE TRACE4
CMP CONT_LOG_N2,CANTI_LOG_SAVE
JE EXIT2
TRACE4:
CMP VEIP2,eip
JE NO
SI:
MOV COMPROBAR_SALTO,1
MOV SI_NO,"SI"
JMP LOG_COMPR_TXT
NO:
MOV COMPROBAR_SALTO,0
MOV SI_NO,"NO"
LOG_COMPR_TXT:
EVAL "|{CONT_LOG_N2}"
MOV CONT_LOG_N2,$RESULT
LOG_COMPR_TXT_:
LEN CONT_LOG_N2
CMP $RESULT,6
JNE INC_LOG_COMPR_TXT
ADD CONT_LOG_N2,"|"
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_LOG_N2
LOG_CMPR_TXT2:
EVAL "{VEIP}"
MOV VEIP_2,$RESULT
LOG_CMPR_TXT2_:
LEN VEIP_2
CMP $RESULT,8
JNE INC_LOG_CMPR_TXT2
ADD VEIP_2,"|"
EVAL "{N_LOGTXT}"
WRTA $RESULT,VEIP_2,""
LOG_CMPR_TXT3:
EVAL "{eip}"
MOV VAR_EIP,$RESULT
LOG_CMPR_TXT3_:
LEN VAR_EIP
CMP $RESULT,8
JNE INC_LOG_CMPR_TXT3
ADD VAR_EIP,"|"
EVAL "{N_LOGTXT}"
WRTA $RESULT,VAR_EIP,""
LOG_CMPR_TXT4:
EVAL "{SI_NO}     |{LOG_BUCLE2}      |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
CMPR_LEN_TS:
LEN TIPO_SALTO
CMP $RESULT,B
JNE INC_LEN_TS
EVAL "{TIPO_SALTO}|"
MOV LOG_TIPO_SALTO,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,LOG_TIPO_SALTO,""
CMP AUX_EXIT,1
JE LOG_COMPR_TXT2
JMP TRACE
LOG_COMPR_TXT2:
JMP EXIT
STOP:
BPHWS RESP, "x"
JMP FILTRO
EXIT1:
BPHWC RESP
EXIT:
EVAL "{N_LOGTXT}"
WRTA $RESULT,"`---------------------------------------------------´"
ret
EXIT2:
MOV AUX_EXIT,1
JMP TRACE4
AVANZADO:
MSGYN "¿Detener en Nº cantidad de datos logeados?"
CMP 0,$RESULT
JE AVANZADO2
N_LOG_SAVE:
ASK "Introduzca número de datos a logear:"
MOV CANTI_LOG_SAVE,$RESULT
ITOA CANTI_LOG_SAVE
MOV CANTI_LOG_SAVE,$RESULT
MOV T_F_N_LOG,1
JMP FILTRO
AVANZADO2:
MSGYN "¿Detener log en address determinado?"
CMP 0,$RESULT
JE FILTRO
BP_ADDRESS:
ASK "Introduzca la dirección en donde desea detener el log"
MOV RESP,$RESULT
CMP RESP,0
JNE STOP
FILTRO:
MSGYN "¿Excluir en el log rango de address?"
CMP 0,$RESULT
JE FILTRO_JMP
FILTRO2:
MOV FILTRO,1
ASK "Introduzca el rango a excluir,desde:"
MOV MIN,$RESULT
ASK "hasta:"
MOV MAX,$RESULT
FILTRO_JMP:
MSGYN "¿Excluir saltos SHORT?"
CMP 0,$RESULT
JE ANTIBUCLE
MOV FILTRAR_JMP_SHORT,1
ANTIBUCLE:
MSGYN "¿Log inteligente (evita bucle's)?"
CMP 0,$RESULT
JE OLLYH
ANTIBUCLE2:
MOV ANTIBUCLE1,1
ASK "Nº de veces que debe repetirse un salto para ser considerado bucle"
MOV N_BUCLE1,$RESULT
OLLYH:
MSGYN "¿Ocultar OllyDBG mientras se ejecuta el script?"
CMP $RESULT,0
JE GOTRACE
DBH
GOTRACE:
JMP TRACE
CONT_BUCLE:
INC CONT
MOV LOG_BUCLE1,1
CMP CONT,N_BUCLE1
JE SALTAR_BUCLE
JMP TRACE1
SALTAR_BUCLE:
CMP COMPROBAR_SALTO,0
JE NO_SALTA_BUCLE
SI_SALTA_BUCLE:
MOV INF_BUCLE2,VEIP2
JMP BUCLE2
NO_SALTA_BUCLE:
MOV INF_BUCLE,VEIP
ADD INF_BUCLE,1
MOV INF_BUCLE,[INF_BUCLE],1
MOV INF_BUCLE2,eip
ADD INF_BUCLE2,INF_BUCLE
ADD INF_BUCLE2,2
CMP INF_BUCLE,7F
JBE BUCLE2
SUB INF_BUCLE2,100
BUCLE2:
EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!------------------"
MOV CONT_JUMP,$RESULT
BUCLE2_:
LEN CONT_JUMP
CMP $RESULT,34
JNE INC_BUCLE2
ADD CONT_JUMP,"|"
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
BUCLE_CONT_:
BP INF_BUCLE2
RUN
CMP INF_BUCLE2,eip
JNE ERROR1
BC INF_BUCLE2
MOV CONT,0
MOV LOG_BUCLE1,0
MOV LOG_BUCLE2,0
JMP TRACE
INC_LEN_TS:
ADD TIPO_SALTO," "
JMP CMPR_LEN_TS
INC_BUCLE2:
ADD CONT_JUMP,"-"
JMP BUCLE2_
INC_LOG_CMPR_TXT3:
ADD VAR_EIP," "
JMP LOG_CMPR_TXT3_
INC_LOG_CMPR_TXT2:
ADD VEIP_2," "
JMP LOG_CMPR_TXT2_
INC_LOG_COMPR_TXT:
ADD CONT_LOG_N2," "
JMP LOG_COMPR_TXT_
ERROR1:
MSG "Error inesperado #1"
RET





Versión V1.0
Este script como el título lo dice se encarga de logear todos los diferentes tipos de saltos condicionales hasta un cierto punto especificado por el usuario y los guarda en un documento de texto (archivo log) indicando el address en donde estaba el salto,si se realizó el salto o no y si se realizó indica hacia donde salto, esto puede ser útil para encontrar comprobaciones CRC, antidump de tamaño o detección de si el programa está siendo ejecutado bajo una máquina virtual, la idea es generar dos log
EJ: archivo desempaqueta=Log1 archivo empaquetado=Log2, ambos detenidos en el OEP, de esta forma con algún comparador de textos podremos ver que salto tienen de diferencia siendo este el posible causante de las detecciones mencionadas anteriormente.

Imágen de logs:



=el número de log, este es el que se debe especificar dentro de las opciones si se quiere detener en N cantidad de log especificado.

ADDRESS=Indica en donde está el salto encontrado

EIP=Indica la ubicación luego de que se ejecutó el salto

BUCLE=!: indica que se está repitiendo un salto
          0:Indica que NO se está repitiendo el salto

SALTA: SI/NO este es la acción más importante del script



*En esta imagen muestra la detección de un bucle, para evitar que se repita en el log, con la opción de log inteligente en vez de ver los address repetidos, veremos una alerta


-Nombre del .txt:
El script en primera instancia nos preguntará con que nombre queremos guardar el log

-Opciones avanzadas:
Si no optamos por esta opción el script comenzará a logear todos

-Detener en Nº cantidad de datos logeados:
Esta opción nos da la posibilidad de que el script se detenga en una cierta cantidad de números de registro.

-Detener en un determinado address:
Si queremos detener el script en un cierto address

-Excluir en el log rango de address:
Nos da la posibilidad de poder excluir un rango de address, estas no serán mostradas en el log, ideal para excluir los saltos de las API'S si elegimos esta opción nos preguntara desde donde queremos que excluya y hasta que address

-Log inteligente:
esta opción evita bucles ideal para evitar tener repetidos datos en el log que pueden estorbar la comparación, si elegimos esta opción nos preguntará cuantas veces debe pasar el programa por un mismo salto para que sea considerado bucle
*Recomendación:4
*Actualmente no considera como bucle en donde un salto salta a otro salto
-Ocultar OllyDBG mientras se ejecuta el script:
esta opción habilita el comando DBGH

SCRIPT:
Código (asm) [Seleccionar]
/*
   -=================================================================-
                                               
       Script realizado por :UND3R                                      
       Script para : Logear saltos condicionales                                              
       Configuracion: Saltar todas las excepciones y no tener ningún BP                                              
       Fecha : 12/10/2011                                          
                                                                   
                   -=[ Comentario del Script ]=-                    
    Ideal para logear todo tipo de saltos condicionales para posteriormente                                                              
    compararlo con otro log con el fin de localizar saltos mágicos                                                                
                                                                   
   -=================================================================-
*/
VAR INFO_N4
VAR STR_4
VAR STR_2
VAR STR_1
VAR INFO_N3
VAR INFO_N2
VAR INFO_N
VAR CONT_LOG_N2
VAR AUX_EXIT
VAR T_F_N_LOG
VAR CANTI_LOG_SAVE
VAR CONT_LOG_N
VAR SI_NO
VAR CONT_JUMP
VAR N_LOGTXT
VAR LOG_BUCLE2
VAR LOG_BUCLE1
VAR COMPROBAR_SALTO
VAR INF_BUCLE2
VAR INF_BUCLE
VAR N_BUCLE1
VAR CONT
VAR ANTIBUCLE1
VAR FILTRO
VAR MIN
VAR MAX
VAR COMP
VAR RESP
VAR VEIP2
VAR VEIP
ASK "Introduzca el nombre del archivo a crear EJ: LOG1.TXT"
MOV N_LOGTXT,$RESULT
EVAL "{N_LOGTXT}"
WRT $RESULT, "|N:   |ADDRESS:|EIP:    |BUCLE: |SALTA: |"
WRTA $RESULT, "|---------------------------------------|"  
PREG_FILTRO:
MSGYN "¿Opciones avanzadas?"
CMP 1,$RESULT
JE AVANZADO
TRACE:
TICND "byte [EIP] > 6F && byte [EIP] < 80"
CMP RESP,eip
JE EXIT1
CMP eip,VEIP
JE CONT_BUCLE
MOV LOG_BUCLE1,0
MOV LOG_BUCLE2,0
TRACE1:
MOV COMP,[eip],1
CMP COMP,70
JB TRACE
CMP COMP,7F
JA TRACE
OPCODE eip
MOV VEIP,eip
MOV VEIP2,VEIP
ADD VEIP2,$RESULT_2
STI
CMP FILTRO,1
JNZ TRACE2
CMP eip,MAX
JA TRACE2
CMP eip,MIN
JAE TRACE
TRACE2:
CMP LOG_BUCLE1,1
JNE TRACE3
MOV LOG_BUCLE2,"!"
TRACE3:
INC CONT_LOG_N
ITOA CONT_LOG_N, 10.
MOV CONT_LOG_N2,$RESULT
CMP T_F_N_LOG,1
JNE TRACE4
CMP CONT_LOG_N2,CANTI_LOG_SAVE
JE EXIT2
TRACE4:
CMP VEIP2,eip
JE NO
SI:
MOV COMPROBAR_SALTO,1
MOV SI_NO,"SI"
JMP LOG_COMPR_TXT
NO:
MOV COMPROBAR_SALTO,0
MOV SI_NO,"NO"
LOG_COMPR_TXT:
LEN CONT_LOG_N2
MOV INFO_N,$RESULT
CMP INFO_N,1
JE LOG_CMPR_TXT_1
CMP INFO_N,2
JE LOG_CMPR_TXT_2
CMP INFO_N,3
JE LOG_CMPR_TXT_3
CMP INFO_N,4
JE LOG_CMPR_TXT_4
CMP INFO_N,5
JE LOG_CMPR_TXT__5
JMP ERROR2
LOG_CMPR_TXT_1:
EVAL "|{CONT_LOG_N2}    |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
JMP LOG_CMPR_TXT2
LOG_CMPR_TXT_2:
EVAL "|{CONT_LOG_N2}   |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
JMP LOG_CMPR_TXT2
LOG_CMPR_TXT_3:
EVAL "|{CONT_LOG_N2}  |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
JMP LOG_CMPR_TXT2
LOG_CMPR_TXT_4:
EVAL "|{CONT_LOG_N2} |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
JMP LOG_CMPR_TXT2
LOG_CMPR_TXT__5:
EVAL "|{CONT_LOG_N2}|"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
LOG_CMPR_TXT2:
ITOA VEIP
MOV STR_1,$RESULT
LEN STR_1
MOV INFO_N2,$RESULT
CMP INFO_N2,5
JE LOG_CMPR_TXT_5
CMP INFO_N2,6
JE LOG_CMPR_TXT_6
CMP INFO_N2,7
JE LOG_CMPR_TXT_7
CMP INFO_N2,8
JE LOG_CMPR_TXT_8
JMP ERROR3
LOG_CMPR_TXT_5:
EVAL "{VEIP}   |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
JMP LOG_CMPR_TXT3
LOG_CMPR_TXT_6:
EVAL "{VEIP}  |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
JMP LOG_CMPR_TXT3
LOG_CMPR_TXT_7:
EVAL "{VEIP} |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
JMP LOG_CMPR_TXT3
LOG_CMPR_TXT_8:
EVAL "{VEIP}|"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
LOG_CMPR_TXT3:
ITOA eip
MOV STR_2,$RESULT
LEN STR_2
MOV INFO_N3,$RESULT
CMP INFO_N3,5
JE LOG_CMPR_TXT2_5
CMP INFO_N3,6
JE LOG_CMPR_TXT2_6
CMP INFO_N3,7
JE LOG_CMPR_TXT2_7
CMP INFO_N3,8
JE LOG_CMPR_TXT2_8
JMP ERROR4
LOG_CMPR_TXT2_5:
EVAL "{eip}   |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
JMP LOG_CMPR_TXT4
LOG_CMPR_TXT2_6:
EVAL "{eip}  |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
JMP LOG_CMPR_TXT4
LOG_CMPR_TXT2_7:
EVAL "{eip} |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
JMP LOG_CMPR_TXT4
LOG_CMPR_TXT2_8:
EVAL "{eip}|"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
LOG_CMPR_TXT4:
EVAL "{LOG_BUCLE2}      |{SI_NO}     |"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP,""
CMP AUX_EXIT,1
JE LOG_COMPR_TXT2
JMP TRACE
LOG_COMPR_TXT2:
JMP EXIT
STOP:
BPHWS RESP, "x"
JMP FILTRO
EXIT1:
BPHWC RESP
EXIT:
EVAL "{N_LOGTXT}"
WRTA $RESULT,"`---------------------------------------´"
ret
EXIT2:
MOV AUX_EXIT,1
JMP TRACE4
AVANZADO:
MSGYN "¿Detener en Nº cantidad de datos logeados?"
CMP 0,$RESULT
JE AVANZADO2
N_LOG_SAVE:
ASK "Introduzca número de datos a logear:"
MOV CANTI_LOG_SAVE,$RESULT
ITOA CANTI_LOG_SAVE
MOV CANTI_LOG_SAVE,$RESULT
MOV T_F_N_LOG,1
JMP FILTRO
AVANZADO2:
MSGYN "¿Detener log en address determinado?"
CMP 0,$RESULT
JE FILTRO
BP_ADDRESS:
ASK "Introduzca la dirección en donde desea detener el log"
MOV RESP,$RESULT
CMP RESP,0
JNE STOP
FILTRO:
MSGYN "¿Excluir en el log rango de address?"
CMP 0,$RESULT
JE ANTIBUCLE
FILTRO2:
MOV FILTRO,1
ASK "Introduzca el rango a excluir,desde:"
MOV MIN,$RESULT
ASK "hasta:"
MOV MAX,$RESULT
ANTIBUCLE:
MSGYN "¿Log inteligente (evita bucle's)?"
CMP 0,$RESULT
JE OLLYH
ANTIBUCLE2:
MOV ANTIBUCLE1,1
ASK "Nº de veces que debe repetirse un salto para ser considerado bucle"
MOV N_BUCLE1,$RESULT
OLLYH:
MSGYN "¿Ocultar OllyDBG mientras se ejecuta el script?"
CMP $RESULT,0
JE GOTRACE
DBH
GOTRACE:
JMP TRACE
CONT_BUCLE:
INC CONT
MOV LOG_BUCLE1,1
CMP CONT,N_BUCLE1
JE SALTAR_BUCLE
JMP TRACE1
SALTAR_BUCLE:
CMP COMPROBAR_SALTO,0
JE NO_SALTA_BUCLE
SI_SALTA_BUCLE:
MOV INF_BUCLE2,VEIP2
JMP BUCLE2
NO_SALTA_BUCLE:
MOV INF_BUCLE,VEIP
ADD INF_BUCLE,1
MOV INF_BUCLE,[INF_BUCLE],1
MOV INF_BUCLE2,eip
ADD INF_BUCLE2,INF_BUCLE
ADD INF_BUCLE2,2
CMP INF_BUCLE,7F
JBE BUCLE2
SUB INF_BUCLE2,100
BUCLE2:
ITOA VEIP
MOV STR_4,$RESULT
LEN STR_4
MOV INFO_N4,$RESULT
CMP INFO_N4,5
JE BUCLE_5
CMP INFO_N4,6
JE BUCLE_6
CMP INFO_N4,7
JE BUCLE_7
CMP INFO_N4,8
JE BUCLE_8
BUCLE_5:
EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!---------|"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
JMP BUCLE_CONT_
BUCLE_6:
EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!--------|"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
BP INF_BUCLE2
JMP BUCLE_CONT_
BUCLE_7:
EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!-------|"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
JMP BUCLE_CONT_
BUCLE_8:
EVAL "|----[{VEIP}]-¡BUCLE ENCONTRADO!------|"
MOV CONT_JUMP,$RESULT
EVAL "{N_LOGTXT}"
WRTA $RESULT,CONT_JUMP
BUCLE_CONT_:
BP INF_BUCLE2
EOB COMPROBAR
RUN
COMPROBAR:
CMP INF_BUCLE2,eip
JNE ERROR1
BC INF_BUCLE2
MOV CONT,0
MOV LOG_BUCLE1,0
MOV LOG_BUCLE2,0
JMP TRACE
ERROR1:
MSG "Error inesperado #1"
RET
ERROR2:
MSG "Los datos registrados exceden la cantidad máxima permitida"
RET
ERROR3:
MSG "Error inesperado #2"
RET
ERROR4:
MSG "Error inesperado #3"
RET


Si no lo entendieron bien, les pido que lo utilicen y notarán que no es nada complicado de entender.

Saludos UND3R

PD: otra funcionalidad puede ser encontrar el salto decisivo de un programa teniendo un serial correcto.
#213
Eso, he encontrado listas de los tipos de saltos, pero sin su valor hexadecimal, si alguien me ayudará estaría muy agradecido, saludos :D
#214
Introducción al cracking en P-Code parte 2

En esta segunda parte le daremos énfasis al programa WKTVBDE, realizaremos una serie de crackmes de manera sencilla y aprenderemos a nopear en P-Code

I-Clave2.exe

Abrimos WKTVBDE y vemos lo siguiente:


Seleccionamos File->Open y elegimos clave2.exe si cargó sin ningún problema nos debería aparecer lo siguiente:


Seleccionamos Action->Run y Nos aparecerán dos alertas, estas deben ser aceptadas rapidamente ya que el debugger crashea:




Si todo ha salido bien, Nos aparecerá clave2 y debajo de el podremos ver el debugger sin ningún P-Code:


Intentemos colocar un nombre y un serial:


Ahora presionemos registrar y veremos a WKTVBDE cargado con los P-Code:


En la parte superior a la derecha, contamos con el stack:


Debajo del stack contamos con un menú muy util:


Memory dump->ALT+M


En esta parte del programa podremos localizar P-codes y modificarlos de manera muy cómoda,Por ejemplo veamos en el dessembler algunos P-codes:


Si nos fijamos en el address 00401CE0 encontraremos un BranchF que es equivalente a 1C
si nos dirigimos a Memory dump y buscamos 00401CE0:


En el costado izquierdo podemos ver los valores hexadecimales que se encuentran a partir de 00401CE0, si hacemos doble click en 1C podremos modificarlo en tiempo de ejecución presionando Patch Now!:


Otra forma un poco más rápida es hacer click derecho en un P-Code ubicado en el dessembler y seleccionar "Modify current opcode". esto nos llevará a Memory dump pero ya apuntando al address del P-Code.

String Refs: Nos muestras las referencias de textos que hay en el programa debuggeado:


API->Ctrl+B:Nos muestra una lista de API'S de Visual Basic, dándonos la posibilidad de colocar BP haciendo doble click:


*Para quitarlo debemos hacer 4 click's

Opcodes->Ctrl+O:Nos muestra una lista de P-Codes al igual que API

OnExecution->Ctrl+E:Nos muestra la lista de BP que ya están puestos y nos dá la posibilidad de Colocarlos también:


Para agregar algún BP se debe insertar el address en la parte inferior y luego presionar ADD

Trace Commands:


Como su nombre lo dice nos muestra los comandos que tenemos para tracear
Step Trace cumple el rol de F7 en OllyDBG
Trace Ret cumple el rol de Execute till return
Trace Over cumple el rol de F8 en OllyDBG
Go! cumple el rol de F9 en OllyDBG
Trace X nos da la posibilidad de tracear un número de P-Codes determinados

en la parte inferior podemos encontrar "Analize BranchX" este nos mostrará la lista de BranchT y BranchF que posee el programa a debuggear:


Ya familiarizados con WKTVBDE continuamos reverseando, vamos avanzando con F8 hasta encontrarnos en el siguiente P-Code:


Este Opcode se encarga obtener el serial introducido, a continuación encontramos 6C:
6C    5620 0B33 2          Push#4 [arg]

Encargado de pushear el serial, podemos corroborarlo si nos dirijimos en el dump al address a pushar:


Si continuamos traceando hasta 401D01:

Notaremos una comprobación entre 5 y 6, si miramos en el stack veremos de donde provienen:


Si continuamos traceando hasta 401D08 nos encontraremos con un BranchF=1C, WKTVBDE nos muestra al lado de él si saltará o no, en este caso NO:


Si nos fijamos al no saltar nos mostrará un mensaje que podemos ver en el address 00401D21

Por lo que deducimos que la anterior comparación fue el número de caracteres del nombre introducido con el mínimo permitido UND3R=5 con 6

Por lo que intentaremos modificar el salto para evitar la alerta, hacemos click derecho->Modify current opcode y cambiamos 1C por 1D que es el salto opuesto:


Presionamos F8 y veremos que saltará 00401D3F


*Si quisieramos saltar a otro lugar, podemos utilizar una excelente herramienta que trae P32Dasm llamada Jump calculator


Desgraciadamente P32Dasm trabaja con Offset Raw por lo que podría confundir de alguna forma. Para utilizarla debemos escribir el address en donde se encuentra el salto (Raw) y a continuación hacia que address saltará, en el costado izquierdo podremos seleccionar el tipo de salto.

Seguimos traceando, aquí toma nuestro nombre y lo pone en minúsculas:


Si seguimos traceando una gran serie de P-Code's nos detendremos en el siguiente salto:


Notaremos que si no salta nos llevará a un mensaje de que el serial es incorrecto, intentemos modificar el salto:


Ahora presionemos Go!->F5


II-CrackMe Chronos

Cargamos el crackme desde WKTVBDE


También lo cargamos desde exdec y buscamos referencias, una vez encontrada buscamos el primer Branch desde abajo hacia arriba:


Ahora introducimos un serial cualquiera y traceamos hasta llegar a 402B08, luego lo cambiamos por 1D y presionamos F5 o Go!:



III-nags1

Para eliminar una nag en algunos casos al igual que los serial debemos modificar los Branch, o en otros casos se debemos Nopear un P-Code, en el segundo caso no se pueden eliminar dejando un vacio por lo que siempre se debe reemplazar por otro P-Code, siempre y cuando, el otro ocupe el mismo espacio (número de parámetros)

Veamos un ejemplo a continuación:

Iniciamos nags1 para visualizar el nag a eliminar:



Cargamos nags1 con exedec:


Notaremos que es un rtcMsgBox ubicado en 401A2D. Vamos desde OllyDBG al address:
Veremos un P-Code con 4 bytes de parámetro, cambiemoslo por un push 0=05 00 00 00 00




Si damos RUN F9, notaremos que la nags ha desaparecido










UND3R
#215
Introducción al cracking de P-Code

Referencia:Capitulo 29 "Introducción al cracking desde 0" por Ricardo Narvaja

Siempre cuando realizamos un previo análisis del ejecutable que nos vamos a enfrentar, cuando sabemos que es un Visual Basic compilado en P-Code intentamos aludirlo
ya que toman su tiempo crackearlo, por eso el motivo de esta introducción, en esta primera parte nos enfocaremos en el capítulo 29 de Ricardo Narvaja, en la segunda entrega nos enfocaremos con más crackmes y empezaremos a utilizar el fomoso WKTVBDE.

Herramientas:
-WKTVBDE
-OllyDbg
-P32Dasm
-exdec

I-¿Qué es P-Code?
Cuando compilados un programa con VB, este nos da la posibilidad de elegir el tipo de compilado diferenciando entre código NATIVO y P-CODE:
el código nativo tiene la gran ventaja que ejecutan el código en la sección code del programa permitiendo esto que sea más "fácil" lograr saltar la seguridad, por otro lado el
P-CODE no posee código de ejecución dentro de la sección code. solo posee una serie de códigos llamados P-Code que son interpretados y ejecutados por la dll de Visual Basic, haciéndonos una tarea más difícil.

II-¿Como saber si es un P-Code?
Los P-Code tienen una grán característica y es el uso de la API: MethCallEngine

Cargamos Clave1 con OllyDBG:


Si subimos un poco veremos que se utiliza la API:


Otra forma de saber que es un P-Code, es el mal análisis de código que realiza OllyDBG a diferencia de un native, si bajamos un poco lo podremos notar:


III-Analizando P-Code con OllyDBG
Para analizar un P-Code bajo OllyDBG debemos usar paralelamente exdec o P32Dasm, estos programas se encargan de encontrar la lista de P-Codes de forma automática. La idea es entender como trabajan estos tipos de programas:

Como sabemos los programas compilados en P-Code no ejecutan su código en la sección code solo executan comandos P-Code's que son interpretados por la dll de Visual Basic por lo que nosotros nos basaremos de eso,encontrar los P-Code de manera manual.

Cargamos clave1.exe en OllyDBG y colocamos un BP en la API MethCallEngine:


Iniciamos el programa con F9 y veremos lo siguiente:


Introducimos un serial cualquiera:


Vemos que se detiene en el BP:


Presionamos Alt+M y colocamos un Memory breakpoint on access en la sección code


Presionamos F9 hasta que se detenga en la siguiente instrucción:

MOV AL,BYTE PTR DS:[ESI]


En este lugar es donde la dll lee el primer P-Code, si miramos arriba del dump veremos de donde proviene:



Comienzan en: 00401BD0, si nos dirigimos ahí desde el dump veremos los P-Code's y sus parámetros:



Presionemos F7,y EAX tomará el valor del primer P-Code:



luego si presionamos F7 nuevamente aumenta ESI, esto lo hace para que ESI apunte a los parámetros del P-Code 04:


Desgraciadamente no existe una lista de P-Code's oficiales pero de todas formas adjunto una.

Para hacernos una idea de que va hacer el programa buscamos el P-Code 04 en la lista:

04    567B 0B8E 2 1 2      Push arg

Osea lo que hará será pushear su argumento,veamos si esto es correcto, luego de INC ESI realiza un JMP:


Presionamos F7 y llegamos aca:


veremos el siguiente comando:MOVSX EAX,WORD PTR DS:[ESI]

"Copies the value of the source operand to the destination register
with the sign extended."

lo que hará será colocar el parámetro de ESI en EAX considerando el signo negativo:



Luego suma EAX con EBP pero EAX por causa del MOVSX quedó en negativo será una resta: FFFFFF74h equivale a -140 decimal(para corroborar se debe hacer doble click en EAX), si 140 lo pasamos a hexadecimal,nos da: 8C por lo que en resumen realizará lo siguiente -8C+0012F4E0:



luego de eso realiza un PUSH EAX:



con eso concluye el P-Code 04 luego de eso realiza un XOR EAX,EAX para limpiar EAX y vuelve a mover el siguiente P-Code a EAX que en este caso es 21:



Luego suma 3 a ESI para apuntar al parámetro del segundo P-Code:



Aquí mueve a EAX el contenido de 0012F4E8 y lo mueve a EAX, luego el contenido de 0012F4E8 que ahora se encuentra en EAX es movido a [EBP-4C] luego de esto realiza un XOR EAX,EAX nuevamente para limpiar EAX y tomar nuevamente el siguiente P-CODE

En resumen la dll realiza lo siguiente:
-Toma el valor de P-Code y lo mueve a EAX: MOV AL,BYTE PTR DS:[ESI]
-Incrementa ESI para apuntar al parámetro del P-Code
-Se dirige al parámetro y ejecuta la operación correspondiente
-Terminada la operación realiza un XOR EAX,EAX para limpiar el registro
-Vuelve nuevamente al primer paso

Todo este análisis manual se puede evitar como comenté anteriormente con programas como exdec o P32Dasm, abrimos exdec y nos aparecerá lo siguiente:



Nos vamos a File->disassemble Prog y elegimos clave1.exe y nos mostrará lo siguiente:



en donde el primer valor es el address(VA) del P-code,el segundo valor es el P-Code mismo, el tercer valor es el nombre del P-Code y el cuarto el parámetro.

Si recordamos el primer P-Code fue 4 y estaba ubicado en el address 401BD0 y lo que realizo fue pushear el valor de EBP-8C, por lo que el programa nos facilita considerablemente la localización de los P-Code junto con sus parámetros

*exdec solo está disponible en fase beta, imposibilitando guardar la lista de P-Code pero de todas formas sigue siendo una herramienta fundamental.

Si abrimos P32Dasm veremos lo parecido que son:


este programa está más avanzado y nos muestra los P-Code de una manera más visible ideal cuando son muchos, También nos facilita la búsqueda de referencias de strings o números:



IV-Crackeando con OllyDBG y exdec

Para crackear de manera básica debemos tener conocimientos de dos P-Codes

1)BranchF=1C
este P-Code es similar a un salto condicional, este salto se realiza si la comprobación anterior es falsa.

2)BranchT=1D
este P-Code es el opuesto a BranchF es decir, este salta cuando la comprobación es verdadera T=True F=false


Una vez entendido como trabajan los programas compilados en P-Code podemos empezar a trabajar, lo primero que haremos será cargar clave1.exe con exdec, bajamos hasta encontrar alguna referencia de texto que sea llamativa:



una vez encontrada la referencia, en este caso:
"Número incorrecto"

debemos subir hasta encontrar algún BranchT o un BranchF. los Branch=1E no los debemos considerar ya que son equivalentes a JMP, es decir saltos incondicionales:



Encontramos un BranchF en 401C2C que si no se cumple la comprobación anterior este saltará a 401C63 vayamos a esa address para ver hacia donde se ubiese dirigido:



Vemos que se dirige a "Número Correcto"

Cargamos clave1.exe desde OllyDBG y nos dirijimos desde el dump a 401C2C (Address del BranchF)



Notaremos que hay un 1C que es equivalente a BranchF, intentemos cambiarlo por BranchT que es 1D y guardamos los cambios:



Iniciamos clave1 modificado, introduzcamos un serial cualquiera y presionamos Registrar:



Nuestro serial es tomado como válido

En esta ocación trabajamos enfocados en OllyDBG, luego trataremos teorias con WKTVBDE,Hasta la Parte II




UND3R
#217
Software / [Descarga]VB Watch v2
7 Octubre 2011, 15:04 PM




CitarProfile, test, debug and add error handlers to Visual Basic 6.0.
Profiler: ensure test coverage and measure performance.
Protector: handle run-time errors.
Debugger: monitor running programs.

Descarga:http://download.aivosto.net/vbw2.zip

Raul100 me pidió que "crackeara"(reverseara) este programa, hace tiempo le hice un crack y hoy lo vengo a compartir con ustedes

http://www.mediafire.com/?f83x3e2cpmb3kf8


Saludos
#219
Ingeniería Inversa / duda con mov
6 Octubre 2011, 17:17 PM
hola tengo una duda, como puedo mover 66 C7 05 5B F0 45 00 EB 12  (9bytes con mov), solo conozco word y dword


Saludos
#220
Hola tengo la siguiente duda

si en memoria virtual tengo 150000 con size 3000 si quisiera dejarlo el address 150000 con size 4000 que parámetros debería pushear para llamar a realloc?

Gracias
#221
Ingeniería Inversa / API parecida a realloc
6 Octubre 2011, 01:48 AM
me gustaría saber de que manera un programa cambia el size de un address virtual como ej 150000 teniendo un size 6000 lo cambia a 7000

me dijeron que con la API realloc, pero esta la usa el programa pero no para cambiar el size del address 150000,existe otra api o forma?


Gracias
#222
Hola a todos, estoy intentando desempaquetar un programa, este tiene antidump,tengo la siguiente duda.

si voy a la Memoria del programa dumpeado veo lo siguiente:
Citar
Memory map
Address    Size       Owner      Section    Contains      Type   Access    Initial   Mapped as
00010000   00001000                                       Priv   RW        RW
00020000   00001000                                       Priv   RW        RW
0012C000   00001000                                       Priv   RW  Guar  RW
0012D000   00003000                         stack of mai  Priv   RW  Guar  RW
00130000   00003000                                       Map    R         R
00140000   00001000                                       Priv   RWE       RWE
00150000   00006000                                       Priv   RW        RW
00250000   00006000                                       Priv   RW        RW
00260000   00003000                                       Map    RW        RW
00270000   00016000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\unicode.nls
00290000   00041000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\locale.nls
002E0000   00041000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\sortkey.nls
00330000   00006000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\sorttbls.nls
00340000   00041000                                       Map    R         R
00390000   00001000                                       Priv   RW        RW
003A0000   00001000                                       Priv   RW        RW
003B0000   00004000                                       Priv   RW        RW

si veo el programa empaquetado veo lo siguiente:

CitarMemory map
Address    Size       Owner      Section    Contains      Type   Access    Initial   Mapped as
00010000   00001000                                       Priv   RW        RW
00020000   00001000                                       Priv   RW        RW
0012C000   00001000                                       Priv   RW  Guar  RW
0012D000   00003000                         stack of mai  Priv   RW  Guar  RW
00130000   00003000                                       Map    R         R
00140000   00001000                                       Priv   RWE       RWE
00150000   0000A000                                       Priv   RW        RW
00250000   00006000                                       Priv   RW        RW
00260000   00003000                                       Map    RW        RW
00270000   00016000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\unicode.nls
00290000   00041000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\locale.nls
002E0000   00041000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\sortkey.nls
00330000   00006000                                       Map    R         R         \Device\HarddiskVolume1\WINDOWS\system32\sorttbls.nls
00340000   00041000                                       Map    R         R
00390000   00001000                                       Priv   RW        RW
003A0000   00001000                                       Priv   RW        RW
003B0000   00005000                                       Priv   RW        RW

el problema surge que el dumpeado intenta acceder al address: 00157E78 que lógicamente no está en el dumpeado, por lo que investigando debo liberar tal sección en la memoria con VirtualFree y luego con VirtualAlloc crearla nuevamente pero con el size correspondiente, luego de eso injertar lo que falta, el problema es que se cita lo siguiente:

Citaren mi maquina la sección del
antidump empieza en 150000 y alli el sistema creo un heap y tiene valores
necesarios para correr el programa si solo borramos y copiamos lo del
antidump no correra


CitarThe VirtualFree function releases or decommits (or both) a region of pages within the virtual address space of the calling process.

BOOL VirtualFree(

    LPVOID lpAddress,   // address of region of committed pages 
    DWORD dwSize,   // size of region
    DWORD dwFreeType    // type of free operation
   );

CitarThe VirtualAlloc function reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero.

LPVOID VirtualAlloc(

    LPVOID lpAddress,   // address of region to reserve or commit 
    DWORD dwSize,   // size of region
    DWORD flAllocationType,   // type of allocation
    DWORD flProtect    // type of access protection
   );   

hago el siguiente injerto(aquí mi duda):

Citarpush 4000
push ???????
push 150000
call VirtualFree
nop
push 4
push 2000
push ??????
push 150000
call VirtualAlloc
nop
push 4
push 1000
push ??????
push 150000
call VirtualAlloc

(el injerto lo tomé del tutorial de ricardo narvaja)
el problema es el size no sé cuanto colocar, debido que no sé que es un heap y cuanto espacio debo colocar y por qué ese espacio, otra cosa es por que se hace dos llamados a VirtualAlloc con diferencia en el parámetro type of access protection

Si pudieran aclararme esas dudas de manera explicativa, se los agradecería demasiado,Saludos




#223
Ingeniería Inversa / Buscar comandos sin FINDCMD?
28 Septiembre 2011, 19:06 PM
existe otra forma de encontrar comandos?

Saludos
#224
Me surgió la duda de como obtener el OffsetRaw de manera manual, buscando en google todos recomendaban programas y siempre que se tocaba la palabra "fórmula o cálculo" venía con la palabra "no es necesaria por existen programas...", por eso se me ocurrió crear un script encargado de mostrar el offset raw, en la cabecera del script se puede apreciar detalladamente de forma explicativa y con ejemplos el cálculo para obtener offset raw

Los datos que entregan son:
offset RAW y la sección que corresponde el address buscado
para buscar se debe insertar el address en VA (Como lo muestra Ollydbg)

Código (asm) [Seleccionar]
/*
    -=================================================================-
                                                 
        Script realizado por :UND3R                                       
        Script para : Encontrar Offset RAW                                                                                             
        Fecha : 26/09/2011                                           
                                                                     
                    -=[ Comentario del Script ]=-
     Fórmula:
     RVA: Valor relativo en memoria (Relative Value Address)                                 
     VA: Valor absoluto en memoria (Value Absolute)                                                               
     RAW: Dirección en el disco
     
     -OllyDBG Nos muestra por defecto direciones de tipo VA
     VA(Value Absolute)=ImageBase+RVA     

     Ejemplo: 40101D=400000(ImageBase)+101D(RVA)
         
     -Si queremos saber el raw de un address ubicado en la cabezera PE (PE header)
     se debe restar address-ImageBase=RVA=RAW     

     Ejemplo: 400056(VA)-400000(ImageBase)=56h(RAW)   

     -Si queremos saber el raw de un address ubicado en una sección     
     se debe hacer lo siguiente:
     
     Obtener el RVA del addres:
     Address-ImageBase=RVA
     
     luego a RVA restarle los siguientes valores:     
     RVA-(VirtualAddress-PointerToRawData)=RAW     

     *VirtualAddress y PointerToRawData varían en cada sección

                                                                 
                                                                     
    -=================================================================-
*/
VAR NOM_SECCION
VAR VALOR
VAR HEADER
VAR CONTADOR_SEC
VAR VIRTUAL_ADDRESS
VAR VIRTUAL_SIZE
VAR N_SECCIONES
VAR MODULE_BASE
VAR PUNTERO_PE
INC CONTADOR_SEC //Incrementa CONTADOR_SEC en 1
PREGUNTAR:
ASK "Introduzca el address a calcular el Offset RAW"
MOV RESULTADO,$RESULT //Mueve el resultado a la variable RESULTADO
MOV VALOR,RESULTADO //Mueve RESULTADO a la variable VALOR
GMI eip,MODULEBASE //Obtiene la Base del módulo
MOV MODULE_BASE,$RESULT //Mueve el resultado a MODULE_BASE
MOV PUNTERO_PE,MODULE_BASE //Mueve la Base del módulo a la variable PUNTERO_PE
ADD PUNTERO_PE,3C //Suma 3C con PUNTERO_PE
MOV PUNTERO_PE,[PUNTERO_PE] //Mueve el contenido dentro de PUNTERO_PE a PUNTERO_PE
ADD PUNTERO_PE,MODULE_BASE  //Suma PUNTERO_PE con MODULE_BASE
MOV N_SECCIONES,PUNTERO_PE  //Mueve PUNTERO_PE a N_SECCIONES
ADD N_SECCIONES,6 //Suma N_SECCIONES con 6 para obtener el número de secciones
MOV N_SECCIONES,[N_SECCIONES],1 //Mueve el primer byte del contenido dentro de N_SECCIONES a N_SECCIONES
ADD PUNTERO_PE,F8 //Suma PUNTERO_PE con F8
MOV HEADER,PUNTERO_PE //Mueve PUNTERO_PE a la variable HEADER
ADD HEADER,C //Suma C a la variable HEADER
MOV HEADER,[HEADER] //Mueve lo que está dentro de HEADER a la variable HEADER
ADD HEADER,MODULE_BASE
CMP RESULTADO,MODULE_BASE //Compara si el valor introducido con el valor de la ImageBase
JB  ERROR_ADDRESS //Si el valor introducido es menor salta a ERROR_ADDRESS
CMP RESULTADO,HEADER //Compara el valor introducido con el inicio de la primera sección
JB CALCULAR_1 //Si el valor introducido es menor hará el cálculo correspondiente de un address ubicado en la sección PE header
BUCLE:          //Bucle encargado de buscar la sección que corresponde el valor introducido
ADD PUNTERO_PE,8
MOV VIRTUAL_SIZE,[PUNTERO_PE]
ADD PUNTERO_PE,4
MOV VIRTUAL_ADDRESS,[PUNTERO_PE]
ADD VIRTUAL_SIZE,VIRTUAL_ADDRESS
ADD VIRTUAL_SIZE,MODULE_BASE
SUB VIRTUAL_SIZE,1
CMP RESULTADO,VIRTUAL_SIZE
JB CALCULAR_2
CMP CONTADOR_SEC,N_SECCIONES
JA ERROR_ADDRESS
INC CONTADOR_SEC
ADD PUNTERO_PE,1C
JMP BUCLE
CALCULAR_1:     //Fórmula de address ubicada en PE header
SUB VALOR,MODULE_BASE
MOV NOM_SECCION,"PE header"
JMP SALIR
CALCULAR_2:  //Fórmula de address ubicada en una sección
ADD PUNTERO_PE,8
MOV NOM_SECCION,PUNTERO_PE
SUB NOM_SECCION,14
MOV NOM_SECCION,[NOM_SECCION],8
BUF NOM_SECCION
STR NOM_SECCION
LOG NOM_SECCION
MOV PUNTERO_PE,[PUNTERO_PE]
SUB VALOR,MODULE_BASE
SUB VIRTUAL_ADDRESS,PUNTERO_PE
SUB VALOR,VIRTUAL_ADDRESS
JMP SALIR
ERROR_ADDRESS:
MSG "ERROR:Address introducida incorrecta"
JMP PREGUNTAR
SALIR:
EVAL "VA:[{RESULTADO}]=Offset RAW:[{VALOR}h] sección:{NOM_SECCION}"
MSG $RESULT
ret


Saludos a Tinkipinki que nunca me hizo un reto, tomaré este script como reto ya que de forma indirecta lo hizo.
#225
Como puedo realizar una resta decimal con ollydbg, ya que el comando SUB lo hace de manera hexadecimal

Saludos