Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Nipx4215,

¡Bienvenido al Club Delphi!

Nelson.
Responder Con Cita
  #2  
Antiguo 01-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Nipx4215,

Cita:
Empezado por Nipx4215
...Como saber si la aplicación fue ejecutada desde Delphi...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, TlHelp32, PsAPI;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function GetParentProcess(PID : DWORD) : String;
var
   SnapShot : THandle;
   ProcessEntry32 : TProcessEntry32;
   PPID : DWORD;
   PPHandle : THandle;
   PPPath : PChar;

begin

   SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   GetMem(PPPath, MAX_PATH);

   if SnapShot <> INVALID_HANDLE_VALUE then
   begin
      ProcessEntry32.dwSize := SizeOf(ProcessEntry32);
      if Process32First(SnapShot, ProcessEntry32) then
      repeat
         if ProcessEntry32.th32ProcessID = PID then
         begin
            PPID := ProcessEntry32.th32ParentProcessID;
            PPHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False,PPID);
            if PPHandle <> 0 then
            begin
               GetModuleFileNameEx(PPHandle, 0, PPPath, MAX_PATH);
               Result := PPPath;
            end
            else
               Result := EmptyStr;
            CloseHandle(PPHandle);
            Break;
         end;
      until not Process32Next(SnapShot, ProcessEntry32);
      CloseHandle(SnapShot);
   end;

   FreeMem(PPPath);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   MessageDlg(GetParentProcess(GetCurrentProcessId),mtInformation,[mbOK],0);
end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Obtiene la ruta y nombre del proceso padre de la aplicación lo cual permite determinar desde donde fue ejecutada la misma, como se muestra en la siguiente imagen:



Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 02-07-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Resisa también este tema: Saber si la aplicación fue ejecutada desde Delphi

Saludos.
Responder Con Cita
  #4  
Antiguo 02-07-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Aclaración: Ese código, funciona en Win8.1

Saludos.
Responder Con Cita
  #5  
Antiguo 02-07-2015
Nipx4215 Nipx4215 is offline
Miembro
NULL
 
Registrado: jul 2015
Posts: 12
Poder: 0
Nipx4215 Va por buen camino
Gracias por sus respuestas.

Cuando abrimos un programa con doble click el que lo lanza es el explorer.exe y con el código que mencionan se puede checar que no sea lanzado de otra aplicacion, con una simple verificacion del P.I.D. del proceso padre. El problema es que a partir de Windows vista hay unas nuevas apis que permiten indicarle al proceso lanzado cual es tu proceso padre
Cita:
Ver esta web que lo explica mas claro : Launching a non-child process
Ejemplo, alguien puede crear algo que llamaremos "programa1" y con OpenProces abrir el explorer.exe para a su vez aplicarle los atributos y lanzar una nueva aplicación que llamaremos "programa2" indicando que su procesopadre es el explorer.exe, cuando en realidad es el "programa1". Lo anterior compromete la seguridad del "programa2" aunque protejamos nuestra aplicacion, porque con el "programa1" pueden modificar nuestro código en memoria.

Espero haberme explicado, ya que pretendo detectar esto cuando ha sido lanzado mi "programa2" por "programa1" y cuando en realidad por el explorer, algun rastro debe quedar de ello

Última edición por nlsgarcia fecha: 02-07-2015 a las 02:25:50. Razón: Formato Link
Responder Con Cita
  #6  
Antiguo 02-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Nipx4215,

Cita:
Empezado por Nipx4215
...pretendo detectar...cuando ha sido lanzado mi "programa2" por "programa1" y cuando en realidad por el explorer...


Pregunto : ¿Revisastes el código sugerido en el Msg #3?, en dicho mensaje se muestra desde conde se ha lanzado la aplicación.

Espero sea útil

Nelson.
Responder Con Cita
  #7  
Antiguo 02-07-2015
Nipx4215 Nipx4215 is offline
Miembro
NULL
 
