我想测试ASLR是否实际上有效处理堆的位置的ASLR。
答案 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);
}
当此代码返回时,数组的第一个元素应包含数组的地址。
这样做是否有意义是另一个问题。取决于你在做什么。我猜可能不是,但那是你的电话。