![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
|||
|
|||
|
C++ a Delphi?
Hola que tal estan? Estoy intentando convertir este pedazo de codigo de c++ a delphi pero se me esta complicando, tal vez puedan darme una mano?
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;
}
Código:
function Match(const pData:PBYTE; bMask:PBYTE; const szMask:PCHAR) : boolean;
var
i: integer;
begin
Result := true;
for i := 0 to StrLen(szMask)-1 do
if((szMask^ = 'x') and (pData^ <> bMask^)) then
Result := false;
break;
inc(szMask);
inc(pData);
inc(bMask);
end;
Código:
[Error] test.dpr(36): Left side cannot be assigned to [Error] test.dpr(37): Left side cannot be assigned to Código:
inc(szMask); inc(pData); |
|
#2
|
|||
|
|||
|
Hola...
El problema que veo es que tratas de ejecutar código luego del break, lo cual no es posible, ya que el break rompe el ciclo for. Saludos... |
|
#3
|
||||
|
||||
|
Hola Delshire, bienvenido a los foros de Club Delphi
![]() La observación maeyanes es correcta, y dado que en el código original usas return yo emplearía el procedimiento Exit en lugar de Break. No hice comprobaciónes, pero fijate si te funciona de este modo:
Saludos ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#4
|
|||
|
|||
|
Cita:
Cita:
La funcion parece compilar perfectamente, el problema es que la tengo ligada a otra funcion (la llamo de otra funcion) y probarla se hace un poco dificil, como soy nuevo en delphi y estoy traduciendo puramente de C++ seguramente tengo errores pero estoy investigando lo mas profundo posible. Código:
Function FindPattern(dwAddress, dwLen : Cardinal; bMask : PBYTE; szMask : PCHAR) : Cardinal ; stdcall;
var
i : Cardinal;
begin
for i := 0 to dwLen do
if(Match(PBYTE(dwAddress + i), bMask, szMask)) then
Result := Cardinal((dwAddress + i))
else
Result := 0;
end;
Código:
DWORD FindPattern(DWORD dwAddress, DWORD dwLen, BYTE * bMask, char * szMask)
{
for (DWORD i = 0; i < dwLen; i++)
if (Match((BYTE*)(dwAddress + i), bMask, szMask))
return (DWORD)(dwAddress + i);
return 0;
}
Muchas Gracias por la ayuda! |
|
#5
|
|||
|
|||
|
Cita:
Cambie un poco la funcion: Código:
Function FindPattern(dwAddress, dwLen : Cardinal; bMask : PBYTE; szMask : PCHAR) : Cardinal ; stdcall;
var
f : Cardinal;
begin
while (f < dwLen) do
begin
if(Match(PBYTE(dwAddress + f), bMask, szMask)) then
begin
Result := Cardinal((dwAddress + f));
Exit;
end;
Inc(f);
Result := 0;
end;
end;
Por ejemplo si yo creo un .exe en delphi con una funcion que se ejecuta en el main esos valores que yo dije arriba serian: Código:
program test;
{$APPTYPE CONSOLE}
uses
SysUtils;
function Match(pData:PBYTE; bMask:PBYTE; szMask:PCHAR) : boolean; stdcall; external 'test.dll';
Function FindPattern(dwAddress, dwLen : Cardinal; bMask : PBYTE; szMask : PCHAR) : Cardinal ; stdcall; external 'test.dll';
function test() : string;
begin
Result := 'Hola'
end;
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(test);
WriteLn(FindPattern(i,j,k,l));
ReadLn;
end.
![]() Cuando imprimo el valor del FindPattern me devuelve: 4229464 en vez de 4088CC. Supongo que debe ser o un problema al pasar los parametros o ya de la funcion FindPattern. Muchas Gracias por la atencion. Última edición por ecfisa fecha: 04-06-2016 a las 01:15:00. Razón: agregar enlace a imágen |
|
#6
|
||||
|
||||
|
Hola.
Algo que noto en la función FindPattern, es que la variable f no está inicializada: Luego en la salida con Writeln, tendrías que indicarle el formato hexa:
Fijate si esas observaciones te son útiles, de no ser así, avisa y seguimos revisando. Saludos ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#7
|
|||
|
|||
|
Muy bueno lo del IntToHex, no sabia de esa funcion.
Con respecto a lo de la inicializacion si pongo f := 0 la aplicacion crashea por algun motivo. Es posible pasarle 0 como valor habiendolo declarado como Cardinal? Gracias por la ayuda. |
![]() |
|
|
|