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ú

Mensajes - Иōҳ

#531
ASM / [Tuto]Inyección DLL – Full API
28 Enero 2010, 17:44 PM
[Tuto]Inyección DLL – Full API



Objetivo: Inyección DLL para el Buscaminas
Dificultad: Intermedio
Herramientas: RadASM, OllyDBG
Cracker: Nox
Fecha: 27/01/2010

Este tutorial tiene finestotalmente didácticos. No me responsabilizo por cómo se pueda utilizar elmismo.

IMPORTANTE: Cualquiertipo de error que encuentren en el tutorial, posteenlo. De esta maneraaprendemos todos.
IMPORTANTE: Se usarael IDE RadASM + MASM

Introducción:
Hola, bueno me anime a dareste tutorial para seguir la alineación de los tutoriales de vladek, [Tutorial]Iniciándomeen el hacking mediante inyección de DLL - Con ejercicio!
[/color]
, [TutorialC++] Lectura/Escritura de detos de una aplicación (externa) | Con ejercicio.

Siven el tiempo del post se darán cuenta que a pasado mucho tiempo y que no hizomas tutoriales a pesar de que dijo que si, conversando con el después de muchosmeses encontrado en línea me dijo que no haría mas tutoriales por motivo de su trabajo y de suestudio que ocupan todo su tiempo.

CitarEn que se llegue a hacer deforma estática.
Así es, el próximo tutorial será sobre eso.
Deberemos usar Offsets y buscar Punteros.
PD: En este tutorial no usamos un puntero, usamos una dirección de memoria.
Esa dirección de memoria tenía de valor "numero" (lo que valiera elnumero)
Los punteros tienen como valor una dirección de memoria.
No los confundas, sino luego se complica
Un saludo.   :P

Decidí seguir con el curso de sus tutoriales, pero antes de llegar a lo citado quiero volver a hacer untutorial de Inyección DLL, usando únicamente APIs.
Creo que los estoyaburriendo así que vamos al rollo.

Conocimientos previosbásicos requeridos:

Conocimiento Básico en ASM.
Conocimiento en Utilización del OllyDBG.

Software necesario:
OllyDBG

Buscaminas
RadASM+ MASM
Inyector

Comencemos:
1) Abriendo el Buscaminas
Un simple Juego deMicrosoft.

2) Abriendo el OllyDBG

3) A la Acción
Abierto el Buscaminas, enese momento vamos a el OllyDBG File>Attach>WinMine
Damos F9 (RUN)
Comencemos a jugar, ahoranos vamos a Memoria en la sección .data hacemos click derecho y ponemos un BPM on Write



¿Por que hacemos eso?
Aquí no tenemos ningún chico malo (Cartelito) por donde atacar, examines el juego... el tiempo corre :O, entonces ¿Dónde se almacena el tiempo?, ¡En la Memoria!, Ahora ya tenemos un sitio en donde atacar, así que nos dirigimos a ella Alt + M y en los módulos nos dice winmine (Lo vemos en la figura Anterior). Vemos esas partes y vemos diferentes secciones (Lo vemos en la figura Anterior), .text, .data, .rsrc, entro otros la mas importante que nosotros usaremos es la .data es en esta sección donde la mayoría de juegos guardan sus datos y es por aquí donde podemos empezar atacar.
Ponemos nuestro BPM on Write para que cuando quieran escribir en memoria pare.

4) Encontrando Addys
Nos dirigimos al disassembler y vemos que paro  



El OllyDBG nos muestra porque Memory Breakpoint When Writing to [0100579C], si recordemos nuestro BPM on Write, donde estamos:

01002FF5   FF05 9C570001    INC DWORD PTR DS:[100579C],
Bueno ahora nos vamos al DUMP Ctrl + G y escribimos esa dirección 100579C
Para ver que hay en esa dirección



