Предотвращение впрыска внешней сборки через PublicKeyToken

Я использую следующий код:

AppDomain.CurrentDomain.AssemblyLoad += (sender, args) =>
{
    var token = args.LoadedAssembly.GetName().GetPublicKeyToken();

    if (!IsValidToken(token))
    {
        Process.GetCurrentProcess().Kill();
    }
};

Где IsValidToken() сравнивает токен открытого ключа загружаемой сборки со списком авторизованных токенов открытого ключа, жестко закодированных в моем приложении в виде массивов байтов.

Является ли это хорошей мерой безопасности для предотвращения нападений с инъекциями кода? Кроме того, это необходимо, учитывая тот факт, что позже я буду запутывать свое приложение с помощью NetReactor? Я пытаюсь предотвратить любое "отслеживание" в моем приложении, причем не только из инструмента Snoop, но и из любых внешних нежелательных источников.

Ответ 1

С первого взгляда я скажу "нет, этого будет недостаточно".

Причины:

  • CreateRemoteThread Атаки - это прямые вызовы win32, без управляемых кодовых трасс, которые могли бы отключить детектор, подобный этому

  • Я думаю, что можно было бы создать еще один AppDomain в вложенной dll, тем самым полностью обходя эту проверку. Тогда можно было бы выполнить код из этого AppDomain, потенциально (я должен был бы подумать, что через), вернувшись в "основной" AppDomain через AppDomain.DoCallback

  • Process.Kill - это ужасный способ отбросить ваше приложение, хотя это не способный к прикосновению способ сделать это - то есть любой прикрепленный не смог бы его предотвратить (он использует Win32 TerminateProcess под капотом)

Мне пришлось бы вытащить у меня проводку "Инжектор", чтобы проверить эти утверждения, потому что, если я помню, где, черт возьми, я поместил этот код...

Независимо от любого из них - вы абсолютно хотите обмануть ад из этой сборки, особенно если вы планируете хранить чувствительные биты внутри (на самом деле я бы возражал против хранения ЛЮБОЙ чувствительной информацию внутри сборки, если вы можете помочь) - ваш метод предотвращения абсолютно НЕ остановит любые дизассемблеры, такие как Reflector, ILSpy, dotPeek и т.д.

Ответ 2

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