Код опирается на знание компоновки функций от компилятора - что может быть ненадежно с другими компиляторами.
Строка func_len
, однажды исправленная, чтобы включить -
, который был первоначальноотсутствует, определяет длину функции Demo
путем вычитания адреса в _Demo
(который должен содержать начальный адрес Demo()
) из адреса в _main
(который должен содержать начальный адресmain()
).Предполагается, что это длина функции Demo
, которая затем копируется побайтно в буфер buff
.Затем адрес buff
преобразуется в указатель на функцию, а затем вызывается функция.Однако, поскольку ни _Demo
, ни _main
на самом деле не инициализированы, код является крайне ошибочным.Кроме того, не ясно, что unsigned int
достаточно большой, чтобы точно удерживать указатели;приведение, вероятно, должно быть к uintptr_t
из <stdint.h>
или <inttypes.h>
.
Это работает, если ошибки исправлены, если предположения о расположении кода верны, если код не зависит от позициикод, и если нет защиты от выполнения пространства данных.Это ненадежно, непереносимо и не рекомендуется.Но это иллюстрирует, если это работает, что код и данные очень похожи.
Я помню, как выполнял похожий трюк между двумя процессами, копировал функцию из одной программы в общую память и затем выполнял другую программу.эта функция из общей памяти.Это было около четверти века назад, но техника была похожа и «работала» для машины, на которой она была опробована.С тех пор мне никогда не приходилось использовать технику, слава богу!