Можно ли вызвать приватный метод класса, экспортированного из DLL?
Будет ли он скрыт от людей, которые хотели бы его использовать, но не должны?
спасибо :)
Можно ли вызвать экспортированный частный метод в С++
Ответы (2)
Да, это возможно, но вам нужно использовать грязные приемы приведения типов или полагаться на полунеопределенное поведение, но наверняка вы можете вызвать экспортированную функцию, независимо от ее статуса private/public.
Язык не обеспечивает защиту от злоумышленников. Это поможет всем играть по правилам, но не защитит от тех, кто пытается сломать систему.
Например:
- используйте
GetProcAddress()
, чтобы получить адрес функции, привести его к правильному типу функции-члена и вызвать его. - создайте модифицированный заголовочный файл класса, объявив все общедоступным (или просто добавьте статическую функцию
void crowbar()
), скомпилируйте его. (Неопределенное поведение, поскольку вы нарушаете правило одного определения, но, вероятно, оно сработает...)
Не полагайтесь на закрытое ключевое слово C++ для обеспечения безопасности.
GetProcAddress
, не существует правильного типа функции-члена. В большинстве случаев фактический вызов потребует написания некоторого ассемблера. Но это возможно.
- person Ben Voigt; 18.06.2011
this
, а соглашение о вызовах thiscall
не соответствует ни cdecl
, ни stdcall
, поскольку thiscall
передает указатель this
в регистр, а не использует стек. Возможно, он совместим с fastcall
, не помню.
- person Ben Voigt; 18.06.2011
thiscall
, но это должно быть неявно в типе ptr-to-member-function.
- person Macke; 18.06.2011
this
, и т. д. Функция «указатель на член» не является указателем на функцию. GetProcAddress
возвращает указатель на функцию, а не указатель на член. Результат GetProcAddress
должен быть приведен к правильному типу указателя функции (включая соглашение о вызовах), но я не думаю, что правильный тип не может быть написан на C++.
- person Ben Voigt; 18.06.2011
Если он появляется в таблице экспорта DLL, его можно вызвать с помощью GetProcAddress
и вызова возвращенного указателя на функцию. Существуют некоторые технические препятствия для получения правильного соглашения о вызовах, но это возможно (скорее всего, потребуется какой-то язык ассемблера).
Строго говоря, любая функция, для которой компилятор генерирует внешний экземпляр, может быть вызвана любым собственным кодом. Экспорт с помощью DLL значительно упрощает поиск адреса кода функции.