Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-08-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 14-08-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 18-08-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
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?
Responder Con Cita
  #4  
Antiguo 19-08-2020
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas al asignar privilegios a mi proceso aguml C++ Builder 8 11-05-2020 23:33:55
Problemas con CloseHandle y atacheo de proceso aguml C++ Builder 3 07-05-2020 15:04:01
Problemas para buscar - Locate ekstase MySQL 5 20-10-2010 01:42:24
Problemas al buscar alias Max_E. Conexión con bases de datos 11 13-10-2006 23:37:42


La franja horaria es GMT +2. Ahora son las 00:58:59.


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
Copyright 1996-2007 Club Delphi