如何使用java打印Heap的位置?

时间:2011-04-28 13:48:15

标签: java heap

我想测试ASLR是否实际上有效处理堆的位置的ASLR。

3 个答案:

答案 0 :(得分:3)

您可以在某些JVM上调用Unsafe.allocateMemory(size)。这将返回一个内存位置。

我不建议您这样做,我不建议您担心ASLR与Java。

答案 1 :(得分:1)

你不能用纯Java做到这一点。

  • 机器地址(指针)不会暴露给Java应用程序。

  • 即使他们这样做了,也没有Java API可以告诉你堆是不是。

我想你可以使用System.identityHashcode()返回的值作为ersatz机器地址。如果您编写了一个简单的Java测试应用程序来检查示例对象的身份哈希码,然后在启用和禁用ASLR的情况下多次运行它,您可能会发现可预测性存在差异。

答案 2 :(得分:0)

您应该可以使用JNI执行此操作。分配一堆大小的数组,或者只是更小的数组,并调用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);
}

当此代码返回时,数组的第一个元素应包含数组的地址。

这样做是否有意义是另一个问题。取决于你在做什么。我猜可能不是,但那是你的电话。