Tema destacado: Entra al canal IRC oficial de #elhacker.net
Autor
|
Tema: Siguiendo con DLL Injection (Leído 2,624 veces)
|
Myth.ck
Desconectado
Mensajes: 305
Algorithmics & C++ Studient
|
Creo que este es el verdadero subforo para publicar mis dudas miren este es el nuevo code #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
|
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
Mensajes: 305
Algorithmics & C++ Studient
|
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
Mensajes: 305
Algorithmics & C++ Studient
|
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
|
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-statementLa dll de Mazard, cuando logra inyectarse en un proceso, automaticamente crea el textfile? Si. Saludos.
|
|
|
|
|
En línea
|
|
|
|
Myth.ck
Desconectado
Mensajes: 305
Algorithmics & C++ Studient
|
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
Mensajes: 305
Algorithmics & C++ Studient
|
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
Mensajes: 305
Algorithmics & C++ Studient
|
#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 #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
Mensajes: 305
Algorithmics & C++ Studient
|
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.
|
|
|
|
|