Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problemas al buscar un proceso (https://www.clubdelphi.com/foros/showthread.php?t=94837)

aguml 14-08-2020 14:26:23

Problemas al buscar un proceso
 
Hola amigos, estoy intentando crear un proceso suspendido, obtener su imagebase, y por último revivirlo. De momento tengo esto:
Código PHP:

#include <vcl.h>
#include <Windows.h>
#include <psapi.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
    : 
TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    
WideString path "";
    
wchar_t szProcessName[] = L"mi_proceso.exe";
    
WideString fullPath path szProcessName;
    
PROCESS_INFORMATION pi;
    
STARTUPINFO si;
    
HMODULE hMod;
    
DWORD cbNeeded=0;

    
ZeroMemory( &sisizeof(si) );
    
si.cb sizeof(si);
    
ZeroMemory( &pisizeof(pi) );

    
//Creo el proceso suspendido
    
CreateProcess(fullPath.c_bstr(), NULLNULLNULLFALSECREATE_SUSPENDEDNULLNULL, &si, &pi);

    
//Busco el proceso en la lista de procesos
    
if ( EnumProcessModulespi.hProcess, &hModsizeof(hMod), &cbNeeded) )
    {
        
GetModuleBaseNamepi.hProcesshModszProcessNamesizeof(szProcessName)/sizeof(wchar_t) );
    }
    
//Revivo el proceso
    
ResumeThread(pi.hThread);

    
//Libero el Handle
    
CloseHandle(pi.hProcess);


El caso es que cuando llego a EnumProcessModules nunca entra aunque mi proceso si está en la lista de procesos. ¿alguna ayuda para solucionarlo? Lo que necesito es obtener la ImageBase del proceso creado suspendido.

aguml 14-08-2020 17:31:03

Vale, he probado tanto CreateToolhelp32Snapshot como EnumProcessModules y ninguno de ellos me devuelve el modulo si el proceso se ha creado suspendido pero necesito crearlo suspendido. ¿No hay manera de obtener la imagebase de un proceso que creo suspendido? La unica manera que se me ocurre es con un Loader-Debugger pero no querria llegar a eso ya que solo necesito hacer una verificacion desde un proceso externo para comprobar que mi proceso no fue modificado en memoria.

aguml 18-08-2020 15:54:35

He conseguido que me funcione en x32 con esto:
Código PHP:

DWORD GetBaseAddressFromProcessHandle(HANDLE process_handle)
{
    
PROCESS_BASIC_INFORMATION pbi = {};
    
ULONG ulSize;
    
DWORD dwReturn=0;
    
SIZE_T nRead;
    
LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle,
          
ULONG ProcessInformationClassPVOID ProcessInformation,
          
ULONG ProcessInformationLengthPULONG ReturnLength);

    *(
FARPROC *) &NtQueryInformationProcess GetProcAddress(
        
LoadLibrary(L"ntdll"), "NtQueryInformationProcess");
    if (
NtQueryInformationProcess == NULL) {
        return 
0;
    }

    if(    
NtQueryInformationProcess != NULL &&
        
NtQueryInformationProcess(process_handle0, &pbisizeof(pbi), &ulSize) >= &&
        
ulSize == sizeof(pbi)) {

        
ReadProcessMemory(process_handle, ((PVOID)((DWORD)pbi.PebBaseAddress 0x8)), &dwReturnsizeof(dwReturn), &nRead);
        return 
dwReturn;
    }
    return 
0;


El caso que cogiendo el mismo codigo y usandolo para x64 con los minimos cambios no me funciona en x64:
Código PHP:

DWORD64 GetBaseAddressFromProcessHandle(HANDLE process_handle)
{
    
PROCESS_BASIC_INFORMATION pbi = {};
    
ULONG ulSize;
    
DWORD64 dwReturn=0;
    
SIZE_T nRead;
    
LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle,
          
ULONG ProcessInformationClassPVOID ProcessInformation,
          
ULONG ProcessInformationLengthPULONG ReturnLength);

    *(
FARPROC *) &NtQueryInformationProcess GetProcAddress(
        
LoadLibrary(L"ntdll"), "NtQueryInformationProcess");
    if (
NtQueryInformationProcess == NULL) {
        return 
0;
    }
    if(    
NtQueryInformationProcess != NULL &&
        
NtQueryInformationProcess(process_handle0, &pbisizeof(pbi), &ulSize) >= &&
        
ulSize == sizeof(pbi)) {

        
ReadProcessMemory(process_handle, ((PVOID)(pbi.PebBaseAddress 0x10)), &dwReturnsizeof(dwReturn), &nRead);
        return 
dwReturn;
    }
    return 
0;


Todo parece ir bien pero el valor que obtiene en dwReturn es 0.
¿Alguien me puede ayudar con esto?

dec 19-08-2020 12:09:29

Hola a todos,

Estaré diciendo una tontería: se me ocurre que la versión de Win64 retorne también un "DWORD" en lugar de un "DWORD64"... aunque seguramente sea una tontería o algo que ya hayas probado... en todo caso mantengo el hilo un poco vivo a ver si algún otro compañero puede echarte una mano.


La franja horaria es GMT +2. Ahora son las 09:19:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi