【赤石C++】不使用宏,实现一个“逆序”的成员访问运算符

admin 2025-12-23 01:37:42 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了如何在C++中实现一个逆序的成员访问运算符,通过重载-和<运算符,利用运算符优先级特性,使member<-object语法能够访问对象的成员变量。作者通过创建类型标签和全局变量,结合运算符重载技巧,实现了这一非传统的编程方式,展示了C++运算符重载的灵活性和创造性应用。 综合评分: 89 文章分类: 代码审计


cover_image

【赤石C++】不使用宏,实现一个“逆序”的成员访问运算符

原创

crackme.net

crackme安全实验室

2025年12月22日 14:04 河南

我们知道,类的成员访问运算符可以用来访问成员变量:object->member

那么,能否实现一个“逆序”的成员访问运算符,使用“逆序“的语法访问成员变量:member<-object

如果你问AI,AI只会教条地回复“无法实现,因为C++不支持自定义运算符”

“逆序”成员访问运算符?

仔细观察<-这个自定义运算符,不难发现,可以被拆分成<-两个子运算符

在C++中,-运算符优先级高于<,也就是说,member<-object语句的本质就是member < (-object),并不是自创了一个非标准的运算符

分别重载<-就可以实现这种“黑客”式的语法

实现

先定义一个类,其中包含一个简单的成员变量用于测试

struct&nbsp;ReverseMemberOperator&nbsp;{
&nbsp; &nbsp;&nbsp;int&nbsp;test_member =&nbsp;114514;
};

首先要重载-,让-object返回自身,使其参与下一步的<操作

struct&nbsp;ReverseMemberOperator&nbsp;{
&nbsp; &nbsp;&nbsp;int&nbsp;test_member =&nbsp;114514;

&nbsp; &nbsp; ReverseMemberOperator&&nbsp;operator-()&nbsp;noexcept&nbsp;{
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;*this;
&nbsp; &nbsp; }
};

下面的问题就是如何重载<运算符

已知,C++的重载是基于类型的,不是基于变量值的,也就是说,不能编写这种语法

int&&nbsp;operator<(test_member, ReverseMemberOperator& obj)&nbsp;noexcept&nbsp;{
&nbsp; &nbsp;&nbsp;return&nbsp;test_member;
}

为此,我们添加一个类型标签ReverseTag,并创建一个和成员函数同名的全局变量

struct&nbsp;ReverseTag&nbsp;{};
constexpr&nbsp;ReverseTag test_member{};

使用类型标签重载<运算符

int&&nbsp;operator<(ReverseTag, ReverseMemberOperator& obj)&nbsp;noexcept&nbsp;{
&nbsp; &nbsp;&nbsp;return&nbsp;obj.test_member;
}

如此一来,就可以实现“逆序”成员访问运算符

ReverseMemberOperator obj;
int&nbsp;a = test_member <- obj;

其中,该语句的执行逻辑如下:

  1. 1. test_member <- obj语句的本质是test_member < (-obj)
  2. 2. 首先,-obj调用ReverseMemberOperator& operator-()重载返回自身
  3. 3. 然后执行test_member < obj,而这里的test_member是刚才创建的同名全局变量,类型为ReverseTag
  4. 4. 最终调用int& operator<(ReverseTag, ReverseMemberOperator& obj)重载,并获取真正的成员变量test_member

~~这逆天的运算符重载技巧,简直是吃到了一口大的~~

注:如果存在多个成员变量,就需要对每个成员变量分别声明不同的标签

参考

https://github.com/HengXin666/HXTest/blob/main/src/10-cs-code/demo/01-left-ptr/04_left_pptr.cpp


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:crackme安全实验室 crackme.net《【赤石C++】不使用宏,实现一个“逆序”的成员访问运算符》

评论:0   参与:  1