![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
|||
|
|||
|
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;
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;
}
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. |
|
#2
|
||||
|
||||
|
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.
Saludos. Última edición por escafandra fecha: 05-06-2016 a las 21:02:00. |
|
#3
|
|||
|
|||
|
Cita:
Funciono a la perfeccion. Muchisimas gracias a vos y a todos los que ayudaron hasta ahora!. Saludos! |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|