Последовательная проверка USB в C ++ - PullRequest
2 голосов
/ 18 июля 2010

У меня есть DLL, которую я собираюсь отправить сторонней организации, и я хотел бы защитить ее, ограничив ее работу только при подключении определенного USB-устройства.Я использую setupapi для получения серийного номера устройства (вызывая SetupDiGetDeviceInstanceId ()).

Я бы хотел усложнить отслеживание проверки на случай, если кто-то разберет DLL.например, простой вызов SetupDiGetDeviceInstanceId отслеживается, и если кто-то захочет использовать мою DLL без правильного последовательного порта с USB, он может легко найти мой strcmp в коде сборки и изменить if(strcmp(...) == 0) на if(strcmp(...) == 1).

Каков будет хороший (и желательно «простой») подход для защиты моего кода от обратного инжиниринга?Может быть, я мог бы использовать другой API (кроме setupapi), который бы позаботился об этом?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 18 июля 2010

Я нахожу ограничивающее программное обеспечение, которое обычно приходит и кусает вас позже.Работа по поиску способа реализовать его «безошибочным» способом часто недооценивается и может также непреднамеренно нанести вред продукту, в итоге раздражая законных клиентов.Лучше вместо этого обеспечить хорошую поддержку и делать частые обновления.Любую защиту можно обойти, поэтому я бы не стал тратить на это слишком много времени.

1 голос
/ 19 июля 2010

Вы явно не можете просто прочитать серийный номер и сравнить с известным хорошим значением - найти и удалить его тривиально.

Чтобы сделать вещи немного сложнее, используйте криптографический хеш (например, SHA-256) от серийного номера до криптографического хэша правильного серийного номера.Убедитесь, что код для хеша сгенерирован встроенным, так что вы довольно много путаетесь между чтением серийного номера и выполнением перехода на основе сравнения значения хеша.Это не остановит решительного злоумышленника, но остановит большинство людей, которые просто смотрят на код в отладчике и не хотят тратить много времени на его реинжиниринг.

Если вы хотитечтобы еще больше усложнить задачу, сохраните часть своего кода в зашифрованном виде с правильным серийным номером в качестве ключа.Во время выполнения прочитайте серийный номер и используйте его для расшифровки кода.Если это не так, результатом будет плохой код, который вы можете либо выполнить как есть (зная, что он быстро рухнет и сгореть), либо вы можете выполнить какую-то контрольную сумму, чтобы проверить результат, и потерпеть неудачу немного более изящно (например, отобразитьсообщение об ошибке и умереть), если код не расшифровывался правильно.

0 голосов
/ 18 июля 2010

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

...