Registrado: jul 2015
Posts: 12
Poder: 0
Nipx4215 Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
Nipx4215,




Pregunto : ¿Revisastes el código sugerido en el Msg #3?, en dicho mensaje se muestra desde conde se ha lanzado la aplicación.

Espero sea útil

Nelson.

Si Gracias, desafortunadamente solo funciona en WIndows 32 bits


Edito: Perdón, me confundí el que estoy seguro que no va en 64 bits es "TH32CS_SNAPMODULE" , checaré con TH32CS_SNAPPROCESS
Responder Con Cita
  #8  
Antiguo 03-07-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por Nipx4215 Ver Mensaje
...Cuando abrimos un programa con doble click el que lo lanza es el explorer.exe y con el código que mencionan se puede checar que no sea lanzado de otra aplicacion, con una simple verificacion del P.I.D. del proceso padre. El problema es que a partir de Windows vista hay unas nuevas apis que permiten indicarle al proceso lanzado cual es tu proceso padre...
Nipx4215, tienes razón. EXTENDED_STARTUPINFO_PRESENT permite en Win Vista y posteriores saltarse el UAC y ejecutar un proceso "engañando" atribuyéndolo a otro proceso padre falso.
La bandera EXTENDED_STARTUPINFO_PRESENT fuerza el uso de una estructura como esta:
Código Delphi [-]
  STARTUPINFOEX = packed record
    StartupInfo: TStartupInfo;
    lpAttributeList: PPROC_THREAD_ATTRIBUTE_LIST;
  end;
  PSTARTUPINFOEX = ^STARTUPINFOEX;

y con las APIs InitializeProcThreadAttributeList y UpdateProcThreadAttribute Crear la lista de atributos (atributo PROC_THREAD_ATTRIBUTE_PARENT_PROCESS) que permitirá a CreateProcess engañar al sistema.

He escrito una pequeña aplicación que permite realizarlo, he contrastado el código de cHackAll y el aportado por nlsgarcia, ninguno encuentra el verdadero padre del proceso hijo.
Hasta el momento no he encontrado el antídoto, aclarar que el ProcessExplorer de Sysinternals también es engañado.
Código Delphi [-]
const
  EXTENDED_STARTUPINFO_PRESENT = $00080000;
  PROC_THREAD_ATTRIBUTE_PARENT_PROCESS = $00020000;

type
  PPROC_THREAD_ATTRIBUTE_LIST = Pointer;

  STARTUPINFOEX = packed record
    StartupInfo: TStartupInfo;
    lpAttributeList: PPROC_THREAD_ATTRIBUTE_LIST;
  end;
  PSTARTUPINFOEX = ^STARTUPINFOEX;

  function InitializeProcThreadAttributeList(lpAttributeList: PPROC_THREAD_ATTRIBUTE_LIST;
                                             dwAttributeCount, dwFlags: DWORD;
                                             var lpSize: Cardinal): Boolean; stdcall; external 'kernel32.dll';

  function UpdateProcThreadAttribute(lpAttributeList: PPROC_THREAD_ATTRIBUTE_LIST;
                                     dwFlags, Attribute: DWORD;
                                     var pValue: DWORD;
                                     cbSize: Cardinal;
                                     pPreviousValue: Pointer;
                                     pReturnSize: PCardinal): BOOL; stdcall; external 'kernel32.dll';

  procedure DeleteProcThreadAttributeList(lpAttributeList: PPROC_THREAD_ATTRIBUTE_LIST); stdcall; external 'Kernel32.dll';

function GetProcessId(FileName: String): DWORD;
var
   proc: TProcessEntry32;
   hSysSnapshot: THandle;
begin
   proc.dwSize := SizeOf(TProcessEntry32);
   hSysSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   if (hSysSnapshot <> INVALID_HANDLE_VALUE) and Process32First(hSysSnapshot, proc) then
   begin
     repeat
       if String(proc.szExeFile) = FileName then
       begin
         Result:= proc.th32ProcessID;
         break;
       end;
     until not (Process32Next(hSysSnapshot, proc));
   end;
   CloseHandle(hSysSnapshot);
