Декомпиляция байт-кода Java Неиспользуемые методы присутствуют?

Скажи, что у меня есть

private void ThisIsMySecurityMethodPleaseLookHERE() {
//security stuff
}

В моей программе, но этот метод нигде не вызывается ни в одном реально выполняемом коде. Он компилируется в байт-код? Или компилятор Java распознает этот факт и отфильтрует его? Я знаю, что это никогда не сделает его байт-кодом PAST, так как он не вызывается по-настоящему.

Я спрашиваю, потому что знаю, что Java очень легко декомпилировать. будут ли присутствовать все мои неиспользуемые методы, когда они декомпилируют один из моих файлов .class?

Я предполагаю, что это не так, поскольку в этом случае каждый java-файл имел бы код раздувания, скрывающий реальный код, и проходил бы через обфускатор.

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


person Sheriff    schedule 12.12.2011    source источник


Ответы (3)


Зачем что-то предполагать? Используйте javap -c, чтобы увидеть, что находится в байтовом коде.

Учитывая, что компилятор не может знать, может ли закрытый метод быть вызван отражением, я лично ожидаю, что он все еще будет присутствовать.

Я не уверен, что вы имеете в виду под этим:

Я предполагаю, что это не так, поскольку в этом случае каждый java-файл имел бы код раздувания, скрывающий реальный код, и проходил бы через обфускатор.

Я надеюсь, что большинство разработчиков осознают, что безопасность через неизвестность — это вообще незначительная защита, но также и то, что истинная ценность самого кода обычно заключается в дизайне и т. д., а не только в реализации. Так что нет, не включайте конфиденциальную информацию в свои занятия, но и не становитесь слишком параноиком. Вам нужно взвесить затраты на попытку победить нападающих с ценой их «победы». Этот баланс будет зависеть от используемого кода, а также от типа атаки, от которой вы пытаетесь защититься.

person Jon Skeet    schedule 12.12.2011
comment
+1 за обучение тому, как определить, что находится в конечном байтовом коде. - person Chris Cashwell; 12.12.2011
comment
Я работаю в нефтяной сфере, где цена отдельной лицензии на программное обеспечение (от 10 000 до 140 000 долларов за копию) является отличным стимулом для отказа от лицензионных тестов. Я имел в виду, что могу представить себе ситуацию, когда каждый, кто программирует на Java, добавлял бы кучу раздутого кода, а затем пропускал бы его через обфускатор, чтобы предотвратить подобные вещи. Не идеально, но определенно возможно. ТАКЖЕ: Спасибо за напоминание о команде javap. - person Sheriff; 12.12.2011
comment
@Sheriff: Не все работают в одинаковой среде, и действительно, много кода Java развернуто на серверах, где конечный пользователь или клиент в любом случае может никогда не получить доступ к байт-коду. Многие ли нефтяные компании занимаются компьютерным пиратством? Я бы удивился, если бы они рискнули, но кто знает... - person Jon Skeet; 12.12.2011
comment
@Jon Skeet Если вам это сойдет с рук, да, они это сделают. Во многих случаях речь идет даже не о бесплатном получении программного обеспечения, а просто о том, чтобы заставить его работать. Я могу говорить только о наклонно-направленном бурении, но там ОЧЕНЬ сильный рынок компьютерного пиратства. Это отвратительная индустрия перерезания горла. - person Sheriff; 12.12.2011
comment
@Jon Skeet В качестве дополнительного примера, большая часть оборудования, используемого крупными компаниями, по-прежнему оснащена процессорами 486 или 586. Иногда архитекторы этого программного обеспечения с тех пор двигались дальше, и взлом — единственный способ перенести программное обеспечение на новое оборудование. Это совсем другой мир, чем тот, к которому привыкло большинство укладчиков. - person Sheriff; 12.12.2011

Частный метод фактически сделает это байтовым кодом. Может быть, даже ассемблерный код. Вы должны думать о том, что все эти методы могут быть преобразованы в подпрограммы. Таким образом, для любого частного метода, который не используется, все равно будет процедура в блоке байт-кода.

С другой стороны, существуют инструменты, которые очищают этот материал и удаляют лишний код/классы, которые не используются. Если это так, то да, в декомпилированном коде их нет.

person Amir Raminfar    schedule 12.12.2011
comment
Спасибо, Амир. Я начну рассматривать все это с прочтения байт-кода, упомянутого Джоном Скитом. Вы все очень помогли. - person Sheriff; 12.12.2011

Протестируйте и убедитесь, что вам нужно добавить параметр -p (также известный как -private), чтобы получить содержимое закрытых методов.

person Pascal Pixel Rigaux    schedule 01.09.2020