Yo lo hago con la ayuda del OllyDBG, nos muestra DS[0100579C]=00000007
Y si vemos el Buscaminas el contador esta en 7, así que ya tenemos la dirección de nuestro contador creo que a todos se nos ocurre nopear esa sección y así nunca mas correrá el tiempo hagámoslo.
Ahora juguemos una partida, removemos el BPM on Write :S vemos que se queda en 1, pero nosotros queremos 0, bueno pues sabemos que en 100579C nos muestra el contador.
Para remover el BPM on Write hacemos,Click derecho BreackPoint >Remove memory BreakPoint
F9 (RUN)

Le Damos a la Carita, para empezar un nuevo juego, nos dirigimos al Dump Ctrl + G escribimos la direccion 100579C  y en el Byte donde veíamos el cambio le ponemos un Breakpoint > Hardware, on write > Byte, justo en el Byte de nuestro contador, en la direccion ya mencionada.


Ahora jugamos y vemos que para en la siguiente dirección 01003830, así que ya tenemos las dos direcciones donde debemos de nopear.

5) Estructura de una DLL:

Cito RVLCN:

.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
.code
Punto_de_Inicio proc hInstance: DWORD, reason:DWORD, rsrvd1:DWORD
mov eax,TRUE
ret
Punto_de_Inicio Endp
// Aquí se programara las funciones.
End Punto_de_Inicio
La estructura de la DLL es similar a un ejecutable, pero hay una diferencia, se
trata de que toda librería necesite un punto de inicio o de entrada como lo dicen
algunos, Es necesario darle un valor EAX como por ejemplo si es TRUE
queremos decir que la DLL se ha cargado correctamente y si pusié ramos
FALSE a EAX estaremos diciendo que se cargo incorrectamente.
Otra cosa que observamos es que la función Punto_de_Inicio tiene 3
parámetros:
hInstance.- Aquí encontramos el manejador de nuestra DLL (handle).
reason.- Este parámetro puede tomar 4 valores segú n la dirección del proceso:
DLL_PROCESS_ATTACH.- Se recibe este valor cuando se carga la librería en el proceso.
DLL_PROCESS_DETACH.- Se recibe este valor cuando se descarga la librería en el proceso.
DLL_THREAD_ATTACH.- Se recibe este valor cuando se crea un hilo de proceso.
DLL_THREAD_DETACH.- Se recibe este valor cuando se ha destruido el hilo del proceso.
rsrvd1.- Parámetro utilizado por windows, normalmente no se utiliza.

6) Creando nuestra DLL

Nos dirigimos al RadASM,  >Archivo>Nuevo Projecto>masm>Dll Project>None>
Elejimos las opciones ASM, Def, Back>Siguiente>Finalizar

Código (asm) [Seleccionar]
.386
.model flat, stdcall
option casemap :none
   
     include \masm32\include\windows.inc
     include \masm32\include\masm32.inc
     include \masm32\include\user32.inc
     include \masm32\include\kernel32.inc
     include \masm32\macros\macros.asm
     includelib \masm32\lib\masm32.lib
     includelib \masm32\lib\user32.lib
     includelib \masm32\lib\kernel32.lib
 
.data

Mensaje db "Inyeccion Completa",0
Titulo db "Programado by Nox"
OldBytes     db 6 dup(0) ; Esto crea 6 bites en la memoria con 0
Patch db 6 dup(90h) ; Esto crea 6 bytes en la memoria con NOP
;NameW db "Buscaminas",0

.data?
;bmhwnd dd ? ; hWnd del Buscaminas
ProcessId dd ? ; PID del Buscaminas
hProcess dd ? ; Handler del proceso del Buscaminas
OldProtect dd ? ; Protector antiguo del proceso del buscaminas

PatchWMine PROTO







.code
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
DllMain proc hInstance:HINSTANCE, dwReason:dword, lpvReserved:LPVOID

.IF dwReason == DLL_PROCESS_ATTACH

invoke MessageBox, NULL,addr Mensaje, addr Titulo,MB_OK + MB_ICONINFORMATION
invoke CreateThread, NULL, NULL, addr PatchWMine, NULL, NULL, NULL

.ELSEIF dwReason == DLL_PROCESS_DETACH
invoke ExitProcess, NULL

