StillPhelix
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Доброе время суток! Пробовал написать криптозащиту с контролем целостности в visual studio 2010. Программа должна копировать зашифрованную функцию в буфер, там её расшифровать, скопировать обратно, проверить целостность и запустить функцию проверки пользователя. Всё счастье заканчивается на проверке целостности. Ибо значение CRC программа выдаёт всё время разное. Собирал программу в visual studio 2010 в режиме Release. Исходник ниже. Код: #include<stdio.h> #include<shlwapi.h> #define PASSWD "+++" #define MAX_LEN 1023 #define MAX_CODE_SIZE (0x10*1024) #define OFFSET_1 0x42 #define OFFSET_2 0x67 #define x_original_1 0xc01b0574 #define x_original_2 0x44681574 #define x_original_all 0x44642222//контроль CRC. Это значение определить перед начальной шифровкой (выводится программой в случае несовпадения) #define x_crypt 0x66 #define size_chek_user 0xe6//размер зашифрованной функции int check_user() { char passwd[MAX_LEN]; fprintf(stderr,"Enter password:"); fgets(passwd,MAX_LEN,stdin); return strcmp(passwd,PASSWD); } int my_func() { if(check_user()) fprintf(stderr,"password ok\n"); else { fprintf(stderr,"wrong password\n"); exit(-1); } return 0; } int main() { DWORD a; int b=0; #pragma pack(1) union anti_hack { char buf[MAX_CODE_SIZE]; int local_var_1; int local_var_2; char gag_1[OFFSET_1-sizeof(int)*2]; int x_val_1; char gag_2[OFFSET_2-OFFSET_1-sizeof(int)]; int x_val_2; }; union anti_hack ZZZ; fprintf(stderr,"CodeControlIntegrity by StillPhelix\n"); VirtualProtect(&ZZZ,size_chek_user,PAGE_EXECUTE_READWRITE,&a); //расшифровка кода memcpy(&ZZZ,&check_user,size_chek_user); //расшифровываем в буфере for(int a=0;a<size_chek_user;a++) (*(char*)((int)&ZZZ+a))^=x_crypt; VirtualProtect(&ZZZ,size_chek_user,a,&a); VirtualProtect(&check_user,size_chek_user,PAGE_EXECUTE_READWRITE,&a); //копируем обратно memcpy(&check_user,&ZZZ,size_chek_user); VirtualProtect(&check_user,size_chek_user,a,&a); //явная проверка изменения кода for(int a=0;a<size_chek_user;a++) b+=*(int*)((int)&check_user+a); if(b!=x_original_all) { fprintf(stderr,"-ERR: invalid CRC (%x) hello, hacker\n",b); return 0; } //явная проверка валидности пользователя my_func(); //скрытый контроль ZZZ.local_var_1=2; ZZZ.local_var_2=2; sprintf(ZZZ.gag_1,"%d*%d=%d\n",ZZZ.local_var_1,ZZZ.local_var_2,ZZZ.local_var_1*ZZZ.local_var_2+((x_original_1^ZZZ.x_val_1)+(x_original_1^ZZZ.x_val_2))); printf("DEBUG: %x %x\n",ZZZ.x_val_1,ZZZ.x_val_2); fprintf(stderr,"%s",ZZZ.gag_1); return 0; } |
|