网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月30日
漏签
0
天
c吧
关注:
133,527
贴子:
393,873
看贴
图片
吧主推荐
视频
游戏
20
回复贴,共
1
页
<<返回c吧
>0< 加载中...
这是一个用指针开后门改数据的方法
只看楼主
收藏
回复
太上道祖
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
那么能不能用类似的方法把成员函数的指针指向别的函数
大胖懒虫
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
没搞清楚什么意思?
代码你写的,随便怎么样都可以,用不着这么干
代码别人写的,就给你个头文件,你想改数据?为什么要改?自己new一个不就完了,把那个不能改的数据复制回来。
2025-07-30 21:33:13
广告
不感兴趣
开通SVIP免广告
aaaaaaa421
榜眼
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
如果类内的数据可以随便改,那么 C++ 设计访问权限的意义何在?况且用指针改是不可靠的,这取决于编译器如何确定类的布局,包括对齐、字段顺序等。有一种不推荐但可靠的做法是利用语言漏洞,通过模板实现无视访问权限修改类内数据。但成员函数是没法修改的,因为它不是对象。
空气饼干
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
一个类里面还有编译器加的东西,怎么准确无误的改
太上道祖
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这里说的其实反而是底层原理,c++的访问权限只发生在编译阶段,不然也不会出现后面用纯虚函数走后门的情形了。而这里的类似,运用了如下事实:
1.类对象的地址其实就是这个对象(按照类里面声明的顺序)的第一个成员变量的地址
2.对指针进行增减运算可以访问临近的被申请过的内存
3.类对象的成员变量是连续存储的
4.指针是变量,可以强制转化为别的类型
5.基本类型的指针可以直接解引用从而直接访问并变更内存上的存储值
于是这里就先找个int型指针,并赋值为类对象的首地址(同时也是第一个成员变量(恰好是int))的地址,用int指针改变后,类对象的成员变量就被改掉了,然后发现下一个成员变量还是int,只要指针往后偏移一次,就可以读写第二个变量。这一切都不会被编译器发现『实际上你就是在修改private属性』,就如同纯虚函数中做的那样。
你瞅啥
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你试试把不同的数据类型封装进同一个类看看,不同的数据内存一对齐,想要精确的控制指针将会变得麻烦且危险。你这种行为毫无意义。你开放一个接口供外界安全的修改数据不香吗。或者干脆将数据public。因为你的这种行为破坏了封装,使类的权限变得毫无意义,干脆全都开放算了
你瞅啥
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
如我上面所说。当类封装的数据变得复杂起来,这种“后门”会变得麻烦与不安全。我图里这种还算简单的情况。如果是派生类,或者复合了其他的类,我看你怎么开后门
zerothsong
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
UB的
2025-07-30 21:27:13
广告
不感兴趣
开通SVIP免广告
rx104_ff
白丁
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你想表达什么?
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示