Как и почему Golang двоичный файл показывает информацию о файле и строке об ошибке
Я играл с группами синхронизации синхронизации, и я просто попытался, что произойдет, если я добавлю больше групп, чем я сделал. и я получаю ошибку во время выполнения, которую я разместил ниже.Таким образом, вопрос здесь заключается в том, что если go скомпилирован в настоящий машинный код, в отличие от java или C#, почему мой файл может отображать даже информацию о строках в ошибках времени выполнения. Если информация о файле хранится в двоичном файле, я думаю, что ее легко декомпилировать. Я делаю что-то неправильно, мне нужно добавить какую-то переменную env для сборок prod или просто как C# нет истинного способа скрыть ваш код
1 ответ
Так что для забавы я написал тривиальную программу Go, которая просто использовала panic(), и попытался обойтись с objdump и objcopy, чтобы увидеть, где эта информация. В Linux (возможно, в других) Go вставляет соответствующую информацию в раздел ELF.gopclntab. Если вы удалите его, ссылка на фактический источник программы исчезнет, но во время выполнения произойдет сбой. И в этом разделе есть ссылки на гораздо больше времени выполнения.* (Предположительно для связи и самоанализа). Я думаю, маловероятно, что вы сможете реально запустить программу Go, когда эта информация полностью исчезнет.
Вы можете удалить информацию DWARF для некоторой безопасности, как упомянуто в другом месте в SO, и куча разделов ELF исчезнет, но лучшим вариантом, если вы действительно обеспокоены, вероятно, будет предварительная обработка ваших источников для обфускации идентификаторов и имен файлов перед компиляцией. Но , похоже, нет готового инструмента для этого.
Я не являюсь одним из дизайнеров Go, но я предполагаю, что идти гораздо дальше нецелесообразно из-за таких вещей, как самоанализ (то, что, например, С не может сделать). Компрессоры, такие как upx, слегка запутывают файл в состоянии покоя (и, кажется, работают нормально с скомпилированным Go - может быть, есть предостережение или два), но тривиально отменить, если вы знаете, что он есть (до такой степени, что любой тип безопасности будет принимать прочь мою лицензию разработчика за то, что я ее упомянул).
Реальность такова, что лучшее, что вы можете сделать на самом деле, - это спешить с людьми, которые действительно заинтересованы в том, чтобы возиться с вашим кодом. Запутывание источников, если вы действительно заинтересованы в этом, будет вашим лучшим выбором (хотя, в конечном счете, все еще бесполезно для достаточно решительных атакующих).