Estoy usando Linux con x86 (64 bits para ser precisos). ¿Hay alguna manera de que pueda obtener la dirección de la instrucción actual? En realidad, quiero escribir mis propias versiones simplificadas de setjmp/longjmp. Here, R .. publicó una versión simplificada de longjmp. Se implementa cualquier idea de cómo setjmp. Una versión simplificada, es decir, sin tener en cuenta las excepciones y señales, etc ...Obtener la dirección de la instrucción actual para x86
Respuesta
Creo en el código de 64 bits que simplemente puede hacer lea rax, [rip]
.
El idioma de 32 bits es:
call next
next: pop eax
This sitio da una versión simple de setjmp y longjmp, que es como sigue.
#include "setjmp.h"
#define OFS_EBP 0
#define OFS_EBX 4
#define OFS_EDI 8
#define OFS_ESI 12
#define OFS_ESP 16
#define OFS_EIP 20
__declspec(naked) int setjmp(jmp_buf env)
{
__asm
{
mov edx, 4[esp] // Get jmp_buf pointer
mov eax, [esp] // Save EIP
mov OFS_EIP[edx], eax
mov OFS_EBP[edx], ebp // Save EBP, EBX, EDI, ESI, and ESP
mov OFS_EBX[edx], ebx
mov OFS_EDI[edx], edi
mov OFS_ESI[edx], esi
mov OFS_ESP[edx], esp
xor eax, eax // Return 0
ret
}
}
__declspec(naked) void longjmp(jmp_buf env, int value)
{
__asm
{
mov edx, 4[esp] // Get jmp_buf pointer
mov eax, 8[esp] // Get return value (eax)
mov esp, OFS_ESP[edx] // Switch to new stack position
mov ebx, OFS_EIP[edx] // Get new EIP value and set as return address
mov [esp], ebx
mov ebp, OFS_EBP[edx] // Restore EBP, EBX, EDI, and ESI
mov ebx, OFS_EBX[edx]
mov edi, OFS_EDI[edx]
mov esi, OFS_ESI[edx]
ret
}
}
¿Es esta la respuesta a su pregunta, @MetallicPriest? – karlphillip
No necesariamente, puedo marcar su respuesta, si es buena :-p! – MetallicPriest
El registro-en offset-la-current-segmento (EIP
) no es normalmente accesible. Sin embargo, hay una manera maliciosa de leerlo indirectamente: engañas al programa para que presione el valor de EIP en la pila, y luego lo lees. Se puede crear un subprograma que tiene este aspecto:
GetAddress:
mov eax, [esp]
ret
...
call GetAddress ; address of this line stored in eax
O, aún más simple:
call NextLine
NextLine:
pop eax ; address of previous line stored in EAX
Si utiliza una instrucción CALL FAR
, el valor del segmento (CS
) será empujado en la pila, así .
Si estás usando C, hay varios C-extensiones específicas del compilador que puede utilizar en this page. Consulte también this interesting article.
OP pregunta acerca de x86_64, que tiene un direccionamiento relativo, por lo que hay instrucciones "accesibles" para RIP –
Si se utiliza GCC, también se puede utilizar __builtin_return_address
. Tenga en cuenta que deberá envolverlo en una función para tener el efecto deseado, de lo contrario terminará con la dirección de retorno para el marco de pila actual en lugar de la dirección de la instrucción actual. – Jason
si usa GCC es más fácil de usar ['somelabel: return && somelabel;'] (http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html) –
@Jason tiene razón y también asegúrese de que la definición de la función de envoltura que contiene la __builtin_return_address no está en un archivo de encabezado y nunca estará en línea. –
- 1. Conjunto X86 - Manejo de la instrucción IDIV
- 2. Obtener la dirección de una instrucción en C/C++
- 3. x86 saltar a una dirección
- 4. Equivalente a la instrucción PAUSE x86 para PPC
- 5. x86 instrucción CMP Diferencia
- 6. mov instrucción en ensamblado x86
- 7. Bandera de dirección en x86
- 8. Posible captura de escritura en la dirección (x86 - linux)
- 9. ¿Qué es la "UE" en la arquitectura x86? (calcula la dirección efectiva?)
- 10. Cómo obtener la dirección de la brújula
- 11. x86 Instrucción MUL de VS 2008/2010
- 12. ¿Cómo obtener PropertyDescriptor para la propiedad actual?
- 13. Cómo obtener la dirección del puntero de la pila base
- 14. obtener la página actual de la url
- 15. ¿Cómo obtener la dirección IP?
- 16. Obtener la moneda de la cultura actual?
- 17. Obtener la lista de casos en la instrucción switch
- 18. ¿Qué registro x86 denota la ubicación de la fuente en la instrucción movsb?
- 19. generación operando de instrucción CALL en x86-64 de AMD
- 20. obtener la URL de la solicitud actual
- 21. ¿Cuál es el significado de la instrucción x86 "call dword ptr ds: [00923030h]"?
- 22. Dirección/Signo Extender bit en conjunto de instrucciones x86
- 23. obtener la dirección de un objeto lua
- 24. Cómo obtener la hora actual
- 25. Obtener la dirección del mapa o la dirección de la ubicación en Android
- 26. ¿Cómo hacer que `gcc` genere la instrucción` bts` para x86-64 del estándar C?
- 27. Cómo obtener la dirección IP de sockaddr
- 28. Obtener la dirección IP de los visitantes
- 29. Obtener la dirección de correo electrónico del usuario actual en Outlook 2007
- 30. ¿Cómo obtener la orientación actual de iPhones?
Y es posible hacer algo así en 32 bits? – MetallicPriest
@MetallicPriest: respuesta actualizada. – NPE
truco genial hun :-p! – MetallicPriest