Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 26-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Sigo indagando sobre este asunto, y al margen de haber visto componentes para Delphi (dwinlock) y que por cierto ya cita roman en alguno de sus hilos, así como las librerías de Mathias Rauen que alivian mucho código, básicamente todo se basa en el famoso código GINA, pero hay un concepto que no acabo de entender...
¿Es posible que la tan afamada clase "SAS Window class" sea encontrada por FindWindow cuando el código ha sido inyectado?
Quiero decir que bajo XP y en circunstancias normales, y sin inyectar nada, esa clase no la encuentro por ningún lado... con lo cual hacerle un SetWindowLong lo veo difícil a simple vista.
¿seaone, sabes algo de este asunto?
Por cierto, el código traducido a Delphi, se puede encontrar en la web de Liu Yang LYSoft.
Solamente hay que inyectar la Dll propuesta, pero sigo con la duda de esa clase...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO

Última edición por ArdiIIa fecha: 26-02-2007 a las 14:00:39.
Responder Con Cita
  #22  
Antiguo 26-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
No la encuentras porque se encuentra en un escritorio diferente. FindWindows solo encuentra las ventanas que están en el mismo escritorio que la aplicación que la llama. Así que antes de nada tenemos que meternos en el mismo escritorio que la ventana en cuestión.

Eso es lo que intento en el primer código que puse, con las funciones SetProcessWindowStation y SetThreadDesktop. Una vez estamos en el mismo escritorio ya podemos interactuar con la ventana famosa.

De todas formas, si no estoy equivocado, cuando inyectas código dentro de otro proceso, este pasa a formar parte del el, es decir, pasa a tener el mismo escritorio y los mismo permisos. Así que una vez inyectado el código no tendríamos ningún problema en localizar la ventana, sin necesidad de andar saltando de un escritorio a otro.
Responder Con Cita
  #23  
Antiguo 26-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por seoane
De todas formas, si no estoy equivocado, cuando inyectas código dentro de otro proceso, este pasa a formar parte del el...
Si eso tiene su lógica, pero el tema de "otro escritorio", es difícil de asumir... ya por curiosidad más que por conseguirlo (que visto lo visto es posible), estoy mirando por "Undocumented Windows" a ver si me aclaro con estos conceptos...

Vale, parece que no es una cuestión nada indocumentada...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO

Última edición por ArdiIIa fecha: 26-02-2007 a las 14:22:20.
Responder Con Cita
  #24  
Antiguo 26-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por seoane
cuando se pulsa Ctrl+Alt+Sup windows manda el mensaje WM_HOTKEY a una ventana del proceso winlogon.exe. Pues bien, hasta ahora he conseguido estar en el mismo desktop que esa ventana
Pues he estado haciendo varias pruebas y no hay manera de obtener un handle bueno en:
Código Delphi [-]
Desktop:= OpenDesktop('Winlogon', 0, FALSE, MAXIMUM_ALLOWED);
Con diferentes parámetros e incluso ejecutándolo como servicio, siempre Desktop me devuelve CERO, con lo cual, la jodi** clase SAS.. no la voy a ver nunca...

Al menos ya me he aclarado un poco con el tema de los desktop y para verlo con mis propios ojos he encontrado este código que es muy ilustrativo y sencillo:
Código Delphi [-]
//Hace falta un treeview
//CODIGO OBTENIDO DE: http://www.delphipraxis.net/topic23721.html

function EnumDesktopProc(lpszDesktop:LPTSTR;lParam:LPARAM):Boolean; stdcall;
Var Clase : Array[0..200] of char;
begin
Form1.Treeview1.Items.AddChild(Form1.Treeview1.Items.Item[lParam],lpszDesktop).AbsoluteIndex;
result:=true;
end;

function EnumWindowStationProc(lpszWindowStation:LPTSTR; lParam:LPARAM): Boolean; stdcall;
begin
EnumDesktops(OpenWindowStation(lpszWindowStation,false,GENERIC_READ),@EnumDesktopProc,Form1.Treeview  1.Items.AddChild(Form1.Treeview1.Items.Item[lParam],lpszWindowStation).AbsoluteIndex);
result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Treeview1.Items.Clear;
EnumWindowStations(@EnumWindowStationProc,Treeview1.Items.AddChildFirst(nil,'PC').AbsoluteIndex);
Treeview1.FullExpand;
end;
Al final, a mí también me aburre el tema, así que dejo de curiosear, me parece demasiado esfuerzo para tan poca cosa... De hecho hay componentes y Dll GINA para meter mano al asunto, si se me diera el caso de necesitarlo, retomaría el asunto... pero lo dudo...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #25  
Antiguo 26-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por ArdiIIa
De hecho hay componentes y Dll GINA para meter mano al asunto
Exactamente, ¿a qué te refieres con GINA? Ya antes había mencionado el código de GINA, pero GINA es una dll integrada con Windows. He visto en alguna parte (creo que en el SDK de Windows) algunos "esqueletos" para hacer reemplazos de GINA pero no sé si es eso a lo que te refieres.

