elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
27 Mayo 2012, 17:46  


Tema destacado: Entra al canal IRC oficial de #elhacker.net

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking Avanzado (Moderadores: ANELKAOS, TRICKY)
| | |-+  Siguiendo con DLL Injection
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Siguiendo con DLL Injection  (Leído 2,624 veces)
Myth.ck


Desconectado Desconectado

Mensajes: 305


Algorithmics & C++ Studient


Ver Perfil
Siguiendo con DLL Injection
« en: 19 Abril 2009, 21:33 »

Creo que este es el verdadero subforo para publicar mis dudas
miren este es el nuevo code
Código:
#include "stdafx.h"
#include "Windows.h"

#define LIB_NAME "c:\testdll.dll"

int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwCalculatorProcId;
HANDLE hndCalculatorHandle;
HWND hdCalculator;
LPVOID lpLibNameSpace;
LPVOID lpLoadLib;

while ((hdCalculator = FindWindow(NULL, L"Calculator Plus")) == NULL)
{
Sleep(100);
}
printf("Found window\n");
GetWindowThreadProcessId(hdCalculator, &dwCalculatorProcId);
if ( (hndCalculatorHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwCalculatorProcId)) == NULL)
{
printf("Couldn't open process.\n");
return -1;
}
if ( (lpLoadLib = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA") ) == NULL)
{
printf("GetProcAddress() failed\n");
return -1;
}
if ( (lpLibNameSpace = (LPVOID)VirtualAllocEx(hndCalculatorHandle, NULL, strlen(LIB_NAME), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE) ) == NULL) {
printf("VirtualAllocEx failed\n");
return -1;
}
if ( (WriteProcessMemory(hndCalculatorHandle,(LPVOID)lpLibNameSpace, LIB_NAME, strlen(LIB_NAME), NULL)) == NULL)
{
printf("Write failed\n");
return -1;
}
CreateRemoteThread(hndCalculatorHandle, NULL, NULL, (LPTHREAD_START_ROUTINE)lpLoadLib, (LPVOID)lpLibNameSpace, NULL, NULL);CloseHandle(hndCalculatorHandle);
return 0;
}


Ahora me detecta el la ventana, pero me dice que no puede abrir el proceso :S

Alguna sugerencia...¿? Nuevamente mi dll, es la compilada de el Paper de Mazard, para que cuando se logre inyectar me aparezca mi textfile.
En línea

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.
ANELKAOS
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.049


#include<nda.h>


Ver Perfil WWW
Re: Siguiendo con DLL Injection
« Respuesta #1 en: 20 Abril 2009, 01:22 »

Existen una serie de buenas prácticas que ayudan a todos los programadores a leer y comprender de forma sencilla cualquier programa. Pero lo mejor, es que ayudan al propio programador que escribe un código a detectar errores y depurar sus propios códigos. Una de ellas es la de utilizar un solo return por cada función, en este caso has utilizado 5.

La función OpenProcess te devuelve NULL porque debes habilitar SeDebugPrivilege. De esta manera obtendrás el identificador PROCESS_ALL_ACCESS, si no, no puedes utilizar CreateRemoteThread.
En línea

Myth.ck


Desconectado Desconectado

Mensajes: 305


Algorithmics & C++ Studient


Ver Perfil
Re: Siguiendo con DLL Injection
« Respuesta #2 en: 20 Abril 2009, 01:34 »

La verdad que nunca he utilizado esa función :s estuve buscando y dan un ejemplo para nada agradable ya que lo que quiero es inyectar de manera simple una dll. Tu tienes un ejemplo acerca de esto?
En línea

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.
Myth.ck


Desconectado Desconectado

Mensajes: 305


Algorithmics & C++ Studient


Ver Perfil
Re: Siguiendo con DLL Injection
« Respuesta #3 en: 20 Abril 2009, 01:38 »

Tengo otra duda... La dll de Mazard, cuando logra inyectarse en un proceso, automaticamente crea el textfile?
En línea

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.
MazarD
Colaborador
***
Desconectado Desconectado

Mensajes: 880


mazard.info


Ver Perfil WWW
Re: Siguiendo con DLL Injection
« Respuesta #4 en: 20 Abril 2009, 22:25 »

Citar
Una de ellas es la de utilizar un solo return por cada función, en este caso has utilizado 5.
Estoy totalmente en contra de ese "buen habito", no te favorece en nada y atenta claramente a la legibilidad y claridad del código.

Un hilo interesante que leí hace tiempo sobre esto mismo, de stackoverflow:
http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement


Citar
La dll de Mazard, cuando logra inyectarse en un proceso, automaticamente crea el textfile?
Si.

Saludos.
En línea

-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net
Myth.ck


Desconectado Desconectado

Mensajes: 305


Algorithmics & C++ Studient


Ver Perfil
Re: Siguiendo con DLL Injection
« Respuesta #5 en: 29 Abril 2009, 01:59 »

Hola... He seguido trabajando... googleando, leyendo sobre el ****ing SE_DEBUG_NAME, que no tiene mucha documentación.

Ahora la cosa es que mis resultados son los correctos, el proceso se abre, pero la dll no comete su función que es la de hacer un log en un textfile. A que se puede deber esto? Compilo la dll con Dev C++, dll project, copio y pego el dllfile de Mazard :S...

He comprobado lamentablemente con if's mis funciones y en todas se devuelve true.

¿Alguna idea?
En línea

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.
Myth.ck


Desconectado Desconectado

Mensajes: 305


Algorithmics & C++ Studient


Ver Perfil
Re: Siguiendo con DLL Injection
« Respuesta #6 en: 1 Mayo 2009, 20:46 »

Lo he comprobado por todos los medios, la dll se carga, pero no está funcionando bien.

He revisado las dll en el proceso mencionado, y mi dll está entre ellos. Teóricamente al analizar DLL_PROCESS_ATTACH, tendría que cumplirse fopen, ya que el indicador DLL_PROCESS_ATTACH se envía cuando se carga un archivo DLL en el espacio de direcciones de un proceso. Pero no está evaluando tan cosa al parecer.

Mi duda es: Cuando mi injector carga la dll en el proceso, utilizando writeprocessmemory, directamente la dll tendría que crear mi fichero en c:\?.
En línea

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.
Myth.ck


Desconectado Desconectado

Mensajes: 305


Algorithmics & C++ Studient


Ver Perfil
Re: Siguiendo con DLL Injection
« Respuesta #7 en: 1 Mayo 2009, 23:33 »

Código:
#include "stdafx.h"
#include "Windows.h"

#define LIB_NAME "c:\\dllmain.dll"

int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwCalculatorProcId;
HANDLE hndCalculatorHandle;
HWND hdCalculator;
LPVOID lpLibNameSpace;
LPVOID lpLoadLib;
HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
while ((hdCalculator = FindWindow(NULL, L"Calculator Plus")) == NULL)
{
Sleep(100);
}
GetWindowThreadProcessId(hdCalculator, &dwCalculatorProcId);
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, 0, &tkp, sizeof(tkp), NULL, NULL);
}
if ( (hndCalculatorHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwCalculatorProcId)) == NULL)
{
printf("Couldn't open process.\n");
return -1;
}
if ( (lpLoadLib = (LPVOID)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA") ) == NULL)
{
printf("GetProcAddress() failed\n");
return -1;
}
if ( (lpLibNameSpace = (LPVOID)VirtualAllocEx(hndCalculatorHandle, NULL, strlen(LIB_NAME), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE) ) == NULL) {
printf("VirtualAllocEx failed\n");
return -1;
}
if ( (WriteProcessMemory(hndCalculatorHandle,(LPVOID)lpLibNameSpace, LIB_NAME, strlen(LIB_NAME), NULL)) == NULL)
{
printf("Write failed\n");
return -1;
}
CreateRemoteThread(hndCalculatorHandle, NULL, NULL, (LPTHREAD_START_ROUTINE)lpLoadLib, (LPVOID)lpLibNameSpace, NULL, NULL);CloseHandle(hndCalculatorHandle);
return 0;
}

Y la dll a inyectar

Código:
#include <windows.h>
HANDLE ThreadHandle;
DWORD threadId = 0;

DWORD WINAPI my_thread(void *par);

BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
    switch (reason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL,"Se ha inyectado la dll","CEvent",MB_OK);
        ThreadHandle = CreateThread(0, 0x1000, &my_thread, 0, 0, &threadId);
        break;
       
    case DLL_PROCESS_DETACH:
        break;
       
    case DLL_THREAD_ATTACH:
        break;
       
    case DLL_THREAD_DETACH:
        break;
    }
   
    return TRUE;
}

DWORD WINAPI my_thread(void *par)
{
    while(true)
    {
        MessageBox(NULL,"Se ha inyectado la dll","CEvent",MB_OK);
        Sleep(1000);
    }
}
En línea

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.
Myth.ck


Desconectado Desconectado

Mensajes: 305


Algorithmics & C++ Studient


Ver Perfil
Re: Siguiendo con DLL Injection
« Respuesta #8 en: 2 Mayo 2009, 22:51 »

Problema resuelto... El error estaba en el archivo de cabecera de la dll...

Muchas gracias "Karman" por aclararme mi dudas!
                       "ANELKAOS" por la recomendación de SE_DEBUG_NAME
                       "Mazard" por tus tutos ; )


Salu2!
« Última modificación: 2 Mayo 2009, 23:16 por (v)ythc|< » En línea

Un intelectual es un hombre que usa más palabras de las necesarias para decir más cosas de las que sabe.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines