Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-06-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
ASM incorrecto?

Buenas, me encuentro con un problema, traduciendo la función de: http://www.codeproject.com/Articles/...ng-Guide#BpMem
Tengo el siguiente error al querer compilar:
"E2116 Invalid combination of opcode and operands"

El error me ocurre en la línea: "push MemBpBeingDebugged"
Intente dejarlo exactamente igual pero algo falla y no encuentro el que, espero que le podáis echar un cable al asunto.

Mi source:

Código Delphi [-]

function DetectMemoryBP(): integer;
var
  pMem, pAllocation: pointer;
  SysInfo: TSystemInfo;
  oldprotect: dword;
  NullSize_T: SIZE_T;
label
  MemBpBeingDebugged;
begin
  NullSize_T := 0;
  pMem := nil;
  GetSystemInfo(SysInfo);
  oldprotect := 0;
  pAllocation := VirtualAlloc(nil, sysinfo.dwPageSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);

  if (pAllocation = nil) then
    result := 0;
  pMem := Pointer($C3);

  if VirtualProtect(pAllocation, sysinfo.dwPageSize, PAGE_EXECUTE_READWRITE or PAGE_GUARD, @oldprotect) = false then
    result := 0;

  try
    asm
        mov     EAX, pAllocation
        push    MemBpBeingDebugged
        jmp     EAX // Exception or execution, which shall it be ?
    end;
  except
    VirtualFree(pAllocation, NullSize_T, MEM_RELEASE);
    result := 0;
    exit;
  end;

MemBpBeingDebugged:

  VirtualFree(pAllocation, NullSize_T, MEM_RELEASE);
  result := 1;

end;


Ejemplo de uso:
  if DetectMemoryBP > 0 then
    MessageBox(0, 'detectado', '', 0);
Responder Con Cita
  #2  
Antiguo 28-06-2016
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Estás intentando meter en pila una posición de código ejecutable. No manejo ensamblador de los últimos micros, pero sospecho que no es tan fácil como hacer un "push label" por el tema del bloqueo de memorias, cachés y demás. De hecho es lo que te está diciendo el mensaje de error.

De todas formas, no entiendo qué quieres hacer. Un simple "GOTO MemBpBeingDebugged;" bastaría.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 28-06-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Ojalá bastara con un GOTO(JMP) pero no me da buenos resultados hacerlo de esa manera, intento traducir la función de C++ para crear una técnica anti-debug para Delphi como mencioné mas arriba.
Por lo que parece, lo suyo sería obtener la dirección/puntero de ese label pero ¿cómo se podría realizar esa técnica?

Última edición por Reasen fecha: 28-06-2016 a las 14:09:12.
Responder Con Cita
  #4  
Antiguo 28-06-2016
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Pues no se me ocurre otra cosa.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #5  
Antiguo 28-06-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Siendo un completo ignorante de ASM, porque no ejecutas en C++ y usas un debugger que te muestre que ASM esta generando, y luego lo mismo en Delphi?
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 28-06-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
En C++_ASM se muestra una dirección que apunta a ese label de C++, lo que falta es calcular esa dirección del label en Delphi, ya que Delphi no lo hace automáticamente.
Es una dirección que varía dependiendo del ejecutable por lo que es necesario crear una función que lo calcule en tiempo de ejecución.

Última edición por Reasen fecha: 28-06-2016 a las 20:56:20.
Responder Con Cita
  #7  
Antiguo 28-06-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo tambien soy un ignorante mas, pero solo por curiosidad, que valor de retorno obtienes de la llamada a la funciones:

VirtualAlloc,
VirtualProtect

Porque si alguna falla (evalua a False), entonces no deberia ser seguro continuar con tu codigo. Deberias llamar a GetLastError, ya que estas funciones no elevan excepciones por si solas.

Otra cosa, en la parte final de tu codigo, podrias refactorizarlo porque estas repitiendo codigo. Ademas, no entiendo porque retornas un Integer cuando luego la usas como un Boolean:


Código Delphi [-]
function DetectMemoryBP: Boolean;
var
  pMem, pAllocation: Pointer;
  SysInfo: TSystemInfo;
  oldprotect: dword;
  NullSize_T: SIZE_T;
label
  MemBpBeingDebugged;
begin
  Result := False;
  NullSize_T := 0;
  pMem := nil;
  GetSystemInfo(SysInfo);
  oldprotect := 0;
  pAllocation := VirtualAlloc(nil, sysinfo.dwPageSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);

  if (pAllocation = nil) then
    Exit(False); // o podrias invocar a RaiseLastOsError 

  pMem := Pointer($C3);

  if not VirtualProtect(pAllocation, sysinfo.dwPageSize, PAGE_EXECUTE_READWRITE or PAGE_GUARD, @oldprotect) then
    Exit(False); // o podrias invocar a RaiseLastOsError 

  try
    asm
        mov     EAX, pAllocation
        push    MemBpBeingDebugged
        jmp     EAX // Exception or execution, which shall it be ?
    end;
  finally
    VirtualFree(pAllocation, NullSize_T, MEM_RELEASE);
  end;

  MemBpBeingDebugged:
  Result := True;
end;
Responder Con Cita
  #8  
Antiguo 29-06-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Hola AgustinOrtu, gracias por pulir mi código, estos son los valores que me retornan VirtualAlloc y VirtualProtect
:::
VirtualProtect = True
VirtualAlloc = 0
:::
Dejo un screenshot de cómo se ven las 3 instrucciones de ASM con un compilador de C++ desde un debugger las cuales estoy intentando implementar en Delphi:

Se puede apreciar como apunta al label que está un poco mas abajo del código...
¿Una solución un poco sucia seria apuntar unos bytes mas abajo desde la posición que se encuentre X código?

Última edición por Reasen fecha: 29-06-2016 a las 01:24:23.
Responder Con Cita
  #9  
Antiguo 29-06-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Bueno como te decia, no soy un experto. Pero leyendo la documentacion de VirtualAlloc, lo que te devuelve es

Cita:
If the function succeeds, the return value is the base address of the allocated region of pages.
Esa direccion no te sirve para realizar el calculo de offset?
Responder Con Cita
  #10  
Antiguo 29-06-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
No se me ocurre otra manera que "HardCodearlo", pues no creo que sea una buena solución, quedaría inestable o sería difícil hacer cambios.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Orden de secuencia incorrecto AngelV JAVA 4 13-09-2007 15:06:02
Campo COUNT incorrecto? Duc SQL 6 07-07-2005 17:39:28
Error: Parámetro Incorrecto Manuel Varios 2 30-04-2004 01:19:30
Filtro Incorrecto JamesBond_Mx Conexión con bases de datos 2 06-04-2004 22:31:23
Indice incorrecto VolaRe Varios 8 22-02-2004 20:34:45


La franja horaria es GMT +2. Ahora son las 10:00:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi