Как напечатать расположение кучи, используя Java для процесса? - PullRequest
0 голосов
/ 28 апреля 2011

Я хочу проверить, действительно ли работает ASLR, который рандомизирует расположение кучи для процесса.

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

Вы можете позвонить Unsafe.allocateMemory(size) на некоторых JVM.Это возвращает ячейку памяти.

Я не рекомендую вам делать это, и я не рекомендую вам беспокоиться об ASLR с Java.

1 голос
/ 28 апреля 2011

Вы не можете сделать это на чистой Java.

  • Машинный адрес (указатели) не предоставляются приложениям Java.

  • Даже если бы они это сделали, нет Java API, который бы сообщал вам, где находится куча.

Полагаю, вы могли бы использовать значения, возвращаемые System.identityHashcode(), в качестве машинных адресов ersatz. Если вы написали простое тестовое приложение Java, которое проверяло хэш-код идентификатора образца объекта, а затем запускали его несколько раз с включенным и отключенным ASLR, вы можете увидеть разницу в предсказуемости.

0 голосов
/ 28 апреля 2011

Вы должны быть в состоянии сделать это с JNI. Выделите массив longs размером с кучу или просто меньше и вызовите метод тестирования 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);
}

Когда этот код возвращается, первый элемент массива должен содержать адрес массива.

Имеет ли смысл это делать - это другой вопрос. Зависит от того, что вы делаете. Наверное, нет, но это ваш звонок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...