Рассуждения на тему защиты программ
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 08.09.03 15:25
Оценка:
По сабжу хочется разобраться. Сижу, думаю, как поправильней поступить (кроме покупки ASProtect ). Надумалось, после прочтения нескольких профильных статей, что один из методов, затрудняющий жизнь взломщику — это шифрование кода (например, для скрытия работы алгоритма проверки введенных данных). Собственно, надумал пока нечто вроде нижеследующего (несмотря на то, что привожу код, считаю данный форум наиболее подходящим):

Пример шифрования тела функции:


// функция, которая будет шифроваться
void __fastcall MyMessageBox(const char* Message)
{
_asm
 {
  JMP @@11
  DB '376A0AFFA00A433790EBB7BFDADD452A'
  @@11:
 }

   // куча рабочего кода...

   ::MessageBox(NULL,Message,NULL,MB_OK);

_asm
 {
  JMP @@22
  DB '562C28E05F14462392124CB378149193'
  @@22:
 }

}
//---------------------------------------------------------------------------

// а это проверка :))

void __fastcall TForm1::Button3Click(TObject *Sender)
{
try
 {
  DWORD dwOld;
  VirtualProtect(MyMessageBox,4096,PAGE_READWRITE,&dwOld);

  BYTE* bMess = (BYTE*) MyMessageBox;
  for(; ;)
   {
     if(memcmp(bMess,"376A0AFFA00A433790EBB7BFDADD452A",32) == 0)
      break;
      bMess++;
   }

  bMess += 32; // обходим первую метку

   for(; ;)
    {
      // расшифровываем все до начала второй метки...
      if(memcmp(bMess,"562C28E05F14462392124CB378149193",32) == 0)
        break;

       *bMess ^= 0x12;
       bMess++;
    }


   MyMessageBox("Hello!");
 }
 catch(...) {}
}
//---------------------------------------------------------------------------


Собственно, все хорошо. Достаточно в получившемся exe проксорить (ну или другой алгоритм, для эксперимента не суть) кусок кода с 0х12 и все будет работать.

Хотелось бы большего: шифровать не тело функции, но саму функцию, т.е. включая ее пролог/эпилог. Для того, хотя бы, чтобы скопировать нужный кусок в память, расшифровать->выполнить->затереть другим куском.

Вот только, естественно, если я вынесу АСМовые меточки за пределы функции, то опаньки, не срастется... Как бы это решить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.