我正在使用Linux和x86(64位準確)。有沒有辦法可以得到當前指令的地址?其實我想寫我自己的簡化版本setjmp/longjmp。 Here,R ..發佈簡化版本longjmp。任何想法如何實現setjmp。一個簡化的版本,即不考慮異常和信號等...獲取x86當前指令的地址
回答
我相信在64位代碼,你可以簡單地做lea rax, [rip]
。
32位成語是:
call next
next: pop eax
This網站給出了一個簡單版本的setjmp和longjmp的,這是如下。
#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
}
}
這是你的問題的答案,@MetallicPriest? – karlphillip
不一定,我可以在你的答案中打勾,如果它很好:-p! – MetallicPriest
偏移 - 到 - 的電流段寄存器(EIP
)是不正常訪問。但是,間接讀取它存在一種駭人聽聞的方式 - 誘騙程序將EIP的值推入堆棧,然後將其讀取。如果您使用的是CALL FAR
指令,段值(CS
)
call NextLine
NextLine:
pop eax ; address of previous line stored in EAX
將被壓入堆棧,以及:您可以創建一個子程序,看起來像這樣:
GetAddress:
mov eax, [esp]
ret
...
call GetAddress ; address of this line stored in eax
甚至更簡單。
如果你使用C,還有你可以在this page使用各種編譯器相關的C-擴展。另見this interesting article。
OP詢問關於具有相對尋址的x86_64,所以有指令「可訪問」到RIP –
如果使用GCC,你也可以使用__builtin_return_address
請記住,您需要將它包裝在一個函數中才能達到預期的效果,否則最終會當前堆棧幀的返回地址,而不是當前指令的地址。 – Jason
如果使用GCC,它更易於使用['somelabel:return && somelabel;'](http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html) –
@Jason是正確的,並且確保包含__builtin_return_address的包裝函數的定義不在頭文件中,也不會被內聯。 –
- 1. 獲取C/C++指令的地址
- 2. 獲取IP地址當前服務器
- 3. blackberry gps獲取當前位置地址?
- 4. iOS獲取當前地址名稱 - mkplacemark?
- 5. 獲取指針的地址
- 6. Google地圖 - 獲取當前地圖位置的地址
- 7. x86和指令
- 8. C指令地址
- 9. x86 - CALL指令是否總是將EIP指向的地址推送到堆棧?
- 10. 在Mac OS X中的指令指針的尋址X86-64
- 11. 獲取二進制指令的內存地址
- 12. lea指令如何獲取操作數的地址?
- 13. 如何獲取一條機器指令寫入的地址?
- 14. 獲取當前進程的堆的起始地址?
- 15. 獲取當前網頁的網址
- 16. 獲取iFrame的當前網址
- 17. 獲取Cocoa WebView的當前網址
- 18. C++獲取指針的地址
- 19. x86指令含義
- 20. 如何在Linux中獲取當前用戶的IP地址
- 21. 使用getmac獲取當前機器的mac地址和node.js
- 22. android-獲取當前地址的最佳方式
- 23. 獲取xcode中用戶的當前地址?
- 24. 獲取當前請求中的服務器IP地址
- 25. 在.NET中獲取當前用戶的電子郵件地址
- 26. 谷歌地圖API:獲取當前視圖的網址
- 27. 如何獲取當前進程的起始地址--- Linux
- 28. 使用PHP獲取當前播種器的IP地址
- 29. 使用scala獲取當前機器的公共IP地址
- 30. 是否可以獲取當前用戶的地址簿記錄?
,並有可能做這樣的事情,在32位? – MetallicPriest
@MetallicPriest:答案已更新。 – NPE
酷招hp :-p! – MetallicPriest