Ver Mensaje Individual
  #11  
Antiguo 06-06-2016
Delshire Delshire is offline
Registrado
NULL
 
Registrado: jun 2016
Posts: 6
Reputación: 0
Delshire Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Vamos a recentrar el tema.

Según entiendo, quieres buscar el comienzo de una función en tu app teniendo el código de la misma y usando una máscara.

Expresiones como esta: "\x55\x8B\xEC\" no te sirven, pues ni en C tienen significado de código hexadecimal. En C, un número hexadecimal viene expresado por el sufijo 0x\ que indica al compilador que lo que viene es hexadecimal. El equivalente en delphi sería $. Dicho esto, las expresiones están mal. Tampoco las puedes usar en una cadena, pues lo que espera la función es un array estilo C (un puntero apuntando al primer elemento) con el código de la función a encontrar.

Lo que sigue es un ejemplo para encontrar la función Test. Para simplificar, lo que voy a hacer es usar el código de Text para encontrarlo en la aplicación, y es un valor conocido.
Cardinal(@Fin)-Cardinal(@Test) es la máxima cantidad de código que ocupa Test.

Código Delphi [-]
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function Match(pData: PByte; bMask: PByte; szMask: PChar): Boolean;
begin
  while (szMask^ <> #0) do
  begin
    if (szMask^ = 'x') and (pData^ <> bMask^) then
    begin
      Result := false;
      exit;
    end;
    Inc(szMask);
    Inc(pData);
    Inc(bMask);
  end;
  Result:= (szMask^ = #0);
end;

function FindPattern(dwAddress, dwLen : Cardinal; bMask : PBYTE; szMask : PCHAR) : Cardinal;
var
i : Cardinal;
begin
  Result:= 0;
  for i := 0 to dwLen-1 do
    if(Match(PBYTE(dwAddress + i), bMask, szMask)) then
    begin
      Result := Cardinal((dwAddress + i));
      break;
    end;
end;

function test() : string;
begin
  Result := 'Hola'
end;

procedure Fin;
begin
end;

var
  i: Cardinal;
  dwLen: Cardinal;
  szMask: PCHAR;
  bMask: PBYTE;
  Addr: cardinal;
begin
  i := Cardinal($401000);
  dwLen := Cardinal($409000);
  bMask:= @Test;  // bMask contiene el código de la función a buscar puesto que es un puntero a la misma.
  szMask := PCHAR('xxxxxxxxxxx???xxx');
//  MaxLen:= Cardinal(@Fin)-Cardinal(@Test);  // máxima longitud de la máscara
  WriteLn(test);
  Addr:= FindPattern(i, dwLen, bMask, szMask);
  WriteLn(IntToHex(Addr,8));
  ReadLn;
end.

Saludos.

Funciono a la perfeccion. Muchisimas gracias a vos y a todos los que ayudaron hasta ahora!.

Saludos!
Responder Con Cita