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 29-08-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
deliriun, ReadProcessMemory y WriteProcessMemory funcionan para un código de 64biits atacando otro también de 64 bits o de 32 bits, las que no te van a funcionar si compilas mi código en 64 bits (lazarus, por ejemplo) son wcslen y _wcsnicmp puesto que la librería crtdll.dll es se Win32. Te he dado las pautas, aunque pueden complicarse un poco más incorporando VirtualQueryEx. Puedes empezar a trabajar y nos cuetas.

Saludos.
Responder Con Cita
  #2  
Antiguo 30-08-2015
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 12
deliriun Va por buen camino
Problema con String Unicode

Pues la verdad el código que me ha dado funciona bien... pero siendo sinceros no tengo experiencia programando con Delphi... Yo uso más vb.net por su sencillez pero admito que Delphi es mucho más potente y también hay mucho asesoramiento y ayuda como esta pagina por ejemplo así que hice la pregunta en este Foro y solo me gustaría ver como es posible hacer la búsqueda del String sin que sea UNICODE... ya que esa es mi dificultad... Y sé que este no es el sitio adecuado para preguntar pero si alguien conociera un Foro como este pero destinado a vb.net se lo agradecería mucho.

Gracias
Responder Con Cita
  #3  
Antiguo 30-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 deliriun.
Cita:
Empezado por deliriun Ver Mensaje
... Y sé que este no es el sitio adecuado para preguntar pero si alguien conociera un Foro como este pero destinado a vb.net se lo agradecería mucho.
Supongo que Msdn foros - Lenguaje VB.NET - Microsoft debería ser suficientemente serio.

En la búsqueda, aparecen varios mas:Pero como no conozco nada acerca de vb.net, no puedo evaluar el nivel de esos foros como para recomendarte alguno en especial.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 30-08-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por deliriun Ver Mensaje
Pues la verdad el código que me ha dado funciona bien... pero siendo sinceros no tengo experiencia programando con Delphi... Yo uso más vb.net por su sencillez pero admito que Delphi es mucho más potente y también hay mucho asesoramiento y ayuda como esta pagina por ejemplo así que hice la pregunta en este Foro y solo me gustaría ver como es posible hacer la búsqueda del String sin que sea UNICODE... ya que esa es mi dificultad... Y sé que este no es el sitio adecuado para preguntar pero si alguien conociera un Foro como este pero destinado a vb.net se lo agradecería mucho.

Gracias
Bueno, vista la dificultad y siendo éste un foro para responder preguntas, te muestro este nuevo código, mucho más elaborado, que funciona en delphi y Lazarus. En Lazarus compilado para 64bits encuentra y cambia cadenas en procesos de 32 y 64 bits:
Código Delphi [-]
function _StrCmpNIW(Str1, Str2: PWCHAR; N: integer): DWORD;
var
  T: integer;
begin
  T:= 0;
  // Pasando a minusculas y comparando caracteres
  while ((Ord(Str1^) or 32) = (Ord(Str2^) or 32)) and (Str1^ <> #0) and (Str2^ <> #0) and (T < N) do
  begin
    inc(Str1);
    inc(Str2);
    inc(T);
  end;
  Result:= N-T;
end;

function EnablePrivilege(name: String; Enable: boolean = true): boolean;
var
  hToken: THANDLE;
  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), PTOKEN_PRIVILEGES(0)^, PDWORD(nil)^);
  Result:= (GetLastError = ERROR_SUCCESS);
  CloseHandle (hToken);
end;

//---------------------------------------------------------------------------
function RemoteReplaceString(PID: DWORD; Str, NewStr: PWCHAR): BOOL;
var
  hProc: THANDLE;
  i, T, Size, Len, nBytesRead: DWORD;
  Buffer: PCHAR;
  mbi: MEMORY_BASIC_INFORMATION;
  Start: PCHAR;