// Saludos
Responder Con Cita
  #26  
Antiguo 26-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por roman
He visto en alguna parte (creo que en el SDK de Windows) algunos "esqueletos" para hacer reemplazos de GINA pero no sé si es eso a lo que te refieres.
Exacto... hay variedad... y cantidad...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #27  
Antiguo 26-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Bueno, pues al final parece que sale bien inyectando código. Aquí os dejo el código, lo acabo de hacer así que esta un poco "sucio", pero creo que debe de funcionar bien.

Por una parte tenemos una dll, que es la que vamos a inyectar en el winlogon. Esta librería se inyecta sola , exporta dos funciones Inject y Eject, la primera inyecta la dll en el winlogon y la segunda la vuelve a sacar. La dll por su parte, una vez que detecta que ha sido inyectada, sustituye el bucle de mensajes de la ventana "SAS window" e intercepta el mensaje WM_HOTKEY.

Código de la librería:
Código Delphi [-]
library Injection; 

uses
  Windows, Sysutils, Messages, Psapi;

const
  strTarget = '\winlogon.exe';
  strWindowName = 'SAS window';
  strWindowClass = 'SAS window class';

var
  Injected: Boolean;
  ModuleHandle: DWORD;
  WindowHandle: THandle;
  OldWindowProc: Pointer;

function WindowProc(hWnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM):
  LRESULT; stdcall;
begin
  if (Msg = WM_HOTKEY) then
    Result:= 0
  else
    Result:= CallWindowProc(OldWindowProc,hWnd,Msg,WParam,lParam);
end;

// Ajustamos los privilegios
function EnablePrivilege(PrivilegeName: PChar; Enable: Boolean): Boolean;
var
  hToken: THandle;
  Tp: TOKEN_PRIVILEGES;
  Luid: TLargeInteger;
begin
  Result:= FALSE;
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY or TOKEN_READ, hToken) then
    if LookupPrivilegeValue(nil,PrivilegeName,Luid) then
    begin
      Tp.PrivilegeCount:= 1;
      Tp.Privileges[0].Luid:= Luid;
      if Enable then
        Tp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED
      else
        Tp.Privileges[0].Attributes:= 0;
      Result:= AdjustTokenPrivileges(hToken,FALSE,Tp,0,nil,PDWORD(nil)^);
      CloseHandle(hToken);
    end;
end;

procedure Inject(LibPath: PChar); stdcall;
var
  Procesos: array[1..1024] of DWORD;
  Needed, i: DWORD;
  Process, Thread: THandle;
  ModName, Target: array[0..MAX_PATH] of Char;
  RemLibPath: PChar;
begin
  if ModuleHandle = 0 then
    if EnablePrivilege('SeDebugPrivilege', TRUE) then
    begin
      FillChar(Target,Sizeof(Target),#0);
      GetSystemDirectory(@Target,Sizeof(Target)-1);
      StrLCat(Target,strTarget,Sizeof(Target)-1);
      if EnumProcesses(@Procesos, SizeOf(Procesos), Needed ) then
      begin
        for i:= 1 to (Needed div Sizeof(DWORD)) do
        begin
          Process := OpenProcess(PROCESS_ALL_ACCESS, FALSE,Procesos[i]);
          if Process <> 0 then
          begin
            if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1) > 0  then
            begin
              if AnsiStrPos(ModName,Target) <> nil then
              begin
                RemLibPath:= VirtualAllocEx(Process, nil,StrLen(LibPath)+1,
                  MEM_COMMIT, PAGE_READWRITE);
                if RemLibPath <> nil then
                begin
                  if WriteProcessMemory(Process, RemLibPath, LibPath,
                    StrLen(LibPath),PDWORD(nil)^) then
                  begin
                    Thread:= CreateRemoteThread(Process, nil, 0,
                      GetProcAddress(GetModuleHandle('Kernel32'),'LoadLibraryA'),
                      RemLibPath, 0, PDWORD(nil)^);
                    if Thread <> 0 then
                    begin
                      WaitForSingleObject(Thread,INFINITE );
                      GetExitCodeThread(Thread,ModuleHandle);
                      CloseHandle(Thread);
                    end;
                  end;
                  VirtualFreeEx(Process,RemLibPath,StrLen(LibPath)+1,MEM_RELEASE);
                end;
              end;
            end;
            CloseHandle(Process);
          end;
        end;
      end;
      EnablePrivilege('SeDebugPrivilege', FALSE);
    end;
