![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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:
|
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
Pues no se me ocurre otra cosa.
![]() |
#5
|
||||
|
||||
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. |
#6
|
|||
|
|||
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. |
#7
|
||||
|
||||
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:
|
#8
|
|||
|
|||
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. |
#9
|
||||
|
||||
Bueno como te decia, no soy un experto. Pero leyendo la documentacion de VirtualAlloc, lo que te devuelve es
Cita:
|
#10
|
|||
|
|||
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.
|
![]() |
|
|
![]() |
||||
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 |
![]() |
|