Надежнее совместить автозащиту с хотя бы простенькой защитой на API :) Вообще возможность использования табличных эмуляторов зависит от типа ключей. В Stealth II нет шифрования трафика между ключом и API, также нет ассиметричной криптографии, и потому там действительно самый простой способ это табличный эмулятор на USB-шине. Главные хитрости с Stealth II заключаются в том, чтобы сделать вызовы к ключу максимально непредсказуемыми по времени и разнообразными, так чтоб даже за месяц прослушивания трафика нельзя было собрать всю инфу для табличного эмулятора. Тут помогает грамотное использование разных режимов шифрования (кроме ECB). В этом плане наша автозащита весьма хитро устроена, и достаточно надежна - чтобы собрать все таблицы обращений к ключу нужны годы.
В Sign благодаря шифрованию трафика и алгоритмку ЭЦП табличные эмуляторы делать гораздо сложнее, и ставить их надо на уровень между приложением и API или откручивать автозащиту. Для наших последних версий автозащиты автоматических снималок не существует, плюс вызовы ЭЦП на произвольных данных исключают табличную эмуляцию.
Очень хороший и несложный механизм - массивное использование алгоритма ЭЦП в произвольные моменты времени на произвольных данных, и проверка подписи внутри вашего кода с помощью функции GrdVerifySign распространяемой в исходных кодах на C++ и Delphi. Ее можно поделить на части, разнести по разным потокам, рассинхронизировать и тогда для отучения программы от ключа ее придется реверсить практически полностью.