2010-08-18 1 views
0

Для программы обфускации, которую я пишу на Java, мне нужно найти способ получить значение по определенному адресу. Например, в программе, которую я открыл в шестнадцатеричном редакторе, по адресу 0000001F - это шестнадцатеричное значение «00». Кроме того, возможно ли записать на определенный адрес памяти? Например, записывая 0000001F и меняя его с «00» на, например, «FF»Как получить значение с адреса с помощью Java?

+0

Когда вы говорите, что записываете на определенный адрес памяти, вы имеете в виду в текущем процессе? Вы не сможете сделать это на Java, так как ваш код будет ограничен для запуска под виртуальной машиной. Я уверен, что вы это уже знаете, поэтому я, возможно, неправильно понял этот вопрос. – Gangadhar

+4

Вы пишете обфускатор на языке, который вы не знаете достаточно хорошо, чтобы знать, что прямой доступ к памяти недоступен без собственного кода? Интересно. –

ответ

1

Чтобы ответить на ваш первый вопрос, вы можете открыть файл в виде двоичного потока и прочитать все, что вы хотите от него. Это не сильно повлияет на загрузчик классов, но если у вас есть пользовательский загрузчик классов, который манипулирует файлом и преобразует его во время выполнения в класс, который действителен и загружен JVM, это, безусловно, теоретически возможно. Интересно, в чем дело, поскольку сам загрузчик классов не был бы запутан таким образом.

Чтобы ответить на второй вопрос, вы не можете напрямую написать адрес памяти с Java. Вы можете вызвать функцию через JNI, которая может это сделать (вне распределения памяти JVM).

Это звучит так, как будто вы используете неправильный язык для того, что хотите.

1

Вы используете неправильный язык. C или C++ - лучший выбор, потому что вы можете легко вызвать библиотеки операционной системы (в большинстве систем) и попытаться получить доступ к памяти в определенном месте.

Большинство POSIX-совместимых операционных систем реализуют mmap, что позволяет сопоставлять память в определенном месте в текущем адресном пространстве процессов.

Смежные вопросы