end;

procedure Eject; stdcall;
var
  Procesos: array[1..1024] of DWORD;
  Needed, i: DWORD;
  Process, Thread: THandle;
  ModName, Target: array[0..MAX_PATH] of Char;
begin
  if ModuleHandle <> 0 then  
    if EnablePrivilege('SeDebugPrivilege', TRUE) then
    begin
      FillChar(Target,Sizeof(Target),#0);
      GetSystemDirectory(@Target,Sizeof(Target)-1);
      StrLCat(Target,strTarget,Sizeof(Target)-1);
      if EnumProcesses(@Procesos,SizeOf(Procesos),Needed) then
      begin
        for i:= 1 to (Needed div Sizeof(DWORD)) do
        begin
          Process := OpenProcess(PROCESS_ALL_ACCESS, FALSE,Procesos[i]);
          if Process <> 0 then
          begin
            if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1)>0  then
            begin
              if AnsiStrPos(ModName,Target) <> nil then
              begin
                Thread:= CreateRemoteThread(Process, nil, 0,
                  GetProcAddress(GetModuleHandle('Kernel32'),'FreeLibrary'),
                  Pointer(ModuleHandle), 0, PDWORD(nil)^);
                if Thread <> 0 then
                begin
                  WaitForSingleObject(Thread,INFINITE );
                  CloseHandle(Thread);
                  ModuleHandle:= 0;
                end;
              end;
            end;
            CloseHandle(Process);
          end;
        end;
      end;
      EnablePrivilege('SeDebugPrivilege', FALSE);
    end;
end;

procedure ProcessAttach; stdcall;
var
  Process: THandle;
  ModName: array[0..MAX_PATH] of Char;
  Target: array[0..MAX_PATH] of Char;
