[text] 1

Viewer

  1. //---------------------------------------------------------------------------
  2.  
  3. #include <stdio.h>
  4. #include <vcl.h>
  5. #pragma hdrstop
  6.  
  7. #include "Unit1.h"
  8. //---------------------------------------------------------------------------
  9. #pragma package(smart_init)
  10. #pragma resource "*.dfm"
  11. TForm1 *Form1;
  12. //---------------------------------------------------------------------------
  13. __fastcall TForm1::TForm1(TComponent* Owner)
  14.         : TForm(Owner)
  15. {
  16. }
  17.  
  18. void  encryptCode();
  19.  
  20. // 3)Защита от отладчика на основе потери трассировочного прерывания
  21. void check_step_trace() {
  22.         __asm {
  23.                 push ss //помещает значение сегмента стека в стек.
  24.                 pop ss  //извлекает значение из стека и загружает его в сегмент стека.
  25.                 pushfd  //помещает значение флагов процессора в стек.
  26.                 pop eax //извлекает значение из стека и загружает его в регистр A
  27.                 test ah,1 //выполняет побитовое И между значением регистра ah и 1.
  28.                 jz no_step_trace // переходит к метке no_step_trace, если результат побитового И равен нулю (флаг ZF установлен).
  29.                 //Если флаг ZF не установлен (отладчик обнаружен).
  30.                 //Если флаг ZF установлен (отладчик не обнаружен).
  31.         }
  32.  
  33.         ShowMessage("Обнаружен отладчик! Step-Trace");
  34.  
  35. no_step_trace:
  36.         ShowMessage("не обнаружен отладчика! Step-Trace");
  37. }
  38.  
  39. // 5) Реализовать контроль целостности кода шифровщика
  40. void check_integrity() {
  41.         LPVOID lpAddress = (LPVOID)((char *)encryptCode+135); //Инициализация указателя lpAddress на адрес,
  42.                                                                                                                  //смещенный на 135 байт от начала encryptCode.
  43.         SIZE_T dwSize = 13;                                                          //Инициализация переменной dwSize с размером 13 байт
  44.         __asm{
  45.         db 0B3h,0D4h,01Ch,0B2h,097h,0EEh,01Fh,02Fh,076h,02Dh,011h  // ПОЛУЧЕННОЕ ЗАШИФРОВАННОЕ ЗНАЧЕНИЕ
  46. //              mov eax, lpAddress //загружает адрес lpAddress в регистр A
  47. //              mov ebx, eax          //копирует значение из eax в B
  48. //              xor edx, edx       //обнуляет регистр D
  49. //              mov dl, 0          //устанавливает младший байт регистра D в 0
  50. //              mov dh, 0xCE       //устанавливает старший байт регистра D в 0xCE.
  51.         }
  52.  
  53.         for (int i = 0; i < dwSize; i++) { //Цикл проверки целостности:
  54.                   __asm{
  55.                           mov eax, ebx           //Цикл выполняется для каждого байта в диапазоне от lpAddress до lpAddress + dwSize.
  56.                           xor dl, byte ptr [eax] //Внутри цикла происходит XOR операция между байтом данных и регистром dl.
  57.                           inc eax
  58.                           mov ebx, eax
  59.                   }
  60.         }
  61.  
  62.         __asm{ //Проверка целостности
  63.                 cmp dh, dl // сравнивает старший байт dh с результатом XOR операции в регистре dl.
  64.                 jz no_breakpoint //если значения равны, то выполняется метка no_breakpoint
  65.         }
  66.         ShowMessage("Код изменен");
  67. no_breakpoint:
  68. }
  69.  
  70. // 4)Реализовать защиту от дизассемблирования методом шифрования
  71. void  encryptCode() {
  72.         LPVOID lpAddress = (LPVOID)((char *)check_integrity+32);//Инициализация указателя lpAddress на адрес, смещенный на 32 байта от начала check_integrity.
  73.         SIZE_T dwSize = 11;        // Инициализация переменной dwSize с размером 11 байт.
  74.         DWORD flNewProtect = PAGE_EXECUTE_READWRITE ;  //Инициализация переменной flNewProtect с флагом защиты памяти PAGE_EXECUTE_READWRITE.
  75.         DWORD flOldProtect;   // Инициализация переменной flOldProtect без значения.
  76.  
  77.          if(VirtualProtect( //Проверка защиты памяти: VirtualProtect() - функция, которая изменяет атрибуты защиты указанной области памяти
  78.                 lpAddress,
  79.                 dwSize,
  80.                 flNewProtect,
  81.                 &flOldProtect
  82.         ) == false){
  83.                 ShowMessage("Error VirtualProtect");
  84.                 return;//if(VirtualProtect() == false) - проверяет, успешно ли изменилась защита памяти. Если нет, то выводится сообщение об ошибке и функция завершается.
  85.         }
  86.  
  87.         __asm{
  88.                  mov eax, lpAddress //загружает адрес lpAddress в регистр eax.
  89.                  mov ebx, eax       //копирует значение из eax в ebx.
  90.         }
  91.  
  92.         for (int i = 0; i < dwSize; i++) { // Цикл шифрования:
  93.                  __asm{
  94.                         mov eax, ebx
  95.                         xor byte ptr [eax], 19  // XOR операция с байтом данных и числом 19
  96.                         not byte ptr [eax]      // NOT операция над байтом данных.
  97.                         rol byte ptr [eax], 7   // Циклический сдвиг влево на 7 бит байта данных.
  98.                         inc eax
  99.                         mov ebx, eax
  100.                 }
  101.         }
  102. }
  103.  
  104. // Алгоритм расшифрования
  105. void decryptCode() {
  106.         LPVOID lpAddress = (LPVOID)((char *)check_integrity+32);
  107.         SIZE_T dwSize = 11;
  108.         DWORD flNewProtect = PAGE_EXECUTE_READWRITE ;
  109.         DWORD flOldProtect;
  110.  
  111.          if(VirtualProtect(
  112.                 lpAddress,
  113.                 dwSize,
  114.                 flNewProtect,
  115.                 &flOldProtect
  116.         ) == false){
  117.                 ShowMessage("Error VirtualProtect");
  118.                 return;
  119.         }
  120.  
  121.         __asm{
  122.                  mov eax, lpAddress
  123.                  mov ebx, eax
  124.         }
  125.  
  126.         for (int i = 0; i < dwSize; i++) {
  127.                  __asm{
  128.                         mov eax, ebx
  129.  
  130.                         ror byte ptr [eax], 7
  131.                         not byte ptr [eax]
  132.                         xor byte ptr [eax], 4
  133.  
  134.                         inc eax
  135.                         mov ebx, eax
  136.                 }
  137.         }
  138. }
  139. //---------------------------------------------------------------------------
  140.  
  141. // 2)Реализовать привязку с использованием команды CPUID к семейству (family) и типу (type) ЦП
  142. void __fastcall TForm1::bSetClick(TObject *Sender)
  143. {
  144.         check_step_trace(); // вызов функции для проверки наличия отладчика
  145.         decryptCode();
  146.         check_integrity();  // вызов функции для проверки целостности кода
  147.  
  148.         unsigned long ulCPUparam (0);
  149.         unsigned long t1, t2;
  150.    t1 = GetTickCount(); // Запись текущего времени в переменную t1.
  151.    // считывание хар-к процессора
  152.         __asm {
  153.                 mov eax,1  //загружает значение 1 в регистр eax.
  154.                 cpuid      //выполняет инструкцию CPUID для получения информации о процессоре
  155.                 and eax, 0x00003f00     // выделеним сведения о type, family
  156.                 mov ulCPUparam, eax     //сохраняет результат в переменной ulCPUparam.
  157.         }
  158.         t2 = GetTickCount();
  159.  
  160.         if ((t2-t1)>1000) {
  161.                 ShowMessage("Обнаружена отладка");    //нужно поставить ТО на асемблере
  162.         }
  163.  
  164.         FILE *f = fopen("cpu","wb");  //открывает файл "cpu" для записи в бинарном режиме.
  165.         if (f == NULL) {
  166.                 ShowMessage ("Error fopen");
  167.                 return;
  168.         }
  169.         fwrite(&ulCPUparam, 1, 4, f); // записывает значение ulCPUparam в файл.
  170.         fclose(f);                    //закрывает файл после записи.
  171.  
  172.         mLog->Lines->Add("Параметры ЦП сохранены");
  173. }
  174. //---------------------------------------------------------------------------
  175. void __fastcall TForm1::bCheckClick(TObject *Sender)
  176. {
  177.         unsigned long ulCPUparam (0), ulCorrectCPUparam(0);
  178.  
  179.    // считывание хар-к процессора
  180.         __asm {
  181.                 mov eax,1  //загружает значение 1 в регистр eax.
  182.                 cpuid      //выполняет инструкцию CPUID для получения информации о процессоре.
  183.                 and eax, 0x00003f00     // выделеним сведения о type, famile
  184.  
  185.                 mov ulCPUparam, eax //сохраняет результат в переменной ulCPUparam.
  186.         }
  187.  
  188.         FILE *f = fopen("cpu","rb"); //открывает файл "cpu" для чтения в бинарном режиме.
  189.         if (f == NULL) {
  190.                 ShowMessage ("Error fopen");
  191.                 return;
  192.         }
  193.         fread(&ulCorrectCPUparam, 1, 4, f); //считывает значение из файла в переменную ulCorrectCPUparam.
  194.         fclose(f);  //закрывает файл после чтения.
  195.  
  196.         if (ulCPUparam != ulCorrectCPUparam) { //сравнивает значения ulCPUparam и ulCorrectCPUparam.
  197.                 mLog->Lines->Add("Параметры ЦП не совпадают");
  198.         }
  199.         else
  200.                 mLog->Lines->Add("Параметры ЦП правильные");
  201.  
  202.         //encryptCode();
  203.  
  204. }
  205. //---------------------------------------------------------------------------
  206.  
  207. // 1)экзотическое сравнение значений переменных контроля ввода правильности регистрационного кода
  208. void __fastcall TForm1::bCheckRegClick(TObject *Sender)
  209. {
  210.         String regNum = "6666";
  211.         String test = "";
  212.         test = ((AnsiString)RegEdit->Text).c_str();
  213.         if (test.IsEmpty()) {  //Проверяется, является ли переменная test пустой строкой. Если да, выводится сообщение о том, что регистрационный код не может быть пустым.
  214.                 mLog->Lines->Add("Регистрационный код не может быть пустым");
  215.                 ShowMessage("Регистрационный код не может быть пустым");
  216.                 return;
  217.     }
  218.         try { // Начало блока, в котором выполняется проверка регистрационного кода. Однако, выражение 612/(regNum^test); содержит ошибку.
  219.                 612/(regNum^test);
  220.                 mLog->Lines->Add("Ошибка регистрационного кода");
  221.                 ShowMessage("Ошибка регистрационного кода");
  222.         }
  223.         catch (...) { //Если происходит исключение (exception), выводится сообщение о том, что регистрационный код верный.
  224.                 mLog->Lines->Add("Правильный регистрационный код");
  225.                 ShowMessage("Правильный регистрационный код");
  226.         }
  227. }
  228. //---------------------------------------------------------------------------
  229.  
  230.  

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: