Можно ли вызвать экспортированный "частный" метод в C ++ - PullRequest
2 голосов
/ 18 июня 2011

Можно ли вызвать закрытый метод класса, экспортированного из DLL?
Будет ли это скрыто от людей, которые хотели бы использовать его, но не должны?
спасибо:)

Ответы [ 2 ]

4 голосов
/ 18 июня 2011

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

Язык не обеспечивает защиту от злоумышленников. Это поможет всем играть по правилам, но не защитит тех, кто пытается взломать систему.

Например:

  • используйте GetProcAddress() для получения адреса функции, приведите его к нужному типу функции-члена и вызовите его.
  • создайте модифицированный заголовочный файл класса, объявив все как public (или просто добавьте статическую функцию, void crowbar()), скомпилируйте его. (Неопределенное поведение, поскольку вы нарушаете Правило единого определения, но оно, вероятно, будет работать ...)

Не полагайтесь на частное ключевое слово C ++ для обеспечения безопасности.

1 голос
/ 18 июня 2011

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

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

...