Ver Mensaje Individual
  #9  
Antiguo 19-03-2018
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.203
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Una primera aproximación consistiría en usar archivos de memoria compartida y un hilo en tu dll que los lea continuamente. Más sofisticado sería los mensajes entre threads con PostThreadMessage o la inyección directa cosa que no está en este momento a tu alcance.

Vamos a ver un ejemplo sencillo compartiendo memoria:

Lo siguiente es una clase para facilitar compartir memoria entre procesos:
Código Delphi [-]
unit SharedMemory;

interface

uses
  Windows;


type
  TModos = (mServer, mClient);

  TSharedMemory = class
  private
    Modo: TModos;
    hMap: THANDLE;       //Server
    DataMap: THANDLE;    //Client
    Name: array [0..MAX_PATH] of char;

  public
    Buffer: Pointer;
    constructor Create(MappName: PCHAR; SizeData: DWORD = 0);
    destructor  Destroy; override;
  end;

implementation

procedure MessageError(Title: PCHAR);
var
   pBuffer: pointer;
begin
   FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ALLOCATE_BUFFER, nil,
   GetLastError, 0, @pBuffer, 0, nil );
   MessageBox(0, pBuffer, Title, MB_OK);
   LocalFree(Cardinal(pBuffer));
end;


constructor TSharedMemory.Create(MappName: PCHAR; SizeData: DWORD);
begin
  lstrcpy(@Name[0], PCHAR(MappName));
  if SizeData <> 0 then
  begin
    Modo:= mServer;
    hMap:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeData, Name);

    // Si el fichero de memoria compartida ya existe, lo cierro.
    if (hMap <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
    begin
      CloseHandle(hMap);
      hMap:= 0;
    end;
  end
  else
    Modo:= mClient;

  // Inicializa
  Buffer:= nil;
  DataMap:= 0;

  DataMap:= OpenFileMapping(FILE_MAP_ALL_ACCESS, false, Name);
  if DataMap <> 0 then
    Buffer:= MapViewOfFile(DataMap, FILE_MAP_ALL_ACCESS, 0, 0, 0)
  else
    MessageError('ERROR');

end;

destructor TSharedMemory.Destroy;
begin
  if Buffer <> nil then
    UnmapViewOfFile(Buffer);

  CloseHandle(DataMap);

  if (hMap <> 0) and (Modo = mServer) then
    CloseHandle(hMap);
end;


end.

Ahora el código de tu dll:
Código Delphi [-]
library Project1;


uses
  SysUtils,
  Windows,
  Classes,
  Unit2 in 'Unit2.pas',
  SharedMemory in 'SharedMemory.pas';

{$R *.res}
var
  AtProcessobymr: THandle;
  hId:Cardinal;

  Memory: TSharedMemory;


procedure TrainerFarius;
begin
 while(true) do
 begin
   Sleep(100);
   PDWORD($A04569)^:= PDWORD(Memory.Buffer)^;
 end;
end;

begin
  Memory:= TSharedMemory.Create('_Mi_Memoria_', sizeof(Pointer));
  // Creamos un hilo para la ejecución de TrainerFarius
  CreateThread(nil, 0, @TrainerFarius, nil, 0, PDWORD(0)^);
end.

Y el formulario que envía el dato compartido:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,INIFiles,Unit2, SharedMemory, TLHelp32;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    btn1: TButton;
    lbl1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    Memory: TSharedMemory;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
var
  Key:Tinifile;
begin
  Memory:= TSharedMemory.Create('_Mi_Memoria_', sizeof(DWORD));
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  Val: DWORD;
begin
  Val:= StrToInt(Edt1.Text);
  CopyMemory(Memory.Buffer, @Val, sizeof(DWORD));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Memory.Free;
end;

end.

El ejemplo es un esbozo pero es funcional.
Ahora vienes las preguntas del millón ¿Donde quieres inyectar esa dll? ¿Sabes hacerlo?


Saludos.
Responder Con Cita