.ENDIF

ret

DllMain endp

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
PatchWMine proc


;invoke FindWindow,NULL,offset NameW ; Busca la ventana del Buscaminas
;mov bmhwnd,eax
invoke GetCurrentProcessId
mov ProcessId,eax ; Obtenemos el PID
;invoke GetWindowThreadProcessId,bmhwnd,offset ProcessId ; Busca el PID de esa ventana
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,ProcessId ; Y con ese PID abre el proceso
mov hProcess,eax

invoke VirtualProtectEx,hProcess,01002FF5h,6,PAGE_EXECUTE_READWRITE,offset OldProtect
invoke VirtualProtectEx,hProcess,01003830h,6,PAGE_EXECUTE_READWRITE,offset OldProtect
;Si Queremos Restablecer los Datos Usamos ReadProcessMemory, para guardarlo
;en una variable y d hay restablecerlo :
;invoke ReadProcessMemory,hProcess,01002FF5h,addr OldBytes,6,NULL
invoke WriteProcessMemory,hProcess,01002FF5h,addr Patch,6,NULL ;
invoke WriteProcessMemory,hProcess,01003830h,addr Patch,6,NULL ;  

ret

PatchWMine endp
;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
END DllMain


Bueno si ustedes comparan este code con el [Tutorial C++] Lectura/Escritura de detos de una aplicación (externa) | Con ejercicio.

Se usa las siguientes apis:

Cito:

Usé FindWindow para encontrar el handle de la ventana.
Luego GetWindowThreadProcessId para obtener el id del proceso.
Luego OpenProcess para obtener el handle del proceso.

Ahora nosotros no necesariamente necesitariamos el HWND, si no usar  HANDLE, asi que nos evitamos de usar FindWindow y GetWindowThreadProcessId, que al inyectarnos en su proceso podremos usar una API mas exacta en este caso, GetCurrentProccesId que nos devuelve el PID, la misma funcion que hace la API GetWindowThreadProcessId, y sin usar FindWindow.

Cita de: Eternal Idol en 22 Junio 2009, 19:53 PM
Un Handle es una referencia a un objeto, la diferencia que queria marcar es que normalmente un HANDLE es local (el HANDLE 0x10 puede ser un archivo o un evento al mismo tiempo en diferentes procesos) y un HWND es global (la ventana 0x2030 es identificada de tal manera en todo el S.O.), por lo que, yo al menos, lo relaciono mas bien con un identificador.

Si, HWND (Handle Window) es para ventanas; igual para las aplicaciones no son mas que numeros enteros (DWORDs en x86), los tipos se usan para mejorar la comprension del codigo.

a) Explicación de las APIs Usadas
GetCurrentProcessId

La función GetCurrentProcessId devuelve el identificador de proceso del proceso de llamada.

DWORD GetCurrentProcessId(VOID)  

Parameters

This function has no parameters.

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««


The OpenProcess function returns a handle of an existing process object.

HANDLE OpenProcess(

   DWORD dwDesiredAccess,   // Acceso al Flag
   BOOL bInheritHandle,   // Manejo del Handle  flag
   DWORD dwProcessId    // process identifier
  );   



Parameters

dwDesiredAccess

Especifica el acceso al objeto del proceso. Para los sistemas operativos que el control de seguridad de apoyo, este acceso está marcada en contra de cualquier descriptor de seguridad para el proceso de destino. Cualquier combinación de las banderas de acceso siguiente se puede especificar, además de las banderas de acceso STANDARD_RIGHTS_REQUIRED:

Access            Description
PROCESS_ALL_ACCESS   Especifica todas las banderas de acceso posible para el objeto del proceso.


;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

La función de los cambios VirtualProtectEx la protección de acceso en una región depáginas cometidos en el espacio de direcciones virtuales de un proceso determinado. Tenga en cuenta que esta función difiere de VirtualProtect, que cambia la protección de acceso en el proceso de llamada solamente.

