- //---------------------------------------------------------------------------
- #include <stdio.h>
- #include <vcl.h>
- #pragma hdrstop
- #include "Unit1.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma resource "*.dfm"
- TForm1 *Form1;
- //---------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- }
- void encryptCode();
- // 3)Защита от отладчика на основе потери трассировочного прерывания
- void check_step_trace() {
- __asm {
- push ss //помещает значение сегмента стека в стек.
- pop ss //извлекает значение из стека и загружает его в сегмент стека.
- pushfd //помещает значение флагов процессора в стек.
- pop eax //извлекает значение из стека и загружает его в регистр A
- test ah,1 //выполняет побитовое И между значением регистра ah и 1.
- jz no_step_trace // переходит к метке no_step_trace, если результат побитового И равен нулю (флаг ZF установлен).
- //Если флаг ZF не установлен (отладчик обнаружен).
- //Если флаг ZF установлен (отладчик не обнаружен).
- }
- ShowMessage("Обнаружен отладчик! Step-Trace");
- no_step_trace:
- ShowMessage("не обнаружен отладчика! Step-Trace");
- }
- // 5) Реализовать контроль целостности кода шифровщика
- void check_integrity() {
- LPVOID lpAddress = (LPVOID)((char *)encryptCode+135); //Инициализация указателя lpAddress на адрес,
- //смещенный на 135 байт от начала encryptCode.
- SIZE_T dwSize = 13; //Инициализация переменной dwSize с размером 13 байт
- __asm{
- db 0B3h,0D4h,01Ch,0B2h,097h,0EEh,01Fh,02Fh,076h,02Dh,011h // ПОЛУЧЕННОЕ ЗАШИФРОВАННОЕ ЗНАЧЕНИЕ
- // mov eax, lpAddress //загружает адрес lpAddress в регистр A
- // mov ebx, eax //копирует значение из eax в B
- // xor edx, edx //обнуляет регистр D
- // mov dl, 0 //устанавливает младший байт регистра D в 0
- // mov dh, 0xCE //устанавливает старший байт регистра D в 0xCE.
- }
- for (int i = 0; i < dwSize; i++) { //Цикл проверки целостности:
- __asm{
- mov eax, ebx //Цикл выполняется для каждого байта в диапазоне от lpAddress до lpAddress + dwSize.
- xor dl, byte ptr [eax] //Внутри цикла происходит XOR операция между байтом данных и регистром dl.
- inc eax
- mov ebx, eax
- }
- }
- __asm{ //Проверка целостности
- cmp dh, dl // сравнивает старший байт dh с результатом XOR операции в регистре dl.
- jz no_breakpoint //если значения равны, то выполняется метка no_breakpoint
- }
- ShowMessage("Код изменен");
- no_breakpoint:
- }
- // 4)Реализовать защиту от дизассемблирования методом шифрования
- void encryptCode() {
- LPVOID lpAddress = (LPVOID)((char *)check_integrity+32);//Инициализация указателя lpAddress на адрес, смещенный на 32 байта от начала check_integrity.
- SIZE_T dwSize = 11; // Инициализация переменной dwSize с размером 11 байт.
- DWORD flNewProtect = PAGE_EXECUTE_READWRITE ; //Инициализация переменной flNewProtect с флагом защиты памяти PAGE_EXECUTE_READWRITE.
- DWORD flOldProtect; // Инициализация переменной flOldProtect без значения.
- if(VirtualProtect( //Проверка защиты памяти: VirtualProtect() - функция, которая изменяет атрибуты защиты указанной области памяти
- lpAddress,
- dwSize,
- flNewProtect,
- &flOldProtect
- ) == false){
- ShowMessage("Error VirtualProtect");
- return;//if(VirtualProtect() == false) - проверяет, успешно ли изменилась защита памяти. Если нет, то выводится сообщение об ошибке и функция завершается.
- }
- __asm{
- mov eax, lpAddress //загружает адрес lpAddress в регистр eax.
- mov ebx, eax //копирует значение из eax в ebx.
- }
- for (int i = 0; i < dwSize; i++) { // Цикл шифрования:
- __asm{
- mov eax, ebx
- xor byte ptr [eax], 19 // XOR операция с байтом данных и числом 19
- not byte ptr [eax] // NOT операция над байтом данных.
- rol byte ptr [eax], 7 // Циклический сдвиг влево на 7 бит байта данных.
- inc eax
- mov ebx, eax
- }
- }
- }
- // Алгоритм расшифрования
- void decryptCode() {
- LPVOID lpAddress = (LPVOID)((char *)check_integrity+32);
- SIZE_T dwSize = 11;
- DWORD flNewProtect = PAGE_EXECUTE_READWRITE ;
- DWORD flOldProtect;
- if(VirtualProtect(
- lpAddress,
- dwSize,
- flNewProtect,
- &flOldProtect
- ) == false){
- ShowMessage("Error VirtualProtect");
- return;
- }
- __asm{
- mov eax, lpAddress
- mov ebx, eax
- }
- for (int i = 0; i < dwSize; i++) {
- __asm{
- mov eax, ebx
- ror byte ptr [eax], 7
- not byte ptr [eax]
- xor byte ptr [eax], 4
- inc eax
- mov ebx, eax
- }
- }
- }
- //---------------------------------------------------------------------------
- // 2)Реализовать привязку с использованием команды CPUID к семейству (family) и типу (type) ЦП
- void __fastcall TForm1::bSetClick(TObject *Sender)
- {
- check_step_trace(); // вызов функции для проверки наличия отладчика
- decryptCode();
- check_integrity(); // вызов функции для проверки целостности кода
- unsigned long ulCPUparam (0);
- unsigned long t1, t2;
- t1 = GetTickCount(); // Запись текущего времени в переменную t1.
- // считывание хар-к процессора
- __asm {
- mov eax,1 //загружает значение 1 в регистр eax.
- cpuid //выполняет инструкцию CPUID для получения информации о процессоре
- and eax, 0x00003f00 // выделеним сведения о type, family
- mov ulCPUparam, eax //сохраняет результат в переменной ulCPUparam.
- }
- t2 = GetTickCount();
- if ((t2-t1)>1000) {
- ShowMessage("Обнаружена отладка"); //нужно поставить ТО на асемблере
- }
- FILE *f = fopen("cpu","wb"); //открывает файл "cpu" для записи в бинарном режиме.
- if (f == NULL) {
- ShowMessage ("Error fopen");
- return;
- }
- fwrite(&ulCPUparam, 1, 4, f); // записывает значение ulCPUparam в файл.
- fclose(f); //закрывает файл после записи.
- mLog->Lines->Add("Параметры ЦП сохранены");
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::bCheckClick(TObject *Sender)
- {
- unsigned long ulCPUparam (0), ulCorrectCPUparam(0);
- // считывание хар-к процессора
- __asm {
- mov eax,1 //загружает значение 1 в регистр eax.
- cpuid //выполняет инструкцию CPUID для получения информации о процессоре.
- and eax, 0x00003f00 // выделеним сведения о type, famile
- mov ulCPUparam, eax //сохраняет результат в переменной ulCPUparam.
- }
- FILE *f = fopen("cpu","rb"); //открывает файл "cpu" для чтения в бинарном режиме.
- if (f == NULL) {
- ShowMessage ("Error fopen");
- return;
- }
- fread(&ulCorrectCPUparam, 1, 4, f); //считывает значение из файла в переменную ulCorrectCPUparam.
- fclose(f); //закрывает файл после чтения.
- if (ulCPUparam != ulCorrectCPUparam) { //сравнивает значения ulCPUparam и ulCorrectCPUparam.
- mLog->Lines->Add("Параметры ЦП не совпадают");
- }
- else
- mLog->Lines->Add("Параметры ЦП правильные");
- //encryptCode();
- }
- //---------------------------------------------------------------------------
- // 1)экзотическое сравнение значений переменных контроля ввода правильности регистрационного кода
- void __fastcall TForm1::bCheckRegClick(TObject *Sender)
- {
- String regNum = "6666";
- String test = "";
- test = ((AnsiString)RegEdit->Text).c_str();
- if (test.IsEmpty()) { //Проверяется, является ли переменная test пустой строкой. Если да, выводится сообщение о том, что регистрационный код не может быть пустым.
- mLog->Lines->Add("Регистрационный код не может быть пустым");
- ShowMessage("Регистрационный код не может быть пустым");
- return;
- }
- try { // Начало блока, в котором выполняется проверка регистрационного кода. Однако, выражение 612/(regNum^test); содержит ошибку.
- 612/(regNum^test);
- mLog->Lines->Add("Ошибка регистрационного кода");
- ShowMessage("Ошибка регистрационного кода");
- }
- catch (...) { //Если происходит исключение (exception), выводится сообщение о том, что регистрационный код верный.
- mLog->Lines->Add("Правильный регистрационный код");
- ShowMessage("Правильный регистрационный код");
- }
- }
- //---------------------------------------------------------------------------
[text] 1
Viewer
*** This page was generated with the meta tag "noindex, nofollow". This happened because you selected this option before saving or the system detected it as spam. This means that this page will never get into the search engines and the search bot will not crawl it. There is nothing to worry about, you can still share it with anyone.
Editor
You can edit this paste and save as new:
File Description
- 1
- Paste Code
- 23 Apr-2024
- 10.75 Kb
You can Share it:
Latest Code Pastes