绕过private成员函数访问限制
来源:互联网 发布:访客网络主人网络 编辑:程序博客网 时间:2024/06/05 02:52
先写个类来说明问题
class TestClass{public:void PublicFunc(){cout<<"PublicFunc\n";}private:virtual void PrivateFunc(){cout<<"PrivateFunc\n";}};TestClass testClass;testClass.PublicFunc();//No problemtestClass.PrivateFunc();//Compile Err
正如注释,第二个调用编译器会报错;总是好奇,想绕过private的限制(纯属蛋疼)。
(另示例中的私有成员函数有virtual虚函数限定符)
为了能够直接访问私有成员函数,想必要拿到其成员函数指针:
eg
typedef void (TestClass::* pPrivateFunc)();
pPrivateFunc func = &TestClass::PrivateFunc;//当然这种方式是欺骗不了编译器了
当然这样也不可以:
DWORD dwFooAddrPtr = 0;
dwFooAddrPtr = (DWORD)&TestClass:PrvateFunc;//Err
dwFooAddrPtr = reinterprt_cast<DWORD>(&TestClass:PrvateFunc);//Err
用union 来骗过编译器
template<class Tdst,class Tsrc>Tdst union_cast(Tsrc src){union{Tsrc _src;Tdst _dst;}format;format._src = src;return format._dst;}
好了,下面干活了,至于怎么从对象地址获取虚函数表我就不多说了:
typedef void (__stdcall* pPrivateFunc)();
DWORD* pDwVt = union_cast<DWORD*>(&testClass);
DWORD* pdwVt0 = (DWORD*)*pDwVt;
pPrivateFunc pfunc = unino_cast<pPrivateFunc>(*pdwVt0);
if(pfunc)
{
pfunc();
}
好了,这样就可以顺利调用类私有成员函数;但是在实际测试中,虽然能够进入私有成员函数,但是无法访问其成员变量,就显得这么做没有任何意义;
不过稍加思考,其实C++调用其成员函数是,默认会在ecx寄存器里保存this指针,据此加了个patch,就可以解决这个问题了:
if(pfunc)
{
__asm
{
lea eax,dword ptr[testClass]
mov ecx,eax
}
pfunc()
}
至此理论上完美解决了标题的问题了,不过实际应用中没有什么应用价值,只不过是对C++的成员函数模拟了一下。
- 绕过private成员函数访问限制
- 通过虚函数表访问private成员
- C++ 如何突破private成员的访问限制
- friend成员函数不受public/protected/private的限制
- ruby 绕过private方法的限制,直接调用private方法
- C++:private成员的访问
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- c++ public, protected, private成员变量,成员函数继承和访问规则实例代码
- C++通过宏定义绕过private访问权限<技巧>
- 12. 访问限制public/private/protected
- C++拷贝构造函数可以访问传入对象的private成员变量
- 品private成员的访问控制
- 用指针访问类中private成员
- 怎样访问private:static中的数据成员
- C++用指针访问private 成员
- 如何访问类中的private成员变量
- C++成员访问限定符 private public
- Linux之初VI,用户,权限,FTP,JDK+Tomcat5+MySql使用
- Tomcat解压版配置说明
- 软件安装时x86与x64软件区别
- packageManager resolveInfo相关使用
- Struts中Resources cannot be null错误
- 绕过private成员函数访问限制
- Ant和JUnit结合进行单元测试 ant 软件包 org.junit 不存在
- EJB下remote not bound 错误
- Crontab 详解
- JS 打开一个模式窗口,使用Cookie传递一个参数
- Oracle修改计算机名称后监听无法启动
- Oracle常用SQL语句
- 能使用键盘移动的层页面代码
- Android 升级脚本updater-script 的函数简介