这是一个用指针开后门改数据的方法
c吧
全部回复
仅看楼主
level 1
太上道祖 楼主
那么能不能用类似的方法把成员函数的指针指向别的函数
2022年09月04日 16点09分 1
level 1
没搞清楚什么意思?
代码你写的,随便怎么样都可以,用不着这么干[捂嘴笑]
代码别人写的,就给你个头文件,你想改数据?为什么要改?自己new一个不就完了,把那个不能改的数据复制回来。
2022年09月05日 01点09分 2
有没有一种可能,开后门是为了整活
2022年09月05日 04点09分
@太上道祖 整活倒是没问题,写C/C++就是要用指针玩骚操作才有灵魂[滑稽]
2022年09月05日 17点09分
@星辰划破星空💘 不过我也是才知道这个写法是依赖对齐的,前面就觉得好像没听老师说过这么规定,但是试了好几个编译器又都是这么做的,所以也正好拿上来问问。
2022年09月05日 17点09分
level 14
如果类内的数据可以随便改,那么 C++ 设计访问权限的意义何在?况且用指针改是不可靠的,这取决于编译器如何确定类的布局,包括对齐、字段顺序等。有一种不推荐但可靠的做法是利用语言漏洞,通过模板实现无视访问权限修改类内数据。但成员函数是没法修改的,因为它不是对象。
2022年09月05日 05点09分 3
你编译运行一下发现这个的确可以改动数据
2022年09月05日 11点09分
我试了好几个编译器的结果都是那两个数被该掉了
2022年09月05日 11点09分
看六楼
2022年09月05日 11点09分
level 1
一个类里面还有编译器加的东西,怎么准确无误的改
2022年09月05日 10点09分 5
这里说的其实反而是底层原理,c++的访问权限只发生在编译阶段,不然也不会出现后面用纯虚函数走后门的情形了。而这里的类似,运用了如下事实:
2022年09月05日 11点09分
1.类对象的地址其实就是这个对象(按照类里面声明的顺序)的第一个成员变量的地址 2.对指针进行增减运算可以访问临近的被申请过的内存 3.类对象的成员变量是连续存储的 4.指针是变量,可以强制转化为别的类型 5.基本类型的指针可以直接解引用从而直接访问并变更内存上的存储值
2022年09月05日 11点09分
于是这里就先找个int型指针,并赋值为类对象的首地址(同时也是第一个成员变量(恰好是int))的地址
2022年09月05日 11点09分
用int指针改变后,类对象的成员变量就被改掉了,然后发现下一个成员变量还是int,只要指针往后偏移一次,就可以读写第二个变量。这一切都不会被编译器发现『实际上你就是在修改private属性』,就如同纯虚函数中做的那样。
2022年09月05日 11点09分
level 1
太上道祖 楼主
这里说的其实反而是底层原理,c++的访问权限只发生在编译阶段,不然也不会出现后面用纯虚函数走后门的情形了。而这里的类似,运用了如下事实:
1.类对象的地址其实就是这个对象(按照类里面声明的顺序)的第一个成员变量的地址
2.对指针进行增减运算可以访问临近的被申请过的内存
3.类对象的成员变量是连续存储的
4.指针是变量,可以强制转化为别的类型
5.基本类型的指针可以直接解引用从而直接访问并变更内存上的存储值
于是这里就先找个int型指针,并赋值为类对象的首地址(同时也是第一个成员变量(恰好是int))的地址,用int指针改变后,类对象的成员变量就被改掉了,然后发现下一个成员变量还是int,只要指针往后偏移一次,就可以读写第二个变量。这一切都不会被编译器发现『实际上你就是在修改private属性』,就如同纯虚函数中做的那样。
2022年09月05日 11点09分 6
你的"事实"除了第二条都有问题,1. 如果类里有虚函数怎么办?3. 有一种东西叫做内存对齐;4&5. 转换指针类型可能导致指针未正确对齐,即使对齐也会有其他问题(导致需要使用 placement new、std::launder 等)。你能想到这些其实挺不错的,但可惜的是,你把 C++ 想得太简单了。
2022年09月05日 12点09分
@aaaaaaa421 第一次听说[惊哭]
2022年09月05日 16点09分
level 1
你试试把不同的数据类型封装进同一个类看看,不同的数据内存一对齐,想要精确的控制指针将会变得麻烦且危险。你这种行为毫无意义。你开放一个接口供外界安全的修改数据不香吗。或者干脆将数据public。因为你的这种行为破坏了封装,使类的权限变得毫无意义,干脆全都开放算了
2022年09月05日 13点09分 7
level 1
如我上面所说。当类封装的数据变得复杂起来,这种“后门”会变得麻烦与不安全。我图里这种还算简单的情况。如果是派生类,或者复合了其他的类,我看你怎么开后门[阴险]
2022年09月05日 14点09分 8
level 1
UB的
2022年09月05日 16点09分 9
level 1
你想表达什么?
2022年09月07日 05点09分 10
1