#objective-c #c #function #ptrace
#objective-c #c #функция #ptrace
Вопрос:
В коде я бы использовал
#include <sys/types.h>
#include <sys/ptrace.h>
ptrace(PT_DENY_ATTACH, 0, 0, 0);
запретить подключение к процессу. Мне было интересно, есть ли способ переименовать «ptrace ()» во что-то менее очевидное. Я попытался скопировать ptrace.h в свой собственный файл заголовка и изменить int ptrace на что-то другое, но это просто не удалось из-за ошибки с неопределенным символом. И я не могу найти никаких других ссылок на функцию :
Заранее благодарю вас за все, что касается этого.
Комментарии:
1. почему вы хотите переименовать это?
2. потому что, если я использую это как часть предотвращения взломов двоичных файлов, легко просто исправить это или установить точку останова для ptrace в gdb. Если это не называется ptrace или что-то очевидное, его сложнее найти.
3. исправление, не предотвращение, просто максимально усложняющее. 🙂
4. Обратите внимание, что любое макромагическое действие, которое вы выполняете в своих файлах C, не меняет того факта, что на метод в памяти во время выполнения по-прежнему ссылается
ptrace
символ, так что это никоим образом не помешало бы атакам, которые внедряют код во время выполнения.5.
ptrace(PT_DENY_ATTACH, ...)
вам все равно не поможет, потому что существует расширение ядра, которое широко используется программными пиратами для обхода этого.
Ответ №1:
ptrace
это системный вызов. Даже если вы переименовали эту функцию в своем C
коде, фактический ptrace
вызов все равно пришлось бы выполнить, чтобы он был виден, например, в strace
выводе (со всеми параметрами).
Использование трюка с макросом лишь немного сделает это менее очевидным (вам понадобятся два greps
вместо одного, чтобы найти его в вашей кодовой базе). Так что я действительно не вижу смысла. (Трюк с макросом ничего не изменил бы в скомпилированном коде.)
Вы могли бы попробовать запустить фактический системный вызов самостоятельно с помощью syscall
, но это требует много работы и все равно ничего не скроет до strace
этого момента. Это сделало бы взлом в gdb чуть сложнее.
Итак, IMO: то, что вы пытаетесь сделать, не стоит затраченных усилий.
Комментарии:
1. В Mac OS X нет такой вещи, как
strace
, хотя вы могли бы использоватьdtrace
для выполнения чего-то подобного, я ожидаю.
Ответ №2:
Используйте #define в вашем заголовке для создания нового макроса:
#define MyTrace(a,b,c,d) ptrace(a,b,c,d)
Комментарии:
1. спасибо за ответ. Будет ли выполнение «break ptrace» в gdb по-прежнему работать после выполнения вышеописанного?
2. Да, это будет. #define — это директива препроцессора, поэтому препроцессор заменит все вызовы MyTrace вызовами ptrace перед компиляцией двоичного файла. Как все говорили до меня, символ все равно будет присутствовать как ptrace.
3. есть ли способ сделать так, чтобы установка точки останова в ptrace () попадала в фиктивную функцию, а не в реальную? например, поместить другой вызов ptrace перед вызовом pt_deny_attach ptrace?