Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-08-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
Caramba, ecfisa, ya nos hemos pisado

Saludos.
Responder Con Cita
  #2  
Antiguo 27-08-2015
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 13
deliriun Va por buen camino
Red face Un ejemplo.

Alguien me podría dar un ejemplo de como emplear... No entiendo mucho las paginas de Microsoft
Responder Con Cita
  #3  
Antiguo 27-08-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.702
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
No te lo tomes a mal, pero si dices eso es que quizás no estés preparado todavía para hacer algo así.
Responder Con Cita
  #4  
Antiguo 27-08-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
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
Hola.

Seguramente... y por otro lado:
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 27-08-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
Independientemente de que sea o no capaz de llegar a entender el uso de esas API y que les de un uno eficaz para su problema, yo quisiera saber cual es el interés particular de deliriun en alterar las cadenas de un proceso y cual es el proceso que quiere alterar.


Saludos.
Responder Con Cita
  #6  
Antiguo 28-08-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
Vamos a dar un empujoncito al tema. He escrito una función un poco a lo bruto para cambiar una cadena en un proceso. He de aclarar que está escrito en delphi7, que se compila para 32bits, esto quiere decir que no se pueden atacar de esta forma procesos de 64bits. Lo he probado en winXP y en Win10:

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function  _wcsnicmp(wstr1, wstr2: PWCHAR; Size: integer): Integer; cdecl external 'crtdll';
function  wcslen(wstr: PWCHAR): Integer; cdecl external 'crtdll';


var
  Form1: TForm1;

implementation

{$R *.dfm}

//---------------------------------------------------------------------------
function EnablePrivilege(name: String; Enable: boolean = true): boolean;
var
  hToken: Cardinal;
  priv: TOKEN_PRIVILEGES;
begin
  priv.PrivilegeCount:= 1;
  priv.Privileges[0].Attributes:= 0;
  if Enable then priv.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;
  LookupPrivilegeValue(nil, PCHAR(name), priv.Privileges[0].Luid);
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
  AdjustTokenPrivileges (hToken, FALSE, priv, sizeof(priv), nil, PDWORD(nil)^);
  Result:= (GetLastError = ERROR_SUCCESS);
  CloseHandle (hToken);
end;

//---------------------------------------------------------------------------
function RemoteReplaceString(PID: DWORD; Str, NewStr: PWCHAR): BOOL;
const
  nBytes = $16000;
var
  hProc: THANDLE;
  n, i, T, Len, nBytesRead: DWORD;
  Buffer, RemoteAddr: PBYTE;
  bi: MEMORY_BASIC_INFORMATION;
begin
  Result:= false;
  hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, PID);
  Len:= wcslen(Str) * sizeof(WCHAR);
  GetMem(Buffer, nBytes);

  EnablePrivilege('SeDebugPrivilege');

  // Escaneamos la memoria del proceso en busca de la cadena
  for n:= 0 to $1000 do
  begin
     RemoteAddr:= PBYTE(n*nBytes-Len);
     ReadProcessMemory(hProc, RemoteAddr, Buffer, nBytes, nBytesRead);
     if nBytesRead > 0 then
     begin
       //Le resto el modulo de la división para no perderme cadenas partidas
       T:= nBytesRead - (nBytesRead mod wcslen(Str));
       i:= 0;
       while i <= T do
       begin
         // Busco la cadena en el buffer "no case sensitive"
         if _wcsnicmp(PWCHAR(DWORD(Buffer)+i), Str, wcslen(Str)) = 0 then
         begin
            // Si la encuentro la escribo en el proceso remoto
            if WriteProcessMemory(hProc, pointer(DWORD(RemoteAddr) + i), NewStr, Len, nBytesRead) then
              // si pude escribir incremento el índice para seguir buscando
              i:= i + wcslen(Str);
         end;
         inc(i);
       end;
     end;
   end;
   FreeMem(Buffer);
   CloseHandle(hProc);
end;

procedure TForm1.Button1Click(Sender: TObject);
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 SameText(String(proc.szExeFile), Edit1.Text) then
        RemoteReplaceString(proc.th32ProcessID, PWCHAR(WideString(Edit2.Text)), PWCHAR(WideString(Edit3.Text)));
    until not (Process32Next(hSysSnapshot, proc));
  end;
  CloseHandle(hSysSnapshot);
end;

end.


He de comentar lo siguiente:

1- Las cadenas de un proceso en memoria deben tratarse como UNICODE
2- He usado funciones "C" de la librería crtdll.dll que trae Windows como parte del S.O. para faciñitar la búsquede de cadenas a bajo nivel
- wcslen devuelve el número de caracteres de una cadena tipo WCHAR
- _wcsnicmp compara una cadena WCHAR con otra en una longitud máxima dada y sin ser sensible a mayúsculas/minúsculas
3- Un código para 32bits no puede leer la memoria de un proceso 64 bits sin más, se precisa un driver o trucos especiales, esto es debido a la incompatibilidad de los punteros que definen el rango de direcciones que son capaces de direccionar.
4- No se puede sustituir una cadena por otra de mayor longitud.

Espero aclarar alguna duda a deliriun.


Saludos.

Última edición por escafandra fecha: 09-03-2020 a las 08:00:24.
Responder Con Cita
  #7  
Antiguo 28-08-2015
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 13
deliriun Va por buen camino
Unicode y 64 Bits

El código me funciona muy bien en 32 Bits... sin embargo estoy seguro que todo programador quiere que sus programas corran en cualquier PC por eso pregunto si es posible convertirlo a 64 Bits.

Por otro lado me funciona con Unicode... pero si ese no es el caso... Cómo se debería emplear...

Muchas Gracias de antemano por su ayuda...
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
programa residente en memoria elcigarra OOP 5 28-04-2008 18:39:48
Buscando programa de cadetil Novás Varios 1 01-11-2006 12:23:50
programa residente en memoria Jorge Ramirez Varios 1 25-04-2004 06:10:49
Programa residente en memoria naker Varios 2 10-11-2003 00:35:10
Programa de Consola en memoria.... jcgarcia Varios 2 04-06-2003 02:05:51


La franja horaria es GMT +2. Ahora son las 07:27:21.


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