BOOL VirtualProtectEx(

   HANDLE hProcess,   // handle del proceso
   LPVOID lpAddress,   // address of region of committed pages
   DWORD dwSize,   // size of region
   DWORD flNewProtect,   // desired access protection
   PDWORD lpflOldProtect    // address of variable to get old protection  
  );

Parameters

flNewProtect

PAGE_EXECUTE_READWRITE   

Permite ejecutar, leer, y escribir el acceso a la región.   

;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
La función de WriteProcessMemory escribe en memoria en un proceso determinado. Toda la zona que se  escriba debe ser accesible, o la operación fracasara.
BOOL WriteProcessMemory(

   HANDLE hProcess,   // handle del proceso cuyo proceso se escribe en
   LPVOID lpBaseAddress,   // address para empezar a escribir a
   LPVOID lpBuffer,   // puntero al  buffer para escribir data to
   DWORD nSize,   // number of bytes to write
   LPDWORD lpNumberOfBytesWritten    // actual number of bytes written
  );   
7) Finalizando

Bueno solo compilemos, e inyectemos


Funciona Perfecto, Hasta el Proximo Tutorial

Descargar Tuto.Doc
Descargar Proyecto

Pd: Cualquier duda, Posteenlo así nos ayudaremos todos :D
Pd2: Si alguien tiene info sobre DMA y Estáticas, me seria de mucha ayuda que pusieran el link aqui ?, necesito aclarar dudas para el próximo tutorial
#532
Cita de: cyberserver en  6 Diciembre 2009, 19:42 PM
EAEAAAAAAAA ese programa que me pasaste es lo que necesitava UUUU!!!! UUU!!!! esta padreeee y es muy funcional.

Si me lo decis a mi?

entoncs De nada!  ::)
#533
Cita de: L-EYER en  6 Diciembre 2009, 19:10 PM
no creo que puedas usar una funcion de un dll cuarquiera yo diria que tiene que estar compilada en jni el code fuente.

Saludos.

si se puede, :D

busca sobre dependencias exe, dll, ocx, sys, etc. ;), te diria algo ams pero recien estoy aprendiedo, a exportar las funciones de dll :P deseguro uno de los user te lo dira mejor ;)

http://www.dependencywalker.com/
#534
ASM / Re: [?]Incognitas, en assembler u.u
5 Diciembre 2009, 20:46 PM
Cita de: Eternal Idol en  5 Diciembre 2009, 02:29 AM
Es lo mismo, al menos en Windows:

cs=001b ss=0023  ds=0023  es=0023  fs=003b  gs=0000.

:O muxas gracias, pero deseo saber cuando es el momento indiciado de usarlos en un MOV o ADD, etc y cuando no es necesario? ya que e visto que lo usan y si lo usa, creo que cambia el resultado...  :silbar:
#535
Java / Re: Ayuda con java
5 Diciembre 2009, 20:44 PM
uhm la verdad no entiendo tu pregunta?? u_u, si pudieras ser mas explicito, yo cuando usaba el IDE de oracle -JDeveloper- me botaba error cuando no inicializaba las variables osea

lo que veo en tu codigo, en algunas de estas variables no le pones ningun valor y depende del IDE si es que pone uno por defecto o no.

int opcion, asiento[], autobus, i, numasiento=1,asientod;

int opautobus;


y segun lo que yo e programado deberia ser asi

int opcion=0, asiento[], autobus=0, i, numasiento=1,asientod=0;

int opautobus=0;


ahora tu me dices que no logras que lea el nombre ??, pero no veo ningun comando para que lo haga -No soy bueno en modo consola ya que nunca he programado solo en Frame y Apple-

lo unico que veo es System.out.println que es para imprimir.


#536
ASM / Re: [?]Incognitas, en assembler u.u
5 Diciembre 2009, 00:25 AM
Cita de: Yurix en  4 Diciembre 2009, 18:33 PM

Hola , yo simpre uso DS:  y como te explique para las operaciones con la pila uso SS:
Confieso que realmente no se cual puede "ser mejor"?

Saludos

