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; szMask := PCHAR('xxxxxxxxxxx???xxx');
WriteLn(test);
Addr:= FindPattern(i, dwLen, bMask, szMask);
WriteLn(IntToHex(Addr,8));
ReadLn;
end.
Saludos.