Título: [Tuto]Inyección DLL – Full API Publicado por: Иōҳ en 28 Enero 2010, 17:44 pm [Tuto]Inyección DLL – Full API (http://i46.tinypic.com/2nst7hs.jpg) 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! (http://foro.elhacker.net/programacion_cc/tutorialiniciandome_en_el_hacking_mediante_inyeccion_de_dll_con_ejercici-t258750.0.html;msg1256444#msg1256444) [/color], [TutorialC++] Lectura/Escritura de detos de una aplicación (externa) | Con ejercicio. (http://foro.elhacker.net/programacion_cc/tutoc_lecturaescritura_de_datos_de_una_aplicacion_externa_con_ejercicio-t258994.0.html) 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. Citar En 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 (http://www.ollydbg.de/odbg110.zip) Buscaminas RadASM+ MASM (http://ricardonarvaja.info/WEB/OTROS/DE%20LA%20LISTA%20MASM32-RADSM/HERRAMIENTAS/RadASM.rar) Inyector (http://www.sendspace.com/file/ghiowi) 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(http://i45.tinypic.com/wu54pi.png) Damos F9 (RUN) Comencemos a jugar, ahoranos vamos a Memoria en la sección .data hacemos click derecho y ponemos un BPM on Write (http://i46.tinypic.com/27xdu1z.png) ¿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 (http://i46.tinypic.com/157zlsi.png) 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 (http://i45.tinypic.com/2hwguhx.png) 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. (http://i46.tinypic.com/9k563n.png) 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
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. Un Handle (http://en.wikipedia.org/wiki/Handle_(computing)) 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 (http://i47.tinypic.com/1rvwuh.png) Funciona Perfecto, Hasta el Proximo Tutorial Descargar Tuto.Doc (http://www.sendspace.com/file/3h82hj) Descargar Proyecto (http://www.sendspace.com/file/0cul2v) 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 Título: Re: [Tuto]Inyección DLL – Full API Publicado por: Amerikano|Cls en 28 Enero 2010, 20:45 pm Muy bueno que compartas este tipo de info. Sigue asi ;-)
Título: Re: [Tuto]Inyección DLL – Full API Publicado por: YST en 30 Enero 2010, 00:32 am Felicitaciones muy bueno :P
Título: Re: [Tuto]Inyección DLL – Full API Publicado por: [Zero] en 30 Enero 2010, 00:46 am Me gustó :).
Saludos Título: Re: [Tuto]Inyección DLL – Full API Publicado por: Иōҳ en 30 Enero 2010, 21:01 pm me da gusto que les guste, el tuto.... a personas que mas saben del tema :) xD
:) |