si tu me dices que usas ds pero por que lo usas?, me dices que para las operaciones con la pila usas ss: bueno eso entiendo por que algo asi entendi viendo los tutes de narvaja cuando apuntaba a una direccion de pila usaba ese segmento, pero en fin debe tener una finalidad usar los segmentos en un MOV, ADD, etc, y es lo que deseo saber :), derepente el moderador de esta zona podria responder a mi pregunta :)
#537
ASM / Re: [?]Incognitas, en assembler u.u
4 Diciembre 2009, 18:29 PM
no es que el caso es que debe tener algun fin usar los segmentos en los MOV, ADD, etc, si yo uso FS para acceder a la TIB, ps me dio la curiosidad y la interrogante de por que ponian SS, DS, y segun lo que lei

CitarPoniendo ya un ejemplo de acceso con la instrucción ADD (sumar),
una forma de utilizarla sería "add eax,ds:[ebx]", que añadiría al registro EAX el contenido de la dirección de
memoria en el segmento DS y la dirección EBX.

ntoncs si tiene un fin bueno, too tiene un fin pero el usar el segmento "adecuado" es lo que quiero entender y aveces no tengo por q usar ningun segmento para algun mov, add, etc.
#538
ASM / [?]Incognitas, en assembler u.u
4 Diciembre 2009, 17:10 PM
Tengo varias preguntas

1.- Para que se usaria assume fs:nothing ?

2.- si no me equivoco se usaria el segmento -fs- para accesder a  TIB, mas especificamente en  fs:[0], pero es la unica utilidad que tiene ese segmento y el
  • por que iria?

    3.-
    En este codigo, teniendo en cuenta que ya tengo un contenido en los registros esi y edi

    mov     ecx, 0Eh                         
    cld                                             ; limpia el byte de dirección de la comparación
    repe    cmpsb                              ; compara [esi] con [edi] byte a byte
    jnz     Inicio


    3.1.-por que usaria cld?
    Se que limpia DF, pero no  entiendo segun lei es el que se
    usa para recorrer una cadena de manera ascendente o descendente en memoria.

    3.2.-
    Y el repe va decrementer ecx y comparando esi y edi ahora por que no tiene parametros ese

    repe    cmpsb   

    osea un destino y una fuente,
    segun lei vi esto:

    REPE/REPZ CMPS destino, fuente

    pero en ese codigo dan porsentado que va a comparar bit a bit [esi] y [edi]?

    4.-

    4.1.- Ahora sobre los segmentos aveces veo en el olly

    MOV DWORD PTR DS:[40207C],EAX

    eso significa que va a mover eax al contenido de memoria en 40207C y en el segmento ds?

    Y al revez

    add eax,ds:[ebx] , que añadiria el registro eax al contenido de direccion de memoria en el segmento DS Y la direccion EBX?

    4.2.-

    no solo Usan DS si no tmb SS

    eso si no entiendo

    MOV DWORD PTR SS:[40207C],EAX

    se que es stack segment ose el segmento de pila, y eso es todo pero no entiendo por que lo usan.

    4.3.- Ahora hay varios segmentos eso quiere decir que tmb se usan para hacer por ejemplo MOV o ADD, etc?

    algun ejemplito xD

    Disculpen por la molestia pero e estado buscando info pero nada concreto, u.u




#539
ASM / Re: Ayuda código de teclas
27 Noviembre 2009, 16:13 PM
Código (asm) [Seleccionar]
invoke Sleep, 100
invoke GetAsyncKeyState, VK_F1
cmp eax, 0
jz <ATUCODIGO>


aqui tenes una idea, de como podes usarlo :D

Una acotacion que compilador estas usando por que lo tuyo es de 16bits, y es obsoleto   :o
#540
Ingeniería Inversa / Re: no se por donde empezar
27 Noviembre 2009, 01:01 AM
www.ricardonarvaja.info/

Mas Exactamente

http://ricardonarvaja.info/WEB/INTRODUCCION%20AL%20CRACKING%20CON%20OLLYDBG%20DESDE%20CERO/

Introduccion al Cracking con el OllyDBG desde 0
48 tutes

Bytez ;)