Декомпиляция байт-кода Java - неиспользуемые методы присутствуют? - PullRequest
0 голосов
/ 12 декабря 2011

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

private void ThisIsMySecurityMethodPleaseLookHERE() {
//security stuff
}

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 12 декабря 2011

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

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

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

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

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

1 голос
/ 12 декабря 2011

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

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

...