2010-10-31 40 views

Trả lời

53

Giả sử 32-bit x86, sử dụng hàm sau:

get_eip: mov eax, [esp] 
     ret 

Sau đó, để có được giá trị của EIP trong EAX, chỉ cần:

call get_eip 
+2

Điều này thật tuyệt vời: D – Mehrdad

+0

Tôi ước có một cách để làm điều này mà không cần nhãn hoặc đếm byte – Dmitry

9
call foo 
foo: 
    pop eax ; address of foo 
+8

Cách tiếp cận này có vấn đề nhỏ. Các bộ vi xử lý hiện đại cố gắng dự đoán các địa chỉ trả về - một cuộc gọi không được ghép nối với sự trở lại sẽ làm rối loạn dự đoán. Xem http://blogs.msdn.com/b/oldnewthing/archive/2004/12/16/317157.aspx – user200783

+0

@Paul Baker thường không phải là vấn đề nghiêm trọng. Ví dụ 'gọi @f/db '123', 0/@@:' là một thực tế phổ biến – Abyx

+0

gọi foo, pop eax, đẩy eax, ret –

22

On x86-64 (trái với 32 bit x86), có RIP địa chỉ liên quan (RIP là tương tự 64 bit của EIP). Vì vậy, trong mã 64-bit, bạn chỉ có thể làm

lea rax, [rip] 

để di chuyển các nội dung hiện tại của RIP-RAX (bạn có thể sử dụng lea nhưng không mov cho việc này).

+0

Nhận xét tuyệt vời. Tôi đã xóa câu trả lời sai. Không nên đăng nhận xét dưới dạng câu trả lời. –

+0

Hmmm, điều này không hoạt động trong khối VC++ 2015 '__asm ​​{}'. :(Nhận 'lỗi C2415: lỗi toán hạng không đúng'. – Adrian

Các vấn đề liên quan