Как проверить CRC исполняемого файла, загруженного в память? - PullRequest
2 голосов
/ 21 февраля 2011

Я хочу запустить поток, который проверяет образ памяти текущего исполняемого файла по соображениям защиты. Любые идеи, как сделать CRC на текущий исполняемый файл памяти (WinAPI или .NET)? Мое приложение написано на .NET.

Ответы [ 5 ]

2 голосов
/ 21 февраля 2011

Подписание ваших сборок даст вам как можно лучшую верификацию в отношении проверки CRC сборки .Net (см. Ответ Родриго).

Если вы беспокоитесь, что кто-то исправит сборку во время выполнения, вы, вероятно, слишком беспокоитесь. Это требует лучшего понимания времени выполнения для исправления в памяти патча IL для метода, который уже является JIT, по сравнению с простой разборкой вашего кода .Net и его исправлением (включая удаление ваших проверок CRC).

Если вы делаете это для удовольствия, то не сможете найти базовый адрес, по которому загружается сборка, и вычислить CRC-код какого-то рода ... или посмотреть, помечены ли страницы как измененные ...

1 голос
/ 22 февраля 2011

Любая проверка во время выполнения будет иметь следующие недостатки:

  1. Ложные срабатывания.Поскольку это .NET, вы не можете предполагать, что среда выполнения не изменяет ваш код в памяти.Вы можете обнаружить взлом там, где его нет.
  2. Любая проверка во время выполнения не будет более безопасной, чем код, который вы пытаетесь защитить.Это включает в себя любой механизм времени исполнения, который вы создаете в своем приложении, такой как периодические проверки CRC, дозорные процессы или даже проверки на сервере, где может быть подделан запрос.
  3. Вы снизите производительность своеголегитимное приложение, в котором пиратская версия будет работать лучше без всех этих проверок
  4. Вы ничего не сделаете для исправления вашего EXE-файла.

Я понимаю, что вы просто пытаетесь сделать это кактрудно, насколько это возможно, даже если это не 100% безотказно.Но решения, которые вы предлагаете (и, вероятно, любое решение, которое вы можете реализовать самостоятельно), будут очень мало мешать любому среднему взломщику.

Поскольку это такая востребованная функция, я бы искал сторонние решения там, где они есть.приложить усилия для сложного решения, которое может быть обновлено по мере развития методов взлома.Я не могу рекомендовать ничего лично.

1 голос
/ 21 февраля 2011

Я думаю, что это будет довольно сложно в .NET. Когда исполняемый файл загружен, он потенциально может быть разделен и загружен в несколько различных областей памяти. Вам нужно будет ознакомиться с форматом исполняемого окна: http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx

, а также процесс загрузки исполняемого файла Windows.

Возможно, вы также захотите заняться зависимыми библиотеками. Вы будете делать столько собственных вызовов, что вы можете рассмотреть возможность сделать это в C.

Боюсь, не так много ответов.

1 голос
/ 21 февраля 2011

Я не знаю, как это сделать в .NET.Если вы заинтересованы в защите своих исполняемых файлов, вы можете сгенерировать новый ключ с помощью sn и добавить его в AssemblyInfo.cs, чтобы, если приложение было изменено по крайней мере, оно не запустилось.

0 голосов
/ 21 февраля 2011

Библиотека прочих утилит Джона Скита содержит метод для вычисления контрольной суммы Adler32 в потоке. Его использование будет:

MiscUtil.Checksum.Adler32.ComputeChecksum(stream);

Что касается создания потока памяти из сборки, которая в данный момент работает ... Я не знаю, возможно ли это (или желательно).

...