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

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

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

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

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

StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ема: Простейшая криптозащита
Доброе время суток!
Пробовал написать криптозащиту в visual studio 2010. Текстовые строки расшифровывать и шифровать получилось. А вот функции - нет.
Итак, история с функциями по порядку.
1)Откомпилировал исходник с ключами для линковщика (/DYNAMICBASE:NO), (/FIXED) и для сl (/Zi), Basic runtime checks (Default).
2)С помощью IDA определил размер шифруемой функции.
3)С помощью HIEW отксорил шифруемую функцию по 0х66.
 
Радостно запустил программу и оказалось, что криптор/декриптор записывает то, что он расшифровал не поверх расшифровываемой функции (у меня начинается с адреса .text.00401030), а с .text.00401005. А ведь там чужой код.
Вобщем, в итоге IDA мне сказала:

Цитата:
---------------------------
Warning
---------------------------
401034: The instruction at 0x401034 referenced memory at 0x65. The memory could not be read  
 
-> 0000000000000065 (exc.code c0000005, tid 4624)
---------------------------
OK    
---------------------------

А это код:

Цитата:
#include<stdio.h>
 
#define CRYPT_LEN 0x0b//длина
 
int for_crypt(int a,int b)
{
    return a+b;
}
 
void crypt_it(unsigned char*p,int c)
    {
        for(int a=0;a<c;a++)
            *p++^=0x66;
    }
 
int main()
{
    //расшифровываем защитную функцию
    crypt_it((unsigned char*)for_crypt,CRYPT_LEN);
    //выводим защитную функцию
    printf("%02xh",for_crypt(0x69,0x66));
    //зашифровываем обратно защитную функцию
    crypt_it((unsigned char*)for_crypt,CRYPT_LEN);
    return 0;
}

 
Как заставить этот код работать?

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
#pragma comment(linker, "/SECTION:.text,RWE") поставь в начале.
Или VirtualProtect(for_crypt, CRYPT_LEN, PAGE_EXECUTE_READWRITE, &newProt); на кусок кода, который надо менять.
Секция кода создаятся без прав писать туда.
 

Всего записей: 1570 | Зарегистр. 01-11-2004 | Отправлено: 17:52 19-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все симптомы повторяются в обоих случаях (visual studio 2010).
А IDA говорит:  
если VirtualProtect

Цитата:
---------------------------
Warning
---------------------------
40109F: The instruction at 0x40109F referenced memory at 0x40109F. The memory could not be  
 
executed -> 000000000040109F (exc.code c0000005, tid 5092)
---------------------------
OK    
---------------------------

если #pragma comment(linker, "/SECTION:.text,RWE")

Цитата:
---------------------------
Warning
---------------------------
401005: The instruction at 0x401005 referenced memory at 0x71. The memory could not be  
 
written -> 0000000000000071 (exc.code c0000005, tid 4364)
---------------------------
OK    
---------------------------

Исходник:

Цитата:
/#pragma comment(linker, "/SECTION:.text,RWE")
#include<stdio.h>
#include<Windows.h>
 
#define CRYPT_LEN 0x0b
 
int for_crypt(int a,int b)
{
    return a+b;
}
 
void crypt_it(unsigned char*p,int c)
    {
        int a;
        VirtualProtect(p,c,PAGE_EXECUTE_READWRITE,(PDWORD)&a);
        for(a=0;a<c;a++)
            *p++^=0x66;
        VirtualProtect(p,c,PAGE_READONLY,(PDWORD)&a);
    }
 
int main()
{
    //расшифровываем защитную функцию
    crypt_it((unsigned char*)for_crypt,CRYPT_LEN);
    //выводим защитную функцию
    printf("%02xh",for_crypt(0x69,0x66));
    //зашифровываем обратно защитную функцию
    crypt_it((unsigned char*)for_crypt,CRYPT_LEN);
    return 0;
}

 
 
Добавлено:
После Watcom программажалуется, что память не может быть прочитана (при VirtualProtect).

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

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

Код:
 
//#pragma comment(linker, "/SECTION:.text,RWE")
#include<stdio.h>
#include<Windows.h>
 
#define CRYPT_LEN 0x0b
//#pragma optimize("", no)
 
int for_crypt(int a,int b)
{
    return a+b;
}
 
void crypt_it(unsigned char*p,int c)
    {
        int a;
//        VirtualProtect(p,c,PAGE_EXECUTE_READWRITE,(PDWORD)&a);
        for(a=0;a<c;a++)
            *p++^=0x66;
//        VirtualProtect(p,c,PAGE_READONLY,(PDWORD)&a);
    }
 
int main()
{
    DWORD a;
    VirtualProtect(for_crypt, CRYPT_LEN, PAGE_EXECUTE_READWRITE, &a);
    crypt_it((unsigned char*)for_crypt,CRYPT_LEN);
    //расшифровываем защитную функцию
    crypt_it((unsigned char*)for_crypt,CRYPT_LEN);
    //выводим защитную функцию
    printf("%02xh",for_crypt(0x69,0x66));
    //зашифровываем обратно защитную функцию
    crypt_it((unsigned char*)for_crypt,CRYPT_LEN);
    VirtualProtect(for_crypt, CRYPT_LEN, a, &a);
    return 0;
}

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не работает.Убрал VirtualProtect из crypt_it не работает всёравно.
В последнем случае IDA говорит:
---------------------------
Warning
---------------------------
401005: The instruction at 0x401005 referenced memory at 0x71. The memory could not  
 
be written -> 0000000000000071 (exc.code c0000005, tid 4972)
---------------------------
OK    
---------------------------

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Без ассемблерного кода памяти 0х401000-0х401010 это сообщение ошибки безполезно.
 
С ctrl-c, ctrl-v скопировал код постом выше в студию и не работает?
 
И зачем Ida? В студии есть дебаггер. Собирай в debug, ставь бряки мышой слева от строк кода, F5, потом двигайся с F10, F11. Отладчики типа Ollydbg, Ida, итд обычно для более тяжёлых случаев предназначены.

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IDA - лучший дизассемблер. Более наглядный, чем в студии. Для шифрования IDA + HIEW очень удобный вариант. При отладке вытаскивает исходник с++ из проекта visual studio. В качестве отладчика IDA + WinDbg очень удобная вещь, особенно при обратной разработке.

Цитата:
С ctrl-c, ctrl-v скопировал код постом выше в студию и не работает?  

Да, но не работает.
 
Причина в следующем:
Visual studio по умолчанию вызывает нужную функцию через шлюз (call метка на jmp, а jmp посылает на нужную функцию.). Криптор шифрует этот jmp. Поэтому в строке
Цитата:
printf("%02xh",for_crypt(0x69,0x66));  
при вызове
Цитата:
for_crypt(0x69,0x66)
и возвращается ошибка (jmp, посылающий в нужное место искажен криптором). Без IDA в причине я бы не разобрался в причине.  
 
Как эту проблему с Visual studio 2010 решить?
 
 
 

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

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В release build такого быть не должно, только в debug.
Оптимизацию ещё можно включить с /Ox или в коде с #pragma optimize("s", on)
только __declspec(noinline)  int for_crypt() тогда надо.

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



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В Visual studio 2010 при режиме release build с настройками по умолчанию всё работает. В Watcom всё работает тоже.
А в режиме debug к *p, в крипторе, нужно добавить смещение на шифруемую функцию и тогда всё заработать должно (правда я не пробовал ибо в release ассемблерный код мне понравился больше).
ne_viens, огромное спасибо!

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 15:26 20-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