Tôi muốn lấy giá trị hiện tại của thanh ghi EIP bằng ngôn ngữ assembly. Điều đó có thể không?Làm thế nào để kiểm tra giá trị EIP với ngôn ngữ lắp ráp?
Trả lời
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
call foo
foo:
pop eax ; address of foo
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
@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
gọi foo, pop eax, đẩy eax, ret –
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).
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. –
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
- 1. Ngôn ngữ lắp ráp LLVM ổn định như thế nào?
- 2. Ngôn ngữ lắp ráp thành C
- 3. Ngôn ngữ lắp ráp - Máy xếp
- 4. Ngôn ngữ lắp ráp nào để tìm hiểu
- 5. Ngôn ngữ lắp ráp - Nhiều loại?
- 6. ngôn ngữ lắp ráp trong os x
- 7. Kiểm tra GAC để lắp ráp
- 8. In ra một số trong ngôn ngữ lắp ráp?
- 9. FxCop: quy tắc tùy chỉnh để kiểm tra giá trị thông tin lắp ráp
- 10. làm thế nào lisp được thực hiện trong ngôn ngữ lắp ráp?
- 11. Là CIL một ngôn ngữ lắp ráp và JIT là một bộ lắp ráp
- 12. Có ngôn ngữ lắp ráp cho CUDA không?
- 13. x86 thành ngữ lắp ráp
- 14. Tăng từ 0 lên 100 trong ngôn ngữ lắp ráp
- 15. Người mới bắt đầu Ngôn ngữ lắp ráp
- 16. Linux 64 bit, Ngôn ngữ lắp ráp, Sự cố?
- 17. Ngôn ngữ lắp ráp - Cách thực hiện Modulo?
- 18. C#: Làm thế nào để tải lắp ráp từ GAC?
- 19. Làm thế nào để đọc lắp ráp thuộc tính
- 20. Làm thế nào để thay đổi giá trị của EIP trong ollydbg?
- 21. Làm cách nào để kiểm tra trạng thái khóa trong lắp ráp x86?
- 22. Lắp ráp Maven: lắp ráp
- 23. CLD và STD cho ngôn ngữ lắp ráp x86 là gì? DF làm gì?
- 24. Tài liệu để đọc các ngôn ngữ lắp ráp khác nhau?
- 25. Làm thế nào để sử dụng ADC trong lắp ráp?
- 26. Làm thế nào để remap phiên bản lắp ráp
- 27. Làm thế nào để biên dịch một exe hoặc một dll để lắp ráp
- 28. Giá trị trả lại được thực hiện ở cấp độ lắp ráp như thế nào?
- 29. Bạn có bao giờ cần viết mã thực trong ngôn ngữ lắp ráp không?
- 30. Làm thế nào để kiểm tra, nếu một giá trị là một số nguyên với plpgsql?
Điều này thật tuyệt vời: D – Mehrdad
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