El problema creo que esta en la funcion del Match, me tira un error de excepcion o violacion de memoria creo y cuando abri un debugger para ver donde tiraba el crash era cuando entraba a esa funcion. No se si es la funcion que esta mal o si es como lo estoy llamando que esta mal.
Asi llamo a la funcion FindPattern que luego llama a Match dentro de ella:
Código:
var
i : Cardinal;
j : Cardinal;
k : PBYTE;
l : PCHAR;
tmp : string;
begin
i := Cardinal(401000);
j := Cardinal(8000);
tmp := '\x53\x8B\xD8\x8B\xC3\xBA\x00\x00\x00\x00\xE8\x00\x00\x00\x00';
k := PBYTE(tmp);
l := PCHAR('xxxxxx????x????');
WriteLn(IntToHex(FindPattern(i,j,k,l), 8));
ReadLn;
end.
La funcion Match:
Código:
function Match(pData: PByte; bMask: PByte; szMask: PChar): Boolean; stdcall;
begin
Result := True;
while (szMask^ <> #0) and Result 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;
Match en C++:
Código:
bool Match(const BYTE * pData, const BYTE * bMask, const char * szMask)
{
for (; *szMask; ++szMask, ++pData, ++bMask)
if (*szMask == 'x' && *pData != *bMask)
return false;
return (*szMask) == NULL;
}
Como se llama a la funcion en C++:
Código:
DWORD AddressAEncontrar = FindPattern(0x401000, 0x149000, (unsigned char*)"\x55\x8B\xEC\x83\xEC\x18\x68\x00\x00\x00\x00\x64\xA1\x00\x00\x00\x00\x50\x64\x89\x25\x00\x00\x00\x00\xB8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x53\x56\x57\x89\x65\xE8\xC7\x45\x00\x00\x00\x00\x00\xC7\x45\x00\x00\x00\x00\x00\xC7\x45\x00\x00\x00\x00\x00\xC7\x45\x00\x00\x00\x00\x00\x8B\x55\x08\x8D\x4D\xA0\xFF\x15\x00\x00\x00\x00", "xxxxxxx????xx????xxxx????x????x????xxxxxxxx?????xx?????xx?????xx?????xxxxxxxx????");
Gracias.