Обнаружение взлома в дочернем процессе
Я занимаюсь разработкой простого приложения с использованием C и хотел бы узнать, можно ли каким-либо образом определить, когда приложение было подделано. Основываясь на моих знаниях, Hash - один из способов обеспечения целостности данных, но я не знаю, как жестко закодировать хэш процесса в моем коде, когда я его компилирую, или я не знаю, даже это хороший способ делать. Любая помощь / подсказка высоко ценится.
1 ответ
Вы должны защитить свой хеш от статических изменений (пока ваше приложение находится на диске). Например, вы можете подписать его закрытым ключом, который будет спрятан где-то в коде обнаружения взлома. Я не могу сказать вам, как вы можете это скрыть, потому что это должен быть ваш секрет.
Чтобы иметь самопроверяемый исполняемый файл, вы можете выделить хеш в исходных текстах, но указать компилятору сохранить его в секции именованных PE/ELF. При подписании вашего двоичного файла исключите ваш именованный раздел из расчета хеша и сохраните хеш, рассчитанный внутри.
Чтобы поместить хэш в именованный раздел для компиляторов Microsoft, вы можете использовать
#pragma section("tdhash", read)
__declspec(allocate("tdhash")) const unsigned char hash[32] = {0};
для компиляторов GCC:
const unsigned char hash[32] __attribute__ ((section ("tdhash"))) = {0};
Примечание. После изменения PE вы можете обновить контрольную сумму в заголовке, а также исключить поле контрольной суммы из вычисления хеша. Пример для этого находится в статье "Как предотвратить" проверку целостности "при загрузке" статьи Microsoft KB, доступной по https://technet.microsoft.com/ru-ru/library/ee829684