Как скрыть экспортирующие функции в DLL - PullRequest
1 голос
/ 11 мая 2009

Я не хочу, чтобы пользователь видел все функции экспорта через зависимость в моей DLL, есть ли способ сделать это? Я завершаю свою DLL с C ++ и MS Visual Studio.

Ответы [ 7 ]

5 голосов
/ 12 мая 2009

Другим вариантом может быть создание экспортированной функции, которая будет возвращать массив адресов функций, которые вы хотели бы скрыть - как только у вас есть эти адреса, вы можете вызвать их напрямую

static void** Funcs = {&foo, &foo1, &foo2, 0};

__declspec (dllexport) void* GetFuncs (void)
{
   return &Funcs;
}

в вашем исполняемом файле вы можете сделать следующее

void** Funcs = GetFuncs();

(*Funcs[0]) (1, 2, 3);
4 голосов
/ 11 мая 2009

Используйте файл * .def и используйте атрибут NONAME, чтобы предотвратить экспорт имени: см. Экспорт функций из DLL по порядку, а не по имени ... есть пример здесь .

3 голосов
/ 11 мая 2009

Это действительно неловко, но если вы не хотите, чтобы другие даже видели порядковые номера, вы можете обернуть свои функции с помощью COM. COM DLL предоставляет только общие функции COM, поэтому ваши будут скрыты. Затем существуют методы использования библиотеки DLL без предварительной ее регистрации, поэтому в системе невозможно найти информацию о классе COM, который вы будете использовать. Это определенно странная причина использовать COM, но запрос также довольно необычен ...

2 голосов
/ 14 мая 2009

IMO, использующий NONAME, для этой цели бесполезен - он не скрывает зависимости. Зависимости все равно будут отображаться (с использованием порядковых номеров). И ваши основные пользователи по-прежнему смогут получить к ним доступ через GetProcAddress.

Я думаю, вам придется использовать более сложный подход - например, решения, предложенные Eran.

1 голос
/ 16 августа 2014

Пожалуйста, не пытайтесь скрыть свой доступ внутри COM-объекта, думая, что он будет скрыт. Прочтите эту статью Перечислите методы COM-объектов (IDispatch), используя ATL? , чтобы увидеть, как кто-то может проверять COM DLL на наличие имен функций.

Дополнительно желательно скрыть имена экспортируемых функций. Это желательно, когда ваша DLL предназначена для вашего собственного использования через другие модули кода, и она делает что-то, что только вы хотите, чтобы ваш вызывающий код имел доступ. В эту категорию могут входить алгоритмические торговые секреты.

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

0 голосов
/ 11 мая 2009

Нет, суть экспорта в том, что они ВИДИМЫ.

Это короткий ответ. Длинный ответ включает в себя файлы .def. Вы можете указать компоновщику превратить ваши функции C в индексы, используя [файл определения] (http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx).

0 голосов
/ 11 мая 2009

Действительно простой способ - обернуть его в упаковщик, например UPX .
Экспортируется только то, что UPX использует для распаковки файла в память

...