Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Простейшая криптозащита с контролем целостности

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

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;
}

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 19:01 20-07-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если компилировать без /link /FIXED , ехе каждый раз будет грузиться в другой адрес из-за ASLR. Указатель на "Enter password:", соответственно, каждый раз будет другим.
Ещё смущает конструкция b+=*(int*)((int)&check_user+a);

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 21:55 20-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ещё смущает конструкция b+=*(int*)((int)&check_user+a);  
Контроль целостности. Программа просто проверяет не хакнули её ненароком. Просто проверяет команды. Если хоть одну изменить, то контрольная сумма не сойдётся с
Цитата:
#define x_original_all    0x44642222//контроль CRC. Это значение определить перед начальной шифровкой (выводится программой в случае несовпадения)  

Вродебы все в строке правильно...

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 22:16 20-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
И любой пароль воспринимает как привильный. А так не должно быть.
 
Добавлено:
Забыл добавить: контроль целостности проходит нормально. Проблема только с паролем.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 09:36 21-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В этой функции
Цитата:
int check_user()
{
    char passwd[MAX_LEN];
 
    fprintf(stderr,"Enter password:");
    fgets(passwd,MAX_LEN,stdin);
    return strcmp(passwd,PASSWD);
}  
strcmp(passwd,PASSWD) при любых раскладах возвращает 1. А ведь такого не должно быть.
 
 
Добавлено:
За пару часов интеллектуального секса проблема была решена. В функции

Код:
int check_user()
{
    char passwd[MAX_LEN];
 
    fprintf(stderr,"Enter password:");
    fgets(passwd,MAX_LEN,stdin);
    return strcmp(passwd,PASSWD);
}  
на ввод/вывод ставим cin и cout.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 16:03 21-07-2015
opencl26

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
можно было решить и полюбовно, в смысле стандартными функциями c

Всего записей: 319 | Зарегистр. 17-09-2014 | Отправлено: 15:50 22-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
можно было решить и полюбовно, в смысле стандартными функциями c
Как для этого исправить исходник?
 
 
Добавлено:
Ответ:
#include<shlwapi.h>
без этого strcmp может работать некорректно.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 20:31 22-07-2015
opencl26

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не знаю, нужно разбираться как и вам, знаю только:
майкрософт любит свои стандарты, а не posix, что не есть хорошо для гугла

Всего записей: 319 | Зарегистр. 17-09-2014 | Отправлено: 09:07 23-07-2015 | Исправлено: opencl26, 09:30 23-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема решена. Ссылка: http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=14323#1

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 11:38 23-07-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Простейшая криптозащита с контролем целостности


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru