最后一个方式 模板尚未弄清楚.

我们在写代码的时候,按约定都是把成员数据放到private访问区中,然后在通过相应的函数来存取。那又有什么样的代码可以突破访问权限来直接操作类中private区段中的成员数据呢?

首先,我们想到了指针,对吧~指针可是万能之王,然而也是万恶之源。那我们就先来看看指针如何突破马其诺防线的。

先定义一个测试类

)
    { }

template<typename T>
void Func(const T&t)// 类中存在一个模板函数
 { }

    const int GetValue()
    {
        return m_nPrivate;
    }
};

 
很简单是吧,私有成员m_nPrivate就是我们的目标。来看看突破代码:
void *p = &x;// 获取类的起始地址,其实也就是m_nPrivate数据成员的地址
int *n = (int *)p;

int tmp = 2; 
*n = tmp; // 改写其值

cout << x.GetValue() << endl; // 输出为2

 
利用指针偏移
好了,成功突破!我们再来看看其他的方式。
 
 
 
1.伪造者方式
这个伎俩是现将某个有待伪造的类定义复制一份,然后通过该复制后的“赝品”来达到目的,且看
;
}

)
    {}

template<typename T>
void Func(const T&t)
{}

const int GetValue()
{
return m_nPrivate;
}
};

类定义覆盖(改写类定义)失败
这个伎俩被VC2008的编译器逮住了,没有编译通过。因为他违反了唯一定义规则(ODR,One Definition Rule)。看来语言律师还是不会放过这种没脑子的造假者!打假、打假,越打越假!
 
2. 偷窃者方式
偷偷的改变定义类的含义。且看:
#;
}

他的两根手指头很灵活哟。在VC2008成功执行得到。然而他却有两个违背标准的行为:

1)#define 保留字是非法的

2)违反了唯一定义规则(ODR),然而类的底层内存布局没改变,故可行

用#define private public 偷梁换柱

 

3.骗子方式

// 同X的内存布局,只有一个int型的变量

;
}
在VC2008上成功运行达到目的,但是却有漏洞:
标准中reinterpret_cast的行为未定义,VC2008允许返回的结果引用。所以也成功让骗子得逞。
仿造相同内存结构的新public类,指针类型转换
 
 
4.语言律师方式
律师就是钻法律的漏洞,永远也不会被逮住,他是在钻法律的空子!且看
;
}

void Test()
{
    X x;
    cout << x.GetValue() << endl;

x.Func(Y());
    cout << x.GetValue() << endl;
}

他能成功主要是利用了X具有一个成员模板的事实,代码完全符合标准,标准也确保这种行为会按照编码者的意图行事。boost和loki中大量运用此手法。
模板编译的过程在实际编译以前...活生生的给X类添加了一个成员函数.
原来,类里面有一个实现了的模板函数!
那么在外面再加一个模板函数,导致模板推演的过程中多出来一个自己写的并且加入了备选组中,所以相当于多了一个重载。
 
并且由于此函数的参数是匿名空间里面的特定的类别,完全避免了搅乱原本该函数的功能。
高招啊!
 
看法:
我相信这并不是C++访问控制机制的漏洞,或许,我们本不应该这样做。用成员模板提供一种有效的访问似有成员数据可以绕过类的访问控制,这也许就是我们想达到的目的。

[转载] C++ 突破私有成员访问限制的更多相关文章

  1. C++利用指针突破私有成员访问限制

    C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限.比如: 1 class A 2 { 3 public: 4 A(): i(10){} 5 void print(){ ...

  2. 使用C#反射机制访问类的私有成员【转】

    首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...

  3. C#中访问私有成员--反射

    首先我必须承认访问一个类的私有成员不是什么好做法.大家也都知道私有成员在外部是不能被访问的.而一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员访问,可以套用下面这种非常好的方式 ...

  4. C++ //继承中的对象模型 //利用开发人员命令提示工具查看对象模型 //父类中所有非静态成员属性都会被 子类继承下去 //父类中私有成员属性 是被编译器给隐藏了 因此是访问不到 但是确实被继承下去了

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 /* 9 #include &l ...

  5. python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  6. Delphi 跨单元进入(访问)类的私有成员,protected ,private部分

    http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...

  7. VC6.0中友元函数无法访问类私有成员的解决办法

    举个例子: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #inclu ...

  8. VC6.0中重载操作符函数无法访问类的私有成员

    整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...

  9. C#中访问私有成员

    首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...

随机推荐

  1. dubbo 教程

    阿里巴巴dubbo主页:http://code.alibabatech.com/wiki/display/dubbo/Home-zh 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提 ...

  2. sql server 日期相关操作

    ), ): ), ): :57AM ), ): ), ): ), ): ), ): ), ): ), ): ), ): , ), ): :: ), ): :::827AM ), ): ), ): ), ...

  3. TP框架整合Swagger UI接口文档

    1.下载swagger ui:http://swagger.io/swagger-ui/: 2.在应用目录里新建一个目录xxx:如图 3.解压后把dist目录的所有文件拷贝到新建的目录里面: 4.在新 ...

  4. 优化PHP程序的方法(温故知新)

    1. If a method c++an be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化 ...

  5. JS抽奖功能代码

    HTML <label for="awardListDom">奖项列表</label><br> <input type="tex ...

  6. su root 和su - root 的区别

    su - root  is   the same as su - just like login as root, then the shell is login shell,which mean i ...

  7. dwz 在dialog里打开dialog

    需要在打开dialog里再弹出一个dialog的话,需要在打开第一个dialog的地方指定rel,这样就可以弹出第二个dialog而不是替换掉第一个dialog <a class="a ...

  8. 清除浮动(clearfix hack)

    eg:

  9. 如何一次把所有wordpress插件都禁用了

    wordpress网站出现了问题,或者在更新一些数据的时候,需要先把插件全部都禁用了进行检查.那么如何一次把所有wordpress插件都禁用呢?试试下面的sql语句吧 UPDATE wp_option ...

  10. Go - 内置函数大全

    Package builtin import "builtin" Overview Index Overview ▾ Package builtin provides docume ...