Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

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
Respuesta



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 07:44:14.


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