Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Безопасность, Шифрование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2011, 14:12   #1
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка Быстрый взлом или как нельзя защищать программу[wicked-style]

Здравствуйте! По мотивам темы, я решил показать свою версию защиты, которая взламывается за 6-ть секунд.

Вот файл архива - исполняемый файл создан 08.12.2010, что упрощает взлом раза в 3 . Защита - банальный if - прошу крякеров и просто интересующихся достать хеш (некоторые параметры железа) тестовой машины из этого исполняемого файла. Для пущей наглядности - отвязать от проверки этого условия.

Потом я выложу код(C++(Qt)) этой проверки.
Вложения
Тип файла: rar klest-crossword-0.2.8-win-x86.rar (4.43 Мб, 14 просмотров)
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 24.09.2011, 16:33   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

А чего это архив такой громадный? чтоб тяжелее искать хеш было среди кучи данных?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 24.09.2011, 21:31   #3
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Цитата:
Сообщение от NetSpace Посмотреть сообщение
А чего это архив такой громадный? чтоб тяжелее искать хеш было среди кучи данных?
Там всё с либами - вот отдельно запускаемый файл(для dial-up'а).
Вложения
Тип файла: zip klest-crossword.exe.zip (205.0 Кб, 9 просмотров)
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 22.10.2011, 00:23   #4
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Ладно, признаюсь. При простом открытии в IDA Pro, видно, что он упакован 2-а раза. UPX, сверху ASPack.
Задача вот в чём: кто сможет(захочет) распакует её и вытащит хеш. Я покажу код, чтобы начинающие могли увидеть, что много разных действий с этим хешем не приведут ни к чему хорошему. То есть это будет бессмыслено, при использовании простого IF.
Там нет функции с названием CheckPassword. Всё в коде файла main.
Дополнительно есть проверка распаковки файла: банальная проверка количества байтов у запущенной программы с тем значением, которое также вшито в неё. Плюс ко всему эти проверки есть у некоторых функций также непосредственно в коде, что тоже вычисляется достаточно просто(я предполагаю), по одинаковым инструкциям проверки. Некоторые переменные, участвующие в проверке слегка обфусцированы

ЗЫ: Мне и самому тоже интересно, за сколько действий и времени такая защита будет снята.
ЗЫЫ: Добавлю кармы в знак благодарности.
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 22.10.2011 в 01:45.
xwicked вне форума Ответить с цитированием
Старый 30.10.2011, 12:32   #5
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Так как это действительно простая защита, то если никто не отписался, это не значит, что её не смогли снять. Поэтому привожу код для Windows-проверки:
Код:
QString oi,
About64,//Бессмысленные названия переменных :)
Zerox,
H745,
H748;
#if defined(Q_WS_WIN)
oi = "7%7W77%7#37$6#7U>2K;9U?3K;9K20-571A087#570A-5-8";//Искомый хеш
QChar c(0xD);//Символ "CR"
oi.insert(10, c);//Вставка в 10-ую позицию в строке

DWORD dw1 = MAX_COMPUTERNAME_LENGTH + 1;
DWORD dw2;
wchar_t str1[dw1];
QString wdnb = "C:\\";
QString About32,
              Zero;

           if(GetComputerNameW(str1, &dw1))
               About32 = QString::fromUtf16(reinterpret_cast<ushort*>(str1));

           if(GetVolumeInformationW(reinterpret_cast<const WCHAR*>(wdnb.utf16()),NULL, 0, NULL, &dw2, NULL, NULL, 0))
                             Zero.setNum(dw2);

           if(About32.count() == 0 || Zero.count() == 0)
              {
                 QMessageBox::warning(0, "Detection warning",
                       "There was a problem when you verify Your computer to adapt the full version.\n"
                              "Please contact technical support(support@labfreetech.org)!");
                      return 0;
              }

                      H748.clear();
                      About64.clear();
                      Zerox.clear();

                      ushort iNum;
                      QString sNum,
                              iTemp,
                              iTent,
                              iTort;

                          for(int i = 0; i < About32.count(); i++)
                              {
                                  iNum = About32.at(i).unicode();
                                  sNum.setNum(iNum);
                                  About64.append(sNum);
                              }

                          for(int i = 0; i < Zero.count(); i++)
                              {
                                  iNum = Zero.at(i).unicode();
                                  sNum.setNum(iNum);
                                  Zerox.append(sNum);
                              }

                      iTemp.clear();
                      iTent.clear();
                      iTort.clear();
//Перемешивание полученных данных
                          for(int i = 0; i < 1000; i++)
                              {
                                  if(i < Zerox.count()) iTemp.append(Zerox.at(i));
                                  if(i < About64.count()) iTemp.append(About64.at(i));
                              }

                          for(int i = 0; i < iTemp.count(); i++)
                              {
                                  sNum.setNum(iTemp.at(i).unicode());
                                  iTent.append(iTemp.at(i));
                                  iTent.append(sNum);
                              }

                      iTemp.clear();
                      QChar cscr1;
                      bool bOk;

                          while(iTent.count() > 0)
                              {
                                  if(iTent.count() >= 2)
                                      {
                                          iTemp.clear();
                                          iTemp.append(iTent.at(0));
                                          iTemp.append(iTent.at(1));
                                          iNum = iTemp.toInt(&bOk, 10);
                                          cscr1 = QChar(iNum);
                                          iTort.append(cscr1);
                                          iTent.remove(0, 2);
                                      }

                                  if(iTent.count() == 1)
                                      {
                                          iTemp.clear();
                                          iTemp.append(iTent.at(0));
                                          iNum = iTemp.toInt(&bOk, 10);
                                          cscr1 = QChar(iNum);
                                          iTort.append(cscr1);
                                          iTent.remove(0, 1);
                                      }
                              }
//Банальная проверка: хеш + размер полученного хеша
            if(iTort != oi || iTort.count() != 54)
                {
                   QMessageBox::critical(0, "Detection error",
                    "The version was of unadapted to Your computer!\n"
                     "Please contact technical support(support@labfreetech.org).");
                   return 5;//Закрытие программы
                }

                      iTort.clear();
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 02.11.2011, 14:29   #6
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Linux-проверка(мне советовали использовать HAL через DBUS, но времени реализовать хватило только на это...):

Код:
#elif defined(Q_WS_X11)

QDir dirtemp("/tmp/labfreetech.org");

    if(!dirtemp.exists()) dirtemp.mkdir("/tmp/labfreetech.org");

//Получение информации об устройствах компьютера
H745 = "#!/bin/bash\nhal-device > /tmp/labfreetech.org/lft2\n";

QFile ofile("/tmp/labfreetech.org/lft1");
QTextStream odata(&ofile);
ofile.open(QIODevice::WriteOnly);
odata << H745;
ofile.close();

H745.clear();
UserManual->start("chmod 777 /tmp/labfreetech.org/lft1");
QDesktopServices::openUrl(QUrl("/tmp/labfreetech.org/lft1"));

//Задержка до следующей команды :)
    for(double i = 0; i < 100000000; i++){int z = 0; z++;}

QFile ofile2("/tmp/labfreetech.org/lft2");
QTextStream odata2(&ofile2);
ofile2.open(QIODevice::ReadOnly);
H745 = odata2.readAll();
ofile2.close();

//Оставить в переменной только серийник тома
H745.remove(0, H745.indexOf("storage_serial"));
H745.truncate(H745.indexOf("'"));
H745.remove(0, H745.lastIndexOf("_") + 1);

QString About32,
        Zero;

   if(H745.count() > 0)
       About32 = H745;

//Получение имени компьютера
H745 = "#!/bin/bash\nhostname > /tmp/labfreetech.org/lft4\n";

QFile ofile3("/tmp/labfreetech.org/lft3");
QTextStream odata3(&ofile3);
ofile3.open(QIODevice::WriteOnly);
odata3 << H745;
ofile3.close();

H745.clear();
UserManual->close();
UserManual->start("chmod 777 /tmp/labfreetech.org/lft3");
QDesktopServices::openUrl(QUrl("/tmp/labfreetech.org/lft3"));

    for(double i = 0; i < 100000000; i++){int z = 0; z++;}

QFile ofile4("/tmp/labfreetech.org/lft4");
QTextStream odata4(&ofile4);
ofile4.open(QIODevice::ReadOnly);
H745 = odata4.readAll();
ofile4.close();

    if(H745.count() > 0)
        Zero = H745;

    if(About32.count() == 0 || Zero.count() == 0)
        {
            QMessageBox::warning(0, tr("Detection warning"),
                tr("There was a problem when you verify Your computer to adapt the full version.\n"
                    "Please contact technical support(support@labfreetech.org)!"));
            return;
        }

H745.clear();
H748.clear();
About64.clear();
Zerox.clear();

ushort iNum;
QString sNum,
        iTemp,
        iTent,
        iTort;

    for(int i = 0; i < About32.count(); i++)
        {
            iNum = About32.at(i).unicode();
            sNum.setNum(iNum);
            About64.append(sNum);
        }

    for(int i = 0; i < Zero.count(); i++)
        {
            iNum = Zero.at(i).unicode();
            sNum.setNum(iNum);
            Zerox.append(sNum);
        }

iTemp.clear();
iTent.clear();
iTort.clear();

    for(int i = 0; i < 1000; i++)
        {
            if(i < Zerox.count()) iTemp.append(Zerox.at(i));
            if(i < About64.count()) iTemp.append(About64.at(i));
        }

    for(int i = 0; i < iTemp.count(); i++)
        {
            sNum.setNum(iTemp.at(i).unicode());
            iTent.append(iTemp.at(i));
            iTent.append(sNum);
        }

iTemp.clear();
                      QChar cscr1;
bool bOk;

    while(iTent.count() > 0)
        {
            if(iTent.count() >= 2)
                {
                    iTemp.clear();
                    iTemp.append(iTent.at(0));
                    iTemp.append(iTent.at(1));
                    iNum = iTemp.toInt(&bOk, 10);
                    cscr1 = QChar(iNum);
                    iTort.append(cscr1);
                    iTent.remove(0, 2);
                }

            if(iTent.count() == 1)
                {
                    iTemp.clear();
                    iTemp.append(iTent.at(0));
                    iNum = iTemp.toInt(&bOk, 10);
                    cscr1 = QChar(iNum);
                    iTort.append(cscr1);
                    iTent.remove(0, 1);
                }
        }

//Сохранить сгенерированный хеш в файл
QFile ofile5(QApplication::applicationDirPath() + "/" + tr("Adaptation_file.txt"));
QTextStream odata5(&ofile5);
ofile5.open(QIODevice::WriteOnly);
odata5 << iTent;
ofile5.close();

    if(iTent.count() > 0) QMessageBox::information(0, tr("Information"),
         tr("Congratulations! Full version can be adapted to work on Your computer."));

iTent.clear();

foreach (QString strFileName, dirtemp.entryList(QDir::Files))
      {
          if(strFileName != "") dirtemp.remove(strFileName);
      }

dirtemp.rmdir(dirtemp.path());
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Старый 02.11.2011, 14:38   #7
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка

Mac-проверка(тут я даже комментировать не буду... ):

Код:
                  #elif defined(Q_WS_MAC)

QDir dirtemp("/tmp/labfreetech.org");

    if(!dirtemp.exists()) dirtemp.mkdir("/tmp/labfreetech.org");

H745 = "#!/bin/bash\nhostinfo > /tmp/labfreetech.org/lft2\n";

QFile ofile("/tmp/labfreetech.org/lft1");
QTextStream odata(&ofile);
ofile.open(QIODevice::WriteOnly);
odata << H745;
ofile.close();

H745.clear();
UserManual->start("chmod 777 /tmp/labfreetech.org/lft1");
QDesktopServices::openUrl(QUrl("/tmp/labfreetech.org/lft1"));

    for(double i = 0; i < 100000000; i++){int z = 0; z++;}

QFile ofile2("/tmp/labfreetech.org/lft2");
QTextStream odata2(&ofile2);
ofile2.open(QIODevice::ReadOnly);
H745 = odata2.readAll();
ofile2.close();

QString About32,
        Zero;

   if(H745.count() > 0)
       About32 = H745;

H745 = "#!/bin/bash\nhostname > /tmp/labfreetech.org/lft4\n";

QFile ofile3("/tmp/labfreetech.org/lft3");
QTextStream odata3(&ofile3);
ofile3.open(QIODevice::WriteOnly);
odata3 << H745;
ofile3.close();

H745.clear();
UserManual->close();
UserManual->start("chmod 777 /tmp/labfreetech.org/lft3");
QDesktopServices::openUrl(QUrl("/tmp/labfreetech.org/lft3"));

    for(double i = 0; i < 100000000; i++){int z = 0; z++;}

QFile ofile4("/tmp/labfreetech.org/lft4");
QTextStream odata4(&ofile4);
ofile4.open(QIODevice::ReadOnly);
H745 = odata4.readAll();
ofile4.close();

    if(H745.count() > 0)
        Zero = H745;

    if(About32.count() == 0 || Zero.count() == 0)
        {
            QMessageBox::warning(0, tr("Detection warning"),
                tr("There was a problem when you verify Your computer to adapt the full version.\n"
                    "Please contact technical support(support@labfreetech.org)!"));
            return;
        }

H745.clear();
H748.clear();
About64.clear();
Zerox.clear();

ushort iNum;
QString sNum,
        iTemp,
        iTent,
        iTort;

    for(int i = 0; i < About32.count(); i++)
        {
            iNum = About32.at(i).unicode();
            sNum.setNum(iNum);
            About64.append(sNum);
        }

    for(int i = 0; i < Zero.count(); i++)
        {
            iNum = Zero.at(i).unicode();
            sNum.setNum(iNum);
            Zerox.append(sNum);
        }

iTemp.clear();
iTent.clear();
iTort.clear();

    for(int i = 0; i < 1000; i++)
        {
            if(i < Zerox.count()) iTemp.append(Zerox.at(i));
            if(i < About64.count()) iTemp.append(About64.at(i));
        }

    for(int i = 0; i < iTemp.count(); i++)
        {
            sNum.setNum(iTemp.at(i).unicode());
            iTent.append(iTemp.at(i));
            iTent.append(sNum);
        }

iTemp.clear();
                      QChar cscr1;
bool bOk;

    while(iTent.count() > 0)
        {
            if(iTent.count() >= 2)
                {
                    iTemp.clear();
                    iTemp.append(iTent.at(0));
                    iTemp.append(iTent.at(1));
                    iNum = iTemp.toInt(&bOk, 10);
                    cscr1 = QChar(iNum);
                    iTort.append(cscr1);
                    iTent.remove(0, 2);
                }

            if(iTent.count() == 1)
                {
                    iTemp.clear();
                    iTemp.append(iTent.at(0));
                    iNum = iTemp.toInt(&bOk, 10);
                    cscr1 = QChar(iNum);
                    iTort.append(cscr1);
                    iTent.remove(0, 1);
                }
        }

QFile ofile5(QApplication::applicationDirPath() + "/" + tr("Adaptation_file.txt"));
QTextStream odata5(&ofile5);
ofile5.open(QIODevice::WriteOnly);
odata5 << iTent;
ofile5.close();

    if(iTent.count() > 0) QMessageBox::information(0, tr("Information"),
         tr("Congratulations! Full version can be adapted to work on Your computer."));

iTent.clear();

foreach (QString strFileName, dirtemp.entryList(QDir::Files))
      {
          if(strFileName != "") dirtemp.remove(strFileName);
      }

dirtemp.rmdir(dirtemp.path());

                  #endif
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook
xwicked вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто может проверить программу на взлом? NetSpace Безопасность, Шифрование 5 24.09.2011 16:25
быстрый очень быстрый переход в документе Окоча Юра Microsoft Office Word 23 30.11.2010 16:27
Поток выполняется или прерван - нельзя запустить повторно boris-blade Общие вопросы .NET 0 02.04.2010 18:16
Написал программу, помогите натянуть Шейдеры или как нибудь модифицировать программу WMLite Паскаль, Turbo Pascal, PascalABC.NET 0 16.06.2009 13:57
быстрый вывод карты на экран или попиксельное создание бмп angel2c Общие вопросы C/C++ 2 17.12.2007 10:50