簡體   English   中英

如何使用 java 為進程打印堆的位置?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM