Archive

Posts Tagged ‘Reversing Engineering’

Cambio de resistencia en la placa de un hdd quemado.

October 9th, 2010 No comments

Bueno, como nueva entrega…

Se quemo mi hdd, salio humo y todo…

Como se ve en la imagen… en el cirulo rojo estaba la resistencia quemada…

En el cuadrado azul… una resistencia parecida a la quemada…

Procedi a medir las otras resistencias con el tester, dandome 3 valores diferentes…

Probando e investigando un poco… La resistencia con valor de 150 ohm fue la utilizada.

Quedando asi:

Cosa que funciono.

Les comento que mi objetivo fue recuperar los datos de mi disco duro sin gastar mucho, sin enviar a tecnicos careros.

Los datos fueron recuperados y el disco duro no tuvo mas problemas, continuo funcionando perfectamente.

Les dejo el procedimiento, y mas imagenes en el siguiente .pdf

Reparación-Cambio de resistencia quemada de Disco Duro

Espero que les sea util!

convert this post to pdf.

Tutorial Trainer para DrugLord 2.2 by Krozmic

May 2nd, 2010 No comments
Bueno… este es mi primer tute… y no se como empezar… jeje vamos por partes no?
Imagen del juego:
Este es el juego… para que vean que no es un juego de esos en 3d y que tiene todos los chiches…este es así a lo sencillo…
El juego trata de ser vendedor de drogas… Un juego al estilo Oferta – Demanda… compras droga barata y lo vendes cuando sea cara…
Bueno.. como yo siempre lo juego y mi hermano también.. sabemos bien como funciona… el juego solo tiene 55 días máximo de juego… Para los que piensen.. NO es una protección de tiempo…es 55 días juego…
Como les decía.. quisimos jugar mas días.. tener mas dinero para comprar droga… y tener mayor capacidad para almacenar dicha droga…
Me dije.. “Hummm aprendería mas sobre el reversing haciendo esto…. y AHHH también aprendí a programar… Pues bueno.. Intentemoslo…”
Y ahora lo intentaremos…

BUSCANDO DATOS IMPORTANTES…
Bueno.. ahí les señale lo que necesitamos… “Day: 2/30” , “Cash: 434” y “Your pants pocket (2/10)”
Como ven ya jugue dos dias… gaste mi dinero para comprar el “Pot” y en “Your pants…” tengo mis dos unidades, kilos, bolsas o lo que sea de Pot…
Si.. ya lo tenemos todo…

– ACLARACIONES o OBSERVACIONES…
Esto les muestro porque se como va el juego.. y para aclarar cualquier duda…
El juego tiene unos rankings… subis de ranking cuando ya tienes 1.000.000 de dolares etc etc y te da 5 dias mas de juego, te aumenta la capacidad y todo lo demas…aquí les dejo los rankings… que nos ayudaran para despues….
Ranks
You can have one of six ranks at any give time:

Wannabe
Cash Required: $0
Carrying Capacity: 10 units
Container: pants pocket

Small-time Operator
Cash Required: $5,000
Carrying Capacity: 25 units
Container: coat

Dealer
Cash Required: $40,000
Carrying Capacity: 100 units
Container: black Trans Am

Big-Time Dealer
Cash Required: $300,000
Carrying Capacity: 600 units
Container: converted milk truck

Distributer
Cash Required: $2,500,000
Carrying Capacity: 3,500 units
Container: warehouse

Drug Lord
Cash Required: $15,000,000
Carrying Capacity: 20,000 units
Container: island paradise

Ya…. Bueno ahora que viene…
Ah cierto.. debugear el juego…

