2013-10-17 25 views
5

Tôi có một chương trình được tải trong bộ nhớ. Bây giờ tôi muốn truy cập bộ nhớ trực tiếp và thay đổi OPCODE và DATA trong bộ nhớ cho chương trình đó. Đối với điều này tôi cần phải viết một chương trình Java.Truy cập bộ nhớ bằng Java

Bạn có thể cho tôi biết liệu điều này có khả thi không? Nếu có, vui lòng cho tôi biết cách viết một chương trình như vậy.

Cảm ơn trước!

+2

bạn nên sử dụng c/C++ cho điều đó. – Sorter

Trả lời

6

Java không được thiết kế cho việc này.
Mục đích chính của Java là để JVM quản lý bộ nhớ cho bạn. Vì vậy, các chương trình của bạn được sandboxed.

Tuy nhiên, có vẻ là một backdoor trong HotSpot JVM:

Java được thiết kế ban đầu là một môi trường an toàn, quản lý. Tuy nhiên, Java HotSpot VM chứa một "backdoor" cung cấp một số hoạt động cấp thấp để thao tác bộ nhớ và chủ đề trực tiếp. Backdoor này - sun.misc.Unsafe - được sử dụng rộng rãi bởi chính JDK trong các gói như java.nio hoặc java.util.concurrent. Đó là khó tưởng tượng một nhà phát triển Java, người sử dụng cửa sau này trong bất kỳ sự phát triển thường xuyên nào vì API này cực kỳ nguy hiểm, không di động và dễ bay hơi. Tuy nhiên, Unsafe cung cấp một cách dễ dàng để xem xét HotSpot JVM internals và thực hiện một số thủ thuật. Đôi khi nó chỉ đơn giản là vui, đôi khi nó có thể được sử dụng để nghiên cứu VM internals mà không cần mã C++ gỡ lỗi, đôi khi nó có thể được thừa hưởng cho hồ sơ và phát triển công cụ .

Nguồn: http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/

Lớp Unsafe được, tuy nhiên, không có cơ sở. Bạn có thể muốn có một cái nhìn tại này SO trả lời để biết thêm chi tiết: https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe

Documents Unoffical: Hướng dẫn http://mishadoff.github.io/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
Absolute Beginners'http://java-performance.info/string-packing-converting-characters-to-bytes/
http://javapapers.com/core-java/address-of-a-java-object/

T.B. Tôi biết rằng tôi phải đăng một số nội dung của liên kết ở đây nhưng vì bài viết thực sự rất chi tiết, tôi đã bỏ qua phần đó

+1

Cảm ơn bạn đã trả lời. Tôi đã xem xét các bài viết trên không an toàn. Điều tôi hiểu là, nó có thể được sử dụng để sửa đổi các giá trị biến và không truy cập và thay đổi ở mức OPCODE. Vui lòng cho tôi biết nếu tôi đi đúng hướng? Cảm ơn. – kajarigd

+0

@kajarigd Thật sai lầm khi nói rằng tôi biết. Tôi chưa bao giờ sử dụng bản thân 'Không an toàn' vì tôi vẫn là một người mới. Hy vọng rằng, một số Stacker có kinh nghiệm sẽ có thể giúp bạn tốt hơn =) –

+0

Dưới đây là một số tải StackOver ** **: http: // javapapers.com/core-java/address-of-a-java-đối tượng/ –

0

Bạn không thể tham chiếu trực tiếp bộ nhớ trong java vì chúng không có khái niệm về con trỏ java như c/C++

Bạn phải đi qua này referencing memory address

Hy vọng nó giúp.

+0

Cảm ơn bạn đã trả lời. Tôi muốn biết nếu với unSafe tôi có thể truy cập bất kỳ phần nào của bộ nhớ, hoặc chỉ các giá trị biến? Khi một chương trình được nạp vào bộ nhớ, chúng ta có nó ở định dạng OPCODE, DATA. Tôi muốn truy cập và sửa đổi OPCODE. Điều đó có thể không? – kajarigd

+0

Tôi nghĩ câu hỏi đầu tiên của bạn nên là. bạn có thể sửa đổi bất kỳ vị trí địa chỉ nào bằng java trực tiếp không? Xin lỗi tôi chưa bao giờ thử nó. có lẽ bạn phải tự mình tìm kiếm nó. chia sẻ nó nếu bạn nhận được bất kỳ giải pháp. – Ashish

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