[英]How to print the location of Heap using java for a process?
我想測試為進程隨機分配堆位置的 ASLR 是否真的有效。
您可以在某些 JVM 上調用Unsafe.allocateMemory(size)
。 這將返回 memory 位置。
我不建議您這樣做,也不建議您擔心帶有 Java 的 ASLR。
您不能在純 Java 中執行此操作。
機器地址(指針)不會暴露給 Java 應用程序。
即使他們這樣做了,也沒有 Java API 告訴您堆是。
我想您可以使用System.identityHashcode()
返回的值作為 ersatz 機器地址。 如果您編寫了一個簡單的 Java 測試應用程序來檢查樣本 object 的身份哈希碼,然后在啟用和禁用 ASLR 的情況下多次運行它,您可能會觀察到可預測性的差異。
您應該能夠使用 JNI 執行此操作。 分配一個與堆大小相等或更小的 long 數組,然后調用 JNI 測試方法。
package com.example.aslrtest;
public class Test {
private static native void test(long[] heapa);
public void doTest()
{
long[] a=new long[size_of_available_heap/8];
for (long i=0; i!=a.length; i++)
a[i]=i;
test(a);
System.out.println(a[0]);
}
}
然后使用類似 JNI 代碼的代碼,您可以獲得該數組的地址。
JNIEXPORT void JNICALL Java_com_example_aslrtest_Test_test(JNIEnv * env, jclass jc, jlongArray heapa)
{
jlong* heapp;
jboolean jniNoCopy = JNI_FALSE;
heapp = (*env)->GetLongArrayElements(env, heapa, &jniNoCopy);
heapp[0] = (jlong)heapp;
(*env)->ReleaseLongArrayElements(env,heapa,heapp,0);
}
當此代碼返回時,數組的第一個元素應該包含數組的地址。
這樣做是否有意義是另一個問題。 取決於你在做什么。 我猜可能不是,但這是你的電話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.