Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уничтожить функцию в runtime 
:(
    Опции темы
fridkaratel
Дата 27.1.2009, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



В-общем, хочется убрать всякую возможность определить ссылку на функцию, т.е. вызов функции...
Приблизительно так - если функция не нужна, то затереть ее или частично испортить...

Также интересует вопрос, как можно из неправильной ссылки на функцию сделать правильный...
Т.е. сделать void + int, например....

Это необходимо, т.к. приложение распространяется в двух версиях - демо и полной, т.е. через директиву #define вырезать функции из полной, превратив в демо не получится - надо как-то "портить" функции в рантайме...
PM   Вверх
Alexeis
Дата 27.1.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(fridkaratel @  27.1.2009,  16:07 Найти цитируемый пост)
Это необходимо, т.к. приложение распространяется в двух версиях - демо и полной, т.е. через директиву #define вырезать функции из полной, превратив в демо не получится - надо как-то "портить" функции в рантайме... 

  Вот это самое место где портить или не портить легко исправляется. ИМХО если речь идет о динамической загрузке, то лучше иметь 2е Dll зашифрованные разными ключами. В зависимости от типа ключа демо или нет распаковывать разные версии одной Dll. Не имея ключа взломщик не сможет извлечь полную Dll. Останется только вариант купить одну копию и ее распространять.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
fridkaratel
Дата 29.1.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Идея интересная - я к этому и склонялся... Но хотело бы без dll - поэтому и спросил про указатели и операции с ними...
Хочется как-то или перенаправить на другую функцию (прибавив к указателю, например, 0x12), или как-то заменять часть кода, перенаправляя результат в другой буфер...
PM   Вверх
Alexeis
Дата 29.1.2009, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Есть такая функция VirtualProtect, ей можно разблокировать страницы помеченные как ReadOnly, но нужно знать исходный адрес по которому производилось выделение. Разумеется что узнать его нельзя. В инете встречается пример ручной загрузки DLL без LoadLibrary, там память выделяется руками, потому можно узнать этот адрес и разблокировать код на запись. Еще могу посоветовать поискать исходники упаковщика кода, там тоже осуществляется запись исполняемого кода. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
fridkaratel
Дата 29.1.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Я использую упаковщик исполняемого кода... но одна защита - хорошо, а две - хорошо-хорошо ;)

Хочется сделать именно "увод" в сторону функционала, т.е. не сравнивать наподобие (if a == b) {} else {}, а сделать по-другому, без сравнения, именно оперируя указателями... потому как отловить, что куда - тяжелее, чем выдавать при сравнении всегда true (или false)...

Идея расшифровывать ту или иную часть хороша, но dll использовать не очень хочется...
PS: а если бы были две dll, то как бы они выглядели? хотя бы примерный код... может я просто еще не понимаю до конца всю концепцию....
PM   Вверх
Alexeis
Дата 29.1.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(fridkaratel @  29.1.2009,  16:23 Найти цитируемый пост)
PS: а если бы были две dll, то как бы они выглядели? хотя бы примерный код... может я просто еще не понимаю до конца всю концепцию.... 

  Да вот как раз так бы и были 
  
  if (IsDemoKey(key)) {unpack("Demolib.dll", "lib.dll", key);} else {unpack("Prolib.dll", "lib.dll", key);}

Финт в том что если взломщик заменит условный переход if на безусловный, то это приведет к тому что Prolib.dll будет расшифрована неверным ключом, т.е. вместо Dll будет мусор.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
xvr
Дата 29.1.2009, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Alexeis @ 29.1.2009,  17:40)
Цитата(fridkaratel @  29.1.2009,  16:23 Найти цитируемый пост)
PS: а если бы были две dll, то как бы они выглядели? хотя бы примерный код... может я просто еще не понимаю до конца всю концепцию.... 

  Да вот как раз так бы и были 
  
  if (IsDemoKey(key)) {unpack("Demolib.dll", "lib.dll", key);} else {unpack("Prolib.dll", "lib.dll", key);}

Финт в том что если взломщик заменит условный переход if на безусловный, то это приведет к тому что Prolib.dll будет расшифрована неверным ключом, т.е. вместо Dll будет мусор.

Кстати, точно так же можно зашифровать процедуры в самом exe'нике. 2 штуки с разным функционалом разными ключами. Шифровать в уже откомпилированном имадже, расшифровывать предварительно сняв защиту по записи (черея VirtualProtect)

PM MAIL   Вверх
fridkaratel
Дата 29.1.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Цитата(xvr @ 30.1.2009,  01:57)
Кстати, точно так же можно зашифровать процедуры в самом exe'нике. 2 штуки с разным функционалом разными ключами. Шифровать в уже откомпилированном имадже, расшифровывать предварительно сняв защиту по записи (черея VirtualProtect)

А можно поподробнее...
В качестве протектора использую Themid'у...
Там есть что-то, может быть как раз и это...

