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

seller
Забаненный
Статус
Оффлайн
Регистрация
19 Авг 2017
Сообщения
343
Реакции[?]
118
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Иногда в программах необходимо использовать возможность проверки типа носителя или его серийный номер. Причины могут быть разными от банального контроля устройств в системе до средств защит использующих привязку к железу. Сейчас я вам покажу как с помощью 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. Тоже достаточно простая функция, однако использует параметров значительно больше.

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

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

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

Смотрим пример:
Код:
#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();
}

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

Код:
GetVolumeInformationA(NULL, VolumeNameBuffer,100,
&drive_sn,sz,fs,FileSystemNameBuffer,100);
 
Участник
Статус
Оффлайн
Регистрация
23 Фев 2017
Сообщения
612
Реакции[?]
507
Поинты[?]
0
Я не против копипасты с других форумах, но главное что эта с+р было полезной, чтобы подменить серийник надо обладать минимумом знаний в реверсинге, дебажишь, смотришь с чем сравнивает программа, а далее меняешь свой серийник на тот что сравнивает, или наоборот
 
Начинающий
Статус
Оффлайн
Регистрация
10 Дек 2016
Сообщения
141
Реакции[?]
28
Поинты[?]
0
Я не против копипасты с других форумах, но главное что эта с+р было полезной, чтобы подменить серийник надо обладать минимумом знаний в реверсинге, дебажишь, смотришь с чем сравнивает программа, а далее меняешь свой серийник на тот что сравнивает, или наоборот
А этот вообще хукается на изи, не говоря о 100500 программах которые меняют VolumeID
 
Начинающий
Статус
Оффлайн
Регистрация
26 Ноя 2017
Сообщения
17
Реакции[?]
1
Поинты[?]
0
Неплохая реализация, но у меня при себе самописная привязка с самописными пхпшниками, которую уж не подменишь просто так.
 
Забаненный
Статус
Оффлайн
Регистрация
8 Мар 2017
Сообщения
313
Реакции[?]
37
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ну такое. Самое лучшее - это с веб обвязкой.
Скрывать процесс.
Делать антидамп.
Антидебаг.
Прописать классы программ для реверса( типо PH.exe, snif.exe)
Делать проверку при запуске лоадера, есть ли такие активные процессы, если есть, убиваем процесс, делаем запрос на сервер и записываем ключ человека в таблицу с баном( с указанием софта, который был открыт, или открывался при открытом лоадере)
 
Начинающий
Статус
Оффлайн
Регистрация
10 Май 2018
Сообщения
12
Реакции[?]
7
Поинты[?]
0
Я не против копипасты с других форумах, но главное что эта с+р было полезной, чтобы подменить серийник надо обладать минимумом знаний в реверсинге, дебажишь, смотришь с чем сравнивает программа, а далее меняешь свой серийник на тот что сравнивает, или наоборот
Против таких реверсеров-новичков, программисты делают антидебагеры, а ещё делают проверку на стороне сервера и в случае если допустим у тебя нет интернет соединения, выдают наглухо ошибку и шлют тебя подальше.
 
Сверху Снизу