> Если они вызываются, я точно так же беру и анализирую их
Если в программе несколько тысяч функций, а вызовы защитных методов организованы нелинейно, например, не на старте, а спустя сотни тысяч вызовов других функций, при определенных условиях, то я думаю, что найти все защитные функции будет уже не так просто. Особенно когда эти функции не приводят к завершению программы, а ломают ее логику.
> какая мне разница, по каким адресам функции расположены?
Можно сделать предположение о том, что функции, адреса которых расположены подряд, принадлежат одному модулю. Таким образом, найдя один защитный метод, можно найти и все остальные.
В принципе, описанную проблему я решил путем объявления всех защитных функций как static с последующим подключением модуля целиком (#include "module.c"). В процессе оптимизаций неиспользуемый код вычищается компилятором, что в итоге дает желаемый результат - функции распределены в бинарном файле, грубо говоря, рандомно, и не имеют дубликатов. Но я думал, что есть какие-то способы проделать все это более эстетично.
Василий Дёмин, каким бы не было шифрование, ничто не мешает сдампить и проанализировать память исполняемого процесса, разве не так? В вопросе я хотел на примере показать, что функциям из одного и того же модуля компоновщиком присваиваются адреса в той последовательности, в которой эти функции располагаются в модуле. Таким образом, если разместить все защитные методы в одном исходном файле, то потенциальный взломщик, обнаружив один из этих методов, может захотеть посмотреть на функции, адреса которых расположены рядом в ELF-файле.
Inviz Custos, Я как раз это и хочу сделать. Удалить всё лишнее: отладочные символы, необязательные секции. А безымянные адреса функций хотелось бы перемешать.
Inviz Custos, покажет, наверное, если эти связи имеются. В моем случае защитные методы связаны между собой лишь по принципу их назначения. Иначе говоря, можно было бы разместить их где угодно, но удобнее хранить в одном месте. За ссылку большое спасибо!
Как раз это и интересует, как завести графическое окружение вручную из текстовой консоли. При чем, чтобы оно работало параллельно, не влияя на функциональность системы основного пользователя.