Но вот хочется реализовать часть защиты со своей стороны... ;)
PM   Вверх
Alexeis
Дата 29.1.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Кстати нашел пример затирания точки входа

Код

#include <windows.h>
#include <iostream.h>

void __declspec(naked) start(void)
{

}

void func()
{
   cout << "func()\n";
}

void __declspec(naked) end(void) 
{

}

void main()
{
    void * addr = func;

    DWORD dwCodeSize = ((DWORD)&end) - ((DWORD)&start);

    DWORD OldProtect;
    VirtualProtect(addr, dwCodeSize, PAGE_READWRITE, &OldProtect);

    BYTE f = *((BYTE *)(addr));

    *((BYTE *)(addr)) = 0xFF;
    *((BYTE *)(addr)) = f;

    DWORD NewProtect;
    VirtualProtect(addr, dwCodeSize, OldProtect, &NewProtect);

    func();
}



Отсюда http://forum.sources.ru/index.php?showtopic=153591&hl=

Ток нужно отрубить оптимизацию и не запускать под дебагом.

Добавлено через 4 минуты и 39 секунд
Цитата(xvr @  29.1.2009,  16:57 Найти цитируемый пост)

Кстати, точно так же можно зашифровать процедуры в самом exe'нике. 2 штуки с разным функционалом разными ключами

  С шифровкой отдельных функций дело непросто, дело в том что в них могут использоваться статические адреса других функций относительно базового адреса или переходы по статическому адресу. Когда грузиться Dll для исправления адресов используется таблица релоков, если у нас отдельная функция, то таблицы релоков нет, потому распаковать ее в произвольное место и запустить не удастся. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
xvr
Дата 29.1.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(fridkaratel @ 29.1.2009,  18:10)
Цитата(xvr @ 30.1.2009,  01:57)
Кстати, точно так же можно зашифровать процедуры в самом exe'нике. 2 штуки с разным функционалом разными ключами. Шифровать в уже откомпилированном имадже, расшифровывать предварительно сняв защиту по записи (черея VirtualProtect)

А можно поподробнее...
В качестве протектора использую Themid'у...
Там есть что-то, может быть как раз и это...

Но вот хочется реализовать часть защиты со своей стороны... ;)

Кто такой Themid не знаю, но шифровка своих функций делается довольно просто - в готовом exe'нике шифруются нужные функции (прямо в образе). Их адрес узнается из PE таблиц (например после tdump'а). Длинна берется фиксированная.
Расшифровка делается прямо в программе: 
Код

VirtualProtect(&my_function,R/W)
uncrypt(&my_function,<size>);
VirtualProtect(&my_function,R/O);


Цитата

С шифровкой отдельных функций дело непросто, дело в том что в них могут использоваться статические адреса других функций относительно базового адреса или переходы по статическому адресу. Когда грузиться Dll для исправления адресов используется таблица релоков, если у нас отдельная функция, то таблицы релоков нет, потому распаковать ее в произвольное место и запустить не удастся. 
 Не надо ничего никуда грузить, они уже там. Релоки в код не смотрят, так что ничего не испортится
PM MAIL   Вверх
Alexeis
Дата 29.1.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Цитата(xvr @  29.1.2009,  19:52 Найти цитируемый пост)
Релоки в код не смотрят, так что ничего не испортится 

  Ну если например есть jmp на некоторый адрес внутри функции, если мы функцию переместим в памяти, то при выполнении этого jmp произойдет переход неизвестно куда.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
xvr
Дата 30.1.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Alexeis @ 29.1.2009,  21:55)
Цитата(xvr @  29.1.2009,  19:52 Найти цитируемый пост)
Релоки в код не смотрят, так что ничего не испортится 

  Ну если например есть jmp на некоторый адрес внутри функции, если мы функцию переместим в памяти, то при выполнении этого jmp произойдет переход неизвестно куда.

Мы не будем эти функции никуда перемещать - они будут расшифровываться там же, где лежат. Т.е. функции есть в любом случае (до и после дешифровки), но до дешифровки они неработоспособны, т.к. их код зашифрован и с точки зрения процессора представляет собой практически мусор. Попытка их выполнить скорее всего приведет к падению программы. После расшифровки они содержат уже исполняемый код.

PM MAIL   Вверх
Alexeis
Дата 30.1.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



  Т.е. будет пост обработка после компиляции, с поиском нужного фрагмента, шифрованием и записью на тоже самое место. В принципе можно так сделать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
fridkaratel
Дата 30.1.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

Репутация: нет
Всего: нет



Это все интересно, но что-то в последних постах я мало что понял... smile

Так, получается, что я пишу код, компилирую, а потом обрабатываю exe-файл?

Или компилирую, смотрю список функций, потом делаю изменения в исходном коде - и еще раз компилирую... Так?
PM   Вверх
dumb
Дата 30.1.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



fridkaratel, я тебе так скажу: если найдется человек, который не поленится снять Themid'у, то твои "защиты" не создадут ему вообще никаких проблем.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1073 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.