begin
  Result:= false;
  hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, PID);
  Len:= lstrlenW(Str);
  Size:= Len * sizeof(WCHAR);
  EnablePrivilege('SeDebugPrivilege');
  Start:= nil;

  // Escaneamos la memoria del proceso en busca de la cadena
  while VirtualQueryEx(hProc, Start, mbi, sizeof(mbi))<>0 do
  begin
    if mbi.Protect <> 0 and not(mbi.Protect and (PAGE_NOACCESS or PAGE_GUARD)) then
    begin
      Buffer:= VirtualAlloc(nil, mbi.RegionSize, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
      if Buffer <> nil then
      begin
        ReadProcessMemory(hProc, mbi.BaseAddress, Buffer, mbi.RegionSize, nBytesRead);
        if nBytesRead > 0 then
        begin
          //Le resto el modulo de la división para no perderme cadenas partidas
          T:= nBytesRead - Size - nBytesRead mod Size;
          i:= 0;
          while i <= T do
          begin
            // Busco la cadena en el buffer "no case sensitive"
            if _StrCmpNIW(PWCHAR(Buffer+i), Str, Len) = 0 then
            begin
              // Si la encuentro la escribo en el proceso remoto
              if WriteProcessMemory(hProc, pointer(mbi.BaseAddress + i), NewStr, Size, PDWORD(0)^) then
              begin
                // Incremento el índice para seguir buscando
                //i:= i + Size - 1;
                Result:= Result or true;
              end;
            end;
            inc(i);
          end;
        end;
        VirtualFree(Buffer, 0, MEM_RELEASE);
      end;
    end;
    inc(Start, mbi.RegionSize);
  end;
  CloseHandle(hProc);
end;

Al escribir código a bajo nivel para 64bits hay que tener mucho cuidado con la aritmética de punteros y conversiones, ya que su tamaño es de 64bits y no de 32, como estamos acostumbrados.
Aprovecho para mostrar una función, _StrCmpNIW, simple y más rápida que la API del mismo nombre. Es importante dotar de velocidad al barrido de memoria.

Saludos.

Última edición por Casimiro Noteví fecha: 30-08-2015 a las 20:01:21.
Responder Con Cita
  #5  
Antiguo 30-08-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Nota de última hora:

Al ver el código, subí una versión en la que comenté una línea para hacer pruebas, se debe "descomentar" para ganar algo de velocidad. Esta es la parte del código:
Código Delphi [-]
               if WriteProcessMemory(hProc, pointer(mbi.BaseAddress + i), NewStr, Size, PDWORD(0)^) then
               begin
                 // Incremento el índice para seguir buscando
       //==>     //i:= i + Size - 1;                 
                 Result:= Result or true;
               end;

Debe quedar así:
Código Delphi [-]
               if WriteProcessMemory(hProc, pointer(mbi.BaseAddress + i), NewStr, Size, PDWORD(0)^) then
               begin
                 // Incremento el índice para seguir buscando
                 i:= i + Size - 1;
                 Result:= Result or true;
               end;


Saludos.
Responder Con Cita
  #6  
Antiguo 30-08-2015
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 12
deliriun Va por buen camino
Gracias escafandra

La verdad me ha ayudado mucho y sé que lo hacer simplemente con ganas de ayudar aunque aun me quedan algunas dudas

1)Recomendable Rad Studio o Lazarus?
2)El código otorgado como se podría emplear por ejemplo con Microsoft Word ? Y buscar una oración y reemplazarla?
3)Cuando compilo en Delphi 7 para 32 Bits me da una serie de errores, Igual en Rad Studio... Estoy descargando Lazarus a ver que tal...

un error en esta linea de código
Código Delphi [-]
  while ((Ord(Str1^) or 32) = (Ord(Str2^) or 32)) and (Str1^ <> #0) and (Str2^ <> #0) and (Tdo

4) Y tal vez ya sea esto pedir mucho, quisiera saber si me podrías pasar el proyecto ya hecho, para verlo con detalle.

Bueno espero no sea mucha molestia, Muchas Gracias
Responder Con Cita
  #7  
Antiguo 30-08-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por deliriun Ver Mensaje
Recomendable Rad Studio o Lazarus?
Lazarus es gratis.

Cita:
Empezado por deliriun Ver Mensaje
El código otorgado como se podría emplear por ejemplo con Microsoft Word ? Y buscar una oración y reemplazarla?
Si.

Cita:
Empezado por deliriun Ver Mensaje
Cuando compilo en Delphi 7 para 32 Bits me da una serie de errores, Igual en Rad Studio... Estoy descargando Lazarus a ver que tal...

un error en esta linea de código
Código Delphi [-]
while ((Ord(Str1^) or 32) = (Ord(Str2^) or 32)) and (Str1^ <> #0) and (Str2^ <> #0) and ...
Es un error del foro, la línea ha salido truncada, debe ser así:
Código:
while ((Ord(Str1^) or 32) = (Ord(Str2^) or 32)) and (Str1^ <> #0) and (Str2^ <> #0) and (T<N) do

Decirte que por diferente declaración de la API AdjustTokenPrivileges:
Lazarus:
Código Delphi [-]
AdjustTokenPrivileges (hToken, FALSE, priv, sizeof(priv), PTOKEN_PRIVILEGES(0)^, PDWORD(nil)^);

Delphi:
Código Delphi [-]
AdjustTokenPrivileges (hToken, FALSE, priv, sizeof(priv), nil, PDWORD(nil)^);
Cita:
Empezado por deliriun Ver Mensaje
Y tal vez ya sea esto pedir mucho, quisiera saber si me podrías pasar el proyecto ya hecho, para verlo con detalle.
Por motivos de espacio he subido los proyectos en el foro DA, aquí los tienes.


Saludos.
Responder Con Cita
  #8  
Antiguo 30-08-2015
deliriun deliriun is offline
Miembro
 
Registrado: ago 2014
Posts: 51
Poder: 12
deliriun Va por buen camino
Gracias y Muchas Gracias

Bueno creo que ya todo esta Okey... Muchas Gracias escafandra eres un Dios....
Nada más que decir... si tengo alguna duda y no la puedo encontrar en la Web ya sé que aquí hay mucha ayuda

Saludos.
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 17:18:39.


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