begin
  Injected:= FALSE;
  ModuleHandle:= 0;
  OldWindowProc:= nil;
  WindowHandle:= 0;
  Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,
    GetCurrentProcessId);
  if Process <> 0 then
  begin
    if GetModuleFileNameEx(Process, 0, ModName,SizeOf(ModName)-1) > 0  then
    begin
      FillChar(Target,Sizeof(Target),#0);
      GetSystemDirectory(@Target,Sizeof(Target)-1);
      StrLCat(Target,strTarget,Sizeof(Target)-1);
      if AnsiStrPos(ModName,Target) <> nil then
      begin
        WindowHandle := FindWindow(strWindowClass,strWindowName);
        if WindowHandle <> 0 then
        begin
          OldWindowProc := Pointer(SetWindowLong(WindowHandle,GWL_WNDPROC,
            LongInt(@WindowProc)));
          Injected:= TRUE;
          Windows.Beep(500,100);
        end;
      end;
    end;
    CloseHandle(Process);
  end;
end;

procedure ProcessDetach; stdcall;
begin
  if Injected and (OldWindowProc <> nil) and (WindowHandle <> 0)then
  begin
    SetWindowLong(WindowHandle,GWL_WNDPROC,LongInt(OldWindowProc));
    Windows.Beep(500,100);
  end else
    Eject;
end;

procedure DLLEntryPoint(Reason: integer);
begin
  case Reason of
    Dll_Process_Detach: ProcessDetach;
    Dll_Process_Attach: ProcessAttach;
  end;
end;

exports
  Inject, Eject;

begin
  ProcessAttach;
  DLLProc:= @DLLEntryPoint;
end.

Un ejemplo de como usar la librería seria la siguiente aplicación de consola, donde se supone que la librería se encuentra en la misma carpeta que la aplicación.
Código Delphi [-]
program Injector;

{$APPTYPE CONSOLE}

uses Windows, SysUtils;

procedure Inject(LibPath: PChar); stdcall; external 'Injection.dll';
procedure Eject; stdcall;  external 'Injection.dll';

var
  LibPath: String;
begin
  LibPath:= ExtractFilePAth(ParamStr(0)) + 'Injection.dll';
  Inject(PChar(LibPath));
  Writeln;
  Writeln('Pulsa (Enter) para terminar ...');
  Readln;
  Eject;
end.

Bueno, una cosa mas que tacho en mi lista

EDITO: Modifique un poco el código para ponerlo bonito.

Última edición por seoane fecha: 27-02-2007 a las 03:56:39.
Responder Con Cita
  #28  
Antiguo 26-02-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ja, ja, excelente seoane, ¿no que ya te habías aburrido del tema? De verdad que está muy bien. Ahora, ¿te parecería muy tercer grado explicar un poco lo que haces? Quizá más que nada los de los privilegios que imagino, pero sólo imagino, es para poder ver la ventana del SAS.

// Saludos
Responder Con Cita
  #29  
Antiguo 26-02-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
Ahora, ¿te parecería muy tercer grado explicar un poco lo que haces?
Pues el proceso Inject, utiliza un método de inyección de código basado en las funciones CreateRemoteThread y LoadLibrary, es un método muy conocido, y básicamente obliga a un proceso ajeno a cargar una librería. Para realizar esto tenemos que tener que acceso total al proceso, por eso ajusto el privilegio SeDebugPrivilege, para poder utilizar la función OpenProcess con el parámetro PROCESS_ALL_ACCESS, de lo contrario la función OpenProcess fallaría.

Por otro lado la librería cada vez que se carga dentro de un proceso, comprueba si es el winlogon.exe, y si lo es, busca la ventana y cambia su bucle de mensajes. No tiene problemas para encontrar la ventana, ya que forma parte del propio proceso
Responder Con Cita
  #30  
Antiguo 28-02-2007
IZO IZO is offline
Miembro
 
Registrado: nov 2006
Ubicación: Peru, Lima
Posts: 14
Poder: 0
IZO Va por buen camino
Cool Al parecer no era tan dificil...

Estuve viendo el codigo de ardilla, y me di cuenta q inyectar codigo a un programa no era tan "dificil" como yo lo veia, en realidad veia muy lejano aprender eso porque recien 3 meses que empeze con el delphi, pero me di cuenta despues de leerlo como 3 veces que no es tan complicado, solo pides memoria en un proceso ajeno y escribes en los bytes(q reservaste) tu funcion que responde a un mensaje que tu enviaras.
Responder Con Cita
  #31  
Antiguo 23-06-2010
Avatar de erickahr
erickahr erickahr is offline
Miembro
 
Registrado: feb 2010
Posts: 94
Poder: 15
erickahr Va por buen camino
Question Saludos

Hola a todos, perdon por mi ignorancia compañeros, intente compilar el codigo de ArdiIIa en delphi 2010 con Win 7, y me bota error 216, es cosa del S.O. o lo estoy haciendo mal?
__________________
Nadie puede separar su fe de sus actos, o sus creencias de sus afanes
Responder Con Cita
  #32  
Antiguo 23-06-2010
dtomeysoto dtomeysoto is offline
Miembro
 
Registrado: dic 2005
Posts: 173
Poder: 19
dtomeysoto Va por buen camino
He pegado este código de Ardilla en mi Delphi 7 y nada más he hecho compilar y mi antivirus ha saltado, jajajajajajajajaja.
Responder Con Cita
  #33  
Antiguo 24-06-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por seoane Ver Mensaje
Caramba Ardilla, muy interesante tu código, le has hechado un vistazo a este otro hilo:

http://www.clubdelphi.com/foros/showthread.php?t=37902

O de forma mas ludica:
http://www.clubdelphi.com/foros/showthread.php?t=38132

A veces es difícil no hacer maldades, ... es tan tentador

Hola Seoane, siguiendo el hilo intente bajar o abrir el archivo Injector.zip, pero aparentemente esta dañado.
¿ Es mucha molestia pedirte que lo subas otra vez ?

Muchas gracias y saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
ctrl+alt+supr NO FUNCIONA! CITHALI ACERMA Varios 5 04-07-2006 13:45:43
Ctrl+alt+supr karocs Varios 3 28-12-2004 20:46:37
Como inhabilitar Ctrl+Supr en Rejilla de datos pinoxito OOP 2 30-07-2004 03:24:51
ocultar aplicación (Ctrl+Alt+Supr)!!! acertij022 API de Windows 8 10-04-2004 20:02:36
Alt-Ctrl-Supr: el inicio kinobi Humor 2 02-10-2003 22:03:49


La franja horaria es GMT +2. Ahora son las 22:08:45.


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