По сабжу хочется разобраться. Сижу, думаю, как поправильней поступить (кроме покупки 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 и все будет работать.
Хотелось бы большего: шифровать
не тело функции,
но саму функцию, т.е. включая ее пролог/эпилог. Для того, хотя бы, чтобы скопировать нужный кусок в память, расшифровать->выполнить->затереть другим куском.
Вот только, естественно, если я вынесу АСМовые меточки за пределы функции, то опаньки, не срастется... Как бы это решить?