Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Привязка Программы к железу C++

  • Автор темы Автор темы Jeremy
  • Дата начала Дата начала
seller
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
19 Авг 2017
Сообщения
355
Реакции
118
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Иногда в программах необходимо использовать возможность проверки типа носителя или его серийный номер. Причины могут быть разными от банального контроля устройств в системе до средств защит использующих привязку к железу. Сейчас я вам покажу как с помощью API реализовать эту простую задачу.
Нам понадобится всего 2 API - функции:

GetDriveType - определяет и возвращает тип носителя;
GetVolumeInformation - определяет информацию о носителе, среди которой содержится серийный номер.

Рассмотрим описание этих функций для С++. Первой будет функция GetDriveType, она очень простая и использует всего один параметр - указатель на том. Например: "c:\","a:\" и т.д. Функция возвращает одно из следующих значений:

DRIVE_UNKNOWN - 0 : диск не определен/не существует
DRIVE_NO_ROOT_DIR - 1 : неверный путь/ путь не указывает на том
DRIVE_REMOVABLE - 2 : тип устройства определяется как съемный (дискета, флешка и т.д.)
DRIVE_FIXED - 3 : тип устройства - фиксированный диск (жесткий диск)
DRIVE_REMOTE - 4 : тип устройства - удаленный(сетевой) диск
DRIVE_CDROM - 5 : это устройство CD-ROM
DRIVE_RAMDISK - 6 : виртуальный диск, созданный в оперативной памяти


UINT WINAPI GetDriveType(
LPCTSTR lpRootPathName //путь к диску
);

Замечание: Если в качестве параметра указать для С/С++ NULL, то тип устройства будет определяться для текущего диска (с которого была запущена программа).

А теперь взглянем на функцию GetVolumeInformation. Тоже достаточно простая функция, однако использует параметров значительно больше.

Код:
Expand Collapse Copy
BOOL WINAPI GetVolumeInformation(
LPCTSTR lpRootPathName, //путь к сетевому или локальному
// тому (пример: "\\MyServer\MyShare\"
или "C:\".
LPTSTR lpVolumeNameBuffer, //буфер - в котором будет храниться
// имя тома
DWORD nVolumeNameSize, //размер буфера
LPDWORD lpVolumeSerialNumber, //серийный номер тома
LPDWORD lpMaximumComponentLength, //размер тома
LPDWORD lpFileSystemFlags, //тип файловой системы
LPTSTR lpFileSystemNameBuffer, //название файловой системы
DWORD nFileSystemNameSize //размер буфера под название ФС
);


Замечание: Если в качестве первого параметра указать для С/С++ NULL, то функция будет выполняется для текущего диска (с которого была запущена программа).

Ну а теперь собственно для пущего интересу приведу пример, как привязать программу к устройству. В данном примере будем привязывать программу к флешке.

Смотрим пример:
Код:
Expand Collapse Copy
#include
#include
#include
#include
using namespace std;

int main() {
// Получаем тип носителя с которого запущена программа
unsigned int drive_type = GetDriveType( NULL );

char VolumeNameBuffer[100];
char FileSystemNameBuffer[100];
DWORD sz,fs;
unsigned long drive_sn;
GetVolumeInformationA(
NULL,
VolumeNameBuffer,
100,
&drive_sn,
sz,
fs,
FileSystemNameBuffer,
100
);
cout << "Volume serial number:\t";
if(drive_sn == 1018821877) //сравниваем серийный номер
cout << "correct" << endl;
else
cout << "invalid" << endl;
cout << "Drive type:\t";
if(drive_type == DRIVE_REMOVABLE)
cout << "correct" << endl;
else
cout << "invalid" << endl;
getch();
}


Замечание: Может возникнуть вопрос, а как узнать серийник диска, чтобы знать с чем сравнивать? Очень просто, для этого пишем тестовую прогу, в которой пишем следующий код:

Код:
Expand Collapse Copy
GetVolumeInformationA(NULL, VolumeNameBuffer,100,
&drive_sn,sz,fs,FileSystemNameBuffer,100);
 
Я не против копипасты с других форумах, но главное что эта с+р было полезной, чтобы подменить серийник надо обладать минимумом знаний в реверсинге, дебажишь, смотришь с чем сравнивает программа, а далее меняешь свой серийник на тот что сравнивает, или наоборот
 
Я не против копипасты с других форумах, но главное что эта с+р было полезной, чтобы подменить серийник надо обладать минимумом знаний в реверсинге, дебажишь, смотришь с чем сравнивает программа, а далее меняешь свой серийник на тот что сравнивает, или наоборот
А этот вообще хукается на изи, не говоря о 100500 программах которые меняют VolumeID
 
Неплохая реализация, но у меня при себе самописная привязка с самописными пхпшниками, которую уж не подменишь просто так.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ну такое. Самое лучшее - это с веб обвязкой.
Скрывать процесс.
Делать антидамп.
Антидебаг.
Прописать классы программ для реверса( типо PH.exe, snif.exe)
Делать проверку при запуске лоадера, есть ли такие активные процессы, если есть, убиваем процесс, делаем запрос на сервер и записываем ключ человека в таблицу с баном( с указанием софта, который был открыт, или открывался при открытом лоадере)
 
Я не против копипасты с других форумах, но главное что эта с+р было полезной, чтобы подменить серийник надо обладать минимумом знаний в реверсинге, дебажишь, смотришь с чем сравнивает программа, а далее меняешь свой серийник на тот что сравнивает, или наоборот
Против таких реверсеров-новичков, программисты делают антидебагеры, а ещё делают проверку на стороне сервера и в случае если допустим у тебя нет интернет соединения, выдают наглухо ошибку и шлют тебя подальше.
 
Назад
Сверху Снизу