end;

function CeateChildProcess(ExeName, ParentProcess: string): BOOL;
var
  pi: TProcessInformation;
  si: STARTUPINFOEX;
  Size: Cardinal;
  hParent: Cardinal;
begin
  Result:= false;

  FillChar(si, SizeOf(si), 0);
  si.StartupInfo.cb := sizeof(si);
  FillChar(pi, sizeof(pi), 0);
      
  Size := 0;
  InitializeProcThreadAttributeList(nil, 1, 0, Size);
  si.lpAttributeList:= HeapAlloc(GetProcessHeap(), 0, Size);
  InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, Size);
  hParent := OpenProcess(PROCESS_ALL_ACCESS, False, GetProcessID(ParentProcess));
  UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, hParent, sizeof(hParent), nil, nil);

  if CreateProcess(nil, PChar(ExeName), nil, nil, False, EXTENDED_STARTUPINFO_PRESENT, nil, nil, (PSTARTUPINFO(@si))^, pi) then
  begin
    Result:= true;
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  end;

  DeleteProcThreadAttributeList(si.lpAttributeList);
  HeapFree(GetProcessHeap(), 0, si.lpAttributeList);
end;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  CeateChildProcess(Edit1.Text, 'Explorer.exe');
end;

Subo un binario compilado para pruebas, he elegido que el padre sea Explorer.exe porque es lo más habitual en procesos de escritorio: ExecuteWithParent

Cita:
Empezado por Nipx4215 Ver Mensaje
...Lo anterior compromete la seguridad del "programa2" aunque protejamos nuestra aplicacion, porque con el "programa1" pueden modificar nuestro código en memoria...
En realidad un proceso puede modificar la memoria de otro, independientemente de quién lo haya creado. Pero si pretendes basar una protección de algún componente en el hecho de que se ejecute o no desde el IDE, quizás estés en un apuro, a no ser que exista una solución al problema de encontrar el verdadero padre de la criatura. De todas formas ten en cuenta que siempre se podrá encontrar un antídoto para dicha protección.


Saludos.

Última edición por nlsgarcia fecha: 05-07-2015 a las 02:57:03. Razón: Formateo código
Responder Con Cita
  #9  
Antiguo 03-07-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Se me olvidaba un detalle importante, el código anterior no funciona si se ejecuta desde el IDE, una vez compilado debe ser ejecutado desde el mismo explorer.


Saludos.
Responder Con Cita
  #10  
Antiguo 03-07-2015
Nipx4215 Nipx4215 is offline
Miembro
NULL
 
Registrado: jul 2015
Posts: 12
Poder: 0
Nipx4215 Va por buen camino
Gracias a ambos, sigo haciendo pruebas

@escafandra solo que debe ser explorer.exe en lugar de Explorer.exe porque si no falla

tambien hay una manera mas fiable de encontrar al explorer real, porque explorer puede haber muchos que no son precisamente explorer, digamos abrir con openprocess el proceso padre de ExecuteWithParent.exe y automáticamente sería el explorer

sigo investigando, les cuento si encuentro algo
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Saber si la aplicación fue ejecutada desde Delphi aeff API de Windows 16 13-11-2008 00:37:18
Aplicacion en Delphi 6 ejecutada por Internet canelita Internet 1 10-07-2008 16:29:07
Cómo cerrar otra aplicacion desde mi aplicacion en Delphi 7 Gaby123 API de Windows 5 04-01-2007 22:44:51
¿Cómo puedo saber desde mi aplicación cuándo se abre por primera vez? nuri Varios 7 21-07-2005 14:07:51
Detectar aplicacion a ser ejecutada. anitra_cattivo API de Windows 7 05-11-2004 18:52:41


La franja horaria es GMT +2. Ahora son las 01:52:20.


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