Ну самое простое, это проверить наличие железки с определёнными VID и PID, а так-же какими-либо её свойствами, причём для этого способа нет нужды даже колхозить устройство, ибо есть тьма-тьмущая интерфейсных шнурков, флэшек итд. над которыми можно надругаться ;-) превратив в уникальные идентификаторы...
Далее, можно замутить какое либо взаимодействие непосредственно с устройством, начиная пароль-отзыв и плавающих кодов и заканчивая, как уже выше отмечалось, функциональным использованием устройства, которое к слову не такое уж и извращение...
ИМХО начинать всегда нужно с построения моделей угроз, от чего именно и что именно вы хотите защитить?
И от этого уже плясать, ибо ваш исполняемый код, может быть распакован, пропатчен от жадности и цинично запакован обратно :-) Или устройство-ключ может быть симулировано программно, или даже воссоздано аппаратно... А бывают ситуации когда нужно защитить сам рабочий алгоритм от реверсинженеринга и\или не санкционированной эксплуатации, и когда ценность его измеряется сотнях килобаксов, тут уже начинается высокое искусство.
В большинстве обыденных задач, достаточно сделать процесс изучения и взлома достаточно трудоёмким, что бы заниматься этим ради забавы было не повадно, и никто не будет этим заниматься :-)