EL DEBUG DEL JUEGO….
Primero primero lo escaneamos con el RDG…
Bueno dice archivo sospechoso y bla bla.. no me interesa…
Pero no hay nada de packer y todo eso…
Depuremolo de una vez…
caemos aquí…
que le hago, que le hago.. si no se entiende un huevo…
Hey cierto… ver los text string y si no hay nada las apis comunes que siempre usamos…
Text String Primero:
huuuuuuuuuuuuu… millones… seguro hay alguno que nos sirve…
y seguro que hay millones de apis…
pero se me ocurrio algo…. en dias decia… “Day:1/30”
intentemos buscando la constante 30 en el debug.. en hexa es igual a “1E”
Click derecho sobre el debug > search for > Constant..
le ponemos el 30 en decimal o el 1E en hexa… Aceptamos
y paramos en….
Y si.. no me digan nada.. ahi tenemos una api… pero llegamos de otra forma… asique
EXPERIENCIA+1
Sigamos….
Ponemos una Bp sobre PUSH 1E… damos run… paramos de vuelta…
Traceamos un poco… y llegamos 00406011 MOV DWORD PTR DS:[42AD74],1E
osea que mueve los “30” a esa pocicion de memoria…
Ven…
bueno… para probar podriamos, no se.. modificar ese byte… por otro para probar si sale mas dias….entonces…
y cambia 1E por FF… que son…255…
damos run y nos fijamos…
y si.. son 255 dias…volvemos a donde estabamos y anotamos la posición de la memoria donde esta alojado el 1E…
[0042AD74]
Bien… ya tenemos los dias…
Ahora el cash…
Bueno cuando empezamos el juego.. tenemos 1,990 dolares y una deuda de 1,150…lo de la deuda lo dejamos… total cuando tengamos 1millon de dolares ni vamos a sentir esa deuda..jiji
Ahora.. como procedemos…
Lo que podriamos hacer es… poner un Bp en SendDlgItemMessageA y buscar y buscar hasta encontrar el indicado… Asi como lo hice yo… pero ya me olvide… asique eso lo pueden hacer ustedes…
bueno… la verdad que no me acuerdo de donde estaba, como y porque…
pero encontre que el primer cash que se agrega es 2,000 dolares y no 1,990.. seguro que es por los
impuestos, gasto por el carne de vendedor de drogas.. que se yo…
lo que si que cuando vimos donde se movia los dias a la memoria… mas abajito este el del cash…
si ven.. dice… 00406044 MOV DWORD PTR DS:[42ACE0],7D0
mueve 7D0 que son los 2000$ a esa pocicion de la memoria…
probamos de vuelta…
vemos en la memoria… osea en el dump y vemos
ahi esta el 7D0 alrevez… (Odio que siempre lo ponga al revez..me marea. y peor si estoy con resaca)
bueno ya saben como modificar los bytes… agarramos los dos y ponemo fill con FF`s si salio tiene que aver FF FF
pero cuanto dinero seria esto… para saber claro si salio o no… calculadora y son… 65.535 $
damos run y miramos el cash…
y practicamente nos faltan los 10$… pero no me importa.. a mi por lo menos 10$ en el juego no me interesa… si voy a ser rico…
bueno… ya sabemos que hacer… anotar la pocicion de la memoria donde esta alojado el cash…[42ACE0]
ya tenemos el cash.. luego le agregaremos lo que queremos de dinero…
Ahora lo que mas cuesta… la capacidad…
como vieron al comienzo donde estaban los rankings… se ve que hay 6 tipos de capacidades…

Wannabe
Carrying Capacity: 10 units
Small-time Operator
Carrying Capacity: 25 units
Dealer
Carrying Capacity: 100 units
Big-Time Dealer
Carrying Capacity: 600 units
Distributer
Carrying Capacity: 3,500 units
Drug Lord
Carrying Capacity: 20,000 units

y bueno.. si le modificamos al comienzo.. una capacidad de 10unidades por una capacidad de 15000unidades cuando subamos de ranking tendremos de vuelta 25 unidades de capacidad y asi sucesivamente… osea que hay que pescarlos a todos y modificarlos…
bueno… no me van a creer pero me olvide tambien como llegue ahi… haremos algo rapidito….
si tienen el GREATISWINDOWSE… pues ejecutenlo…
ejecutemos el juego tambien…
y veamos…
Bueno si tenemos el windowse y el druglord abiertos ponemos nuestro cursor sobre el (0/10) de Your pants pocket y nos fijamos en el windowse donde dice..
Control ID 000001FB
nos acordamos del numero  ese y cerramos el windowse y el juego…abrimos de vuelta el juego con el Olly y damos click derecho> search for> constant y ponemos lo del control id que vimos recien….
y el olly nos tira aquí…
si ven … un chiqui mas arriba dice ASCII “Your %s (%d%d)”… osea que es eso.. y que estamos muy muy cerca….
que tal si le ponemos unas Bp un poco mas arriba para tracear….
lo pueden poner en 00402998 MOV EBX,EAX
dan run.. y paran y tracean…
Llegamos a 004029CA el primer Bp de la imagen de arriba…. compara EBX con una dato de que
esa direccion…
que es un 0A… osea 10decimal… que es nuestra primera capacidad.
Pero bueno traceamos un poco mas y llegamos al segundo Bp de la imagen de arriba… el 00402A0E y vemos que mueve el 0A que esta en la direccion de la memoria a EAX…
nos fijamos en el esa direccion el el dump y modificamos el 0A por FF para ver si cambia o no…
ya saben como se hace.. y no lo repetire… no pega copiar y pegar imagenes…. aparte ya lo tienen que saber a estas alturas…
bueno… ya le modificamos por los FF y damos run para mironear…
Y si.. ahi estan los 255 que era el FF que modificamos…
volvemos…. anotamos la direccion… 004230F0
como les dije.. ahora falta pescar a las otras 5 capacidades…
dejamos los Bp como estan… ahora a jugar para pescarlos…
(pero si hay que dominar el juego para subir de ranking… algo mas facil???)
bueno.. ya que anotaron donde estaba alojado el cash.. vamos a modificarlo de entrada para que los rankings pasen rapido…
reiniciamos el olly…
hacemos goto a 00406044 donde ingresaba el 2000$
y modificamos el D0 07 del dump por haber humm… para el ranking de druglord necesitamos
15.000.000 de $
asique… le agregaremos 20.000.000 de $
bueno.. 20millones en hexa es … 1312D00
y como les dije que me marea ponerlo alrevez… me programe un programita que te da la vuelta los
numeros (litle endian-big endian) para que los escribas en el dump…
Ahi lo tenemos… me automatice el problema… asique le modificamos al D0 07 por 00 2D 31 01
queda entonces asi..
y bueno Bp puestos… dinero puesto.. damos run y vemos que tenemos 19millones y pico…
ahora le damos en STAY HERE y nos para el olly…
nos fijamos que capacidad esta pasando…
volvemos a dar run… STAY HERE … para… miramos… run.. STAY HERE … para… miramos…hasta que tengamos estos valores

Carrying Capacity: 10 units este ya lo tenemos el 0A en hexa
Small-time Operator
Carrying Capacity: 25 units este es 19 en hexa
Dealer
Carrying Capacity: 100 units este es 64 en hexa
Big-Time Dealer
Carrying Capacity: 600 units este es 258 en hexa
Distributer
Carrying Capacity: 3,500 units este es DAC en hexa
Drug Lord
Carrying Capacity: 20,000 units este es 4E20 en hexa

esos valores en hex tienen que pescar… y anotar en que direccion de memoria estan…
yo les pongo aquí debajo…

el capacidad 25 esta en 423118 “19″
el capacidad 100 esta en 423140 “64″
el capacidad 600 esta en 423168 “258″
el capacidad 3500 esta en 423190 “DAC”
el capacidad 20000 esta en 4231B8 “4E20″

ya tenemos todo…

- RECOMPILACION DE NUEVOS DATOS

Dirección de donde se aloja los días [42AD74]
Dirección de donde se aloja el cash [42ACE0]
Dirección de donde se aloja la capacidad 10 decimal 0A hexa [4230F0]
Dirección de donde se aloja la capacidad 25 decimal 19 hexa [423118]
Dirección de donde se aloja la capacidad 100 decimal 64 hexa [423140]
Dirección de donde se aloja la capacidad 600 decimal 258 hexa [423168]
Dirección de donde se aloja la capacidad 3500 decimal DAC hexa [423190]
Dirección de donde se aloja la capacidad 20000 decimal 4E20 hexa [4231B8]

ya esta todo…
ahora…

- PROGRAMACION DEL TRAINER
Les dejo el código fuente en la capeta porque si les pego aquí se hará un caos.. y ustedes entenderán menos…
asique fíjense en la carpeta…
el código fuente tiene comentarios para que vean…
también les dejo en la carpeta el programita ese que da vuelta los números para ponerlo en el dump..
para los mas newies claro.. porque el resto de ustedes la dominan todo…

Con esto me voy despidiendo…

Bajar fuentes, complementos y juego:

OllydumpFORMAT druglord DrugLTrainer

convert this post to pdf.

Análisis de Bifrost v1.2 Exhaustivo Parte #1

June 19th, 2009 1 comment
Ya llevaba la idea desde hace tiempo y de momento sale la parte #1… el archivo adjunto contiene:

Bifrost_core.dll” -> .DLL con cabecera reparada y descomprimida (de UPX), y tabla IAT arreglada que contiene el núcleo del troyano.

PE_Header.Bifrost_core.txt” -> Copia de la Información del PE Header de la librería que se crea en memoria.

Server.exe_INFECTED” -> Servidor que se ha analizado (Infectado, aunque no conecta a ningún lado).

En ésta parte se ve solamente hasta lo que es extraer la .dll de la memoria, en la segunda parte haré el análisis Estático con IDA (que tengo casi terminado) y escribiré el funcionamiento sobre como se Instala en el SO, Protocolos de comunicación, Desinstalación y Contra-Ataques que se puedan hacer…

Si hay alguien que le interese saber como reparé la .dll una vez volcada que me escriba al privado y haré una Parte III o un Anexo.

Download:

Password: “crackslatinos”
AbsshA@disidents.com
http://abssha.blogspot.com
convert this post to pdf.

Lockless X-Lock Crackme #1 – (Old Session 2002)

June 14th, 2009 No comments

En la lección de este mes, les traigo un amigable crackme, que según el autor (  y con razón) es un tutorial, si lo desensamblamos, así que les pegaré el código y eso es todo… jeje , era broma, lo iremos descubriendo de a poco, y aprenderemos juntos. ;)

Nos encontramos con una protección que no habíamos analizado aun, esta proteccion, es parecida a las utilizadas en los keymes, donde necesitamos un fichero clave para que el programa este registrado, este fichero clave contiene ciertas caracteristicas muy importantes que hacen, que se este registrado o no.

Bueno, este crackme no es un keyme, pero al principio actua como un keyme, nada mas que chequea un par de cosillas distintas, que ya veremos.

Reglas de Juego

Cuando ejecutamos el Crackme , tenemos en la pantalla principal de este, dos botones, y a la izquierda de estos, dos labels, que dicen Shareware y Unregistered.

Miremos en el boton About/Rules, donde nos dice, que hay tres caminos para crackear el crackme, y luego como les comente al principio del articulo, si lo desensamblamos, este crackme, es un tutorial por si mismo, tenemos permitido usar desensamblador y parchear; y por ultimo dice que si somos mejores con SoftIce, lo hagamos con SoftIce, pero nosotros no usaremos SoftIce, usaremos Olly Debugger, asi que no lo desensamblaremos, ni lo parchearemos fisicamente, solo en memoria.

Un poco de teoría

Desensamblemos el crackme, y veremos la pantalla principal de debugger, con el codigo ensamblador mostrandonos como es nuestra victima, debo decirles, que es un poco enradada, pero no nos asusteis, esta todo controlado…

Comenzamos en la dirección 401000, con un recibimiento poco comun en los crackmes (lo he  visto en algunos programas y juegos comerciales, y bastantes nuevos), nada mas ni nada menos que un “Hi Reverser”,

¿ pero quien es el reverser aquí ?, SI! Nosotros, o eso creo….

Luego otro PUSH ( que lo que hace es cargar con una direccion de memoria la cual apuna al string, el string propiamente dicho) que nos dice “Here Starts the test for the Versión” (Aquí empieza el chequeo por la versión).

Nueve instrucciones mas abajo encontramos otro texto que es PUSHeado a la memoria diciendo: “Here end the test for the Versión” (Aquí termina el chequeo por la verision).

Con razon el creador dijo que esto era un tutorial, miren, si nos marca el sector donde hace el chequeo para decirnos si esta registrado o no el programa, nosotros debemos conseguir que en esos dos labels que hay al ejecutarlo en la pantalla principal diga que esta registrado.

Bien, veamos que podemos hacer aquí tenemos lo siguiente:

principalcrackme

En la direccion 0040100B  , la instrucción MOV [DWORD DS:40300C],1 y en la direccion 00401015 , la instrucción MOV [DWORD DS:403008],1 ;  analicemos para que sirven y porque las nombro de entre todas las demas, ¿ ustedes piensan que tienen coronita ? pues no, no la tienen, o de algun modo si… :)

Los dos MOV’s mueven un 1 en decimal, a dos direcciones de memoria diferentes…. Anotemos la direccion 403008.

Más abajo en la dirección 00401021 , tenemos la instruccion  LEA EAX,[DWORD DS:403010], que carga el valor que esta en la zona de memoria 403010 a  EAX, y luego la instrucción de la direccion 00401029 que nos dice:

captura1reg1deverdad

CMP EAX,X-LOCK~1.00403012

captura1reg2deverdad

Luego viene nuestro push querido indicandonos el fin del programa, un pop eax, y un salto JE, que nos lleva  a la direccion 401040….

Algo muy notorio

Muy bien, ¿que es lo notorio?, ese salto a 401040 nos lleva a continuar el flujo del programa normalmente, ¿pero que sucede si este salto no se realiza?, veamos:

00401036   MOV [DWORD DS:403008],0

¿Pero que sucede aquí?, en 403008, la que yo les dije que recordaran , pone un 0!!!, ¿porque? Sigamos mirando y deduzcamos si ese 0 es necesario para estar registrados o no…

chequeaeaxpor1

Mas adelante en el programa , carga la ventana principal, en la direccion 401077 chequea , por si se ha clickeado un boton, y si es asi, pregunta cual de ellos, etc, etc. Esta rutina es comun en todos los programas, ya que es la rutina principal que chequea por cada opcion, o boton , si fue presionado o no, y en caso afirmativo se deriva el flujo del programa a la direccion correspondiente a la accion solicitada por el usuario.

Lo bueno comienza en la direccion 0040109D, donde nos encontramos el push identico, al primero que vimos en la apertura del programa desensamblado, y unas lineas de codigo mas abajo el otro push que nos indica que finaliza la seccion de registro, tal cual en el principio.

¿ Se acuerdan de los mirror checks que yo les habia explicado en articulos anteriores ?, bien, aquí lo tienen, la proteccion se repite en dos zonas de memoria distintas, o sea, que si nosotros parcheamos solamente la primera, o encontramos la segunda y parcheamos solamente esta, la otra seguira actuando normalmente y no nos dejara el programa registrado, por supuesto todo esto depende de cómo el programa este implementado, porque en nuestro caso, con modificar el segundo chequeo , nuestro crackme ya esta completamente funcional.

Fijense que en la direccion 0040109D vuelve a hacer lo mismo que antes.

Carga en EAX, lo que contiene la direccion 403010 y lo compara con lo que hay en la direccion 403012, si no llegan a ser iguales en la direccion 004010AD salta a la direccion 004010B9, pero la instrucción MOV [DWORD DS:40300C],0 de la linea anterior no es ejecutada, si se produce el salto, pero miren atentamente moveria un 0 decimal a la direccion 40300C, es otra zona!, es un doble chequeo, pero chequea dos zonas distintas de memoria, miremos mas,

miremos mas….. :)

redireccion

En la direccion 004010A2  tenemos un  LEA EAX,[DWORD DS:403010], 403010 tiene un 31 en hexa (1 en decimal), lo que al compararlo en 4010A8 con el valor de 00403012 que contiene un 30 en decimal (0 en decimal), hara que no salte y entonces el mov de la direccion 004010AF pondra a 40300C en  0 y no estaremos registrados.

A partir de la direccion de memoria 4010E6 hasta 4010EE tenemos lo siguiente:

MOV EAX,[DWORD DS:403008]   ;  mueve lo que contiene 403008 a EAX

CMP EAX,1 ; lo compara con 1

JNZ SHORT X-LOCK~1.00401105 ; y luego si no es igual salta a 401105

Mas abajo miremos, las strings cargadas…

004010F6  |. 50             PUSH EAX                                 ; /Text => “Fullversion”

00401115  |. 50             PUSH EAX                                 ; /Text => “Registered”

Necesitamos que estas strings se carguen, para que nuestro crackme funcione correctamente!!!, pero como podemos hacerlo??? Bien, el salto de la direccion 4010EE no nos lleva a poder ejecutar esas strings, por lo menos la de Fullversion no, pero sin embargo salta a una direccion anterior a la de la string “Registered”, salta a 401105, y “Registered”, esta en 401115, o sea que algo debe haber en el medio..  >: \

Perfecto, en la dirección 401105 tenemos lo mismo que en la direccion 4010E6 nada mas que el MOV EAX,[DWORD DS:403008]  , cambia por MOV EAX,[DWORD DS:40300C]  , aquí sucede lo mismo que antes, si no se cumple la misma condicion, o sea en la direccion 40300C no esta el valor 1 decimal, tampoco carga la string “Registered”, y nuestro programa no estaria ni completo (Fullversion) ni registrado (Registered).

poneeditsregistrado

Alternativas de Cracking:

Hay muchas alternativas, para hacer que nuestro pequeño funcione, podemos modificar los saltos de las direcciones 401034 y 4010EE, entonces como los valores de las direccion 403008 y 40300C seran 0 saltara, y nos hara registrar, simplemente cambiar los JNZ por JZ y listo, o sino por JMP y estos se transformaran en saltos INcondicionales, o sea, no importa si son iguales o no los valores, el salto se realiza igual.

Otra alternativa mas “elite”, y menos sucia que cambiar saltos y forzar el flujo del programa, es modificar la instrucción LEA de la direccion 00401021  , donde mueve lo que contiene 403010 a EAX, como lo que contiene 403010 es un 1 en decimal, siempre no saltara y nos pondra en 403008 el valor 0 con lo que no estaremos registrados nunca, entonces ¿por cual valor podemos moficar el operando de la instrucción LEA? Por una direccion de memoria como por ejemplo 403012, que contiene 0, entonces cuando llegue al CMP EAX, 403012, simplemente comparara el valor que contiene 403012 con el que contiene 403012, ¿resultado?, se produce el salto, y asi nuestro soldadito atrapado en  403008 (el 1), seguira vivo y no sera machacado….

Otra alternativa seria cambiar el CMP EAX,403012 por 403010, ya que, sera lo mismo, nada mas que en 403010 hay un 1 y no un 0 decimal como en 403012.

Luego en 004010A2 podemos modificar la instrucción LEA , por 403012, o inclusive podemos hacer un MOV EAX,0  y seria suficiente porque 403012 contiene un 0 decimal, y debemos hacer que el salto se produzca, y como el salto se produce cuando son iguales, pues ya lo tenemos ;)

Tambien podemos modificar el CMP, como en la zona de chequeo anterior o el salto JNZ.

Triunfadores:

Hemos  triunfado de nuevo, como podemos ver, nos aparece una ventanita, diciendonos, que hemos craqueado exitosamente el crakme, y que esperemos el segundo que sera mas difícil de crackear, ¿lo sera? Quizas si…. Quizas no….

¡Hasta la próxima!

convert this post to pdf.