`
wyk86485480
  • 浏览: 29156 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

我的黑科技,让C++可以访问private成员

C++ 
阅读更多

严格说,C++的禁止外部类访问private 是指在编译期,运行期都是在内存中的数据,是可以做任何修改的。本文的方式讲的就是针对运行期如何修改。

这个方案源于N年前有个第三方实现的静态库,我们没有代码,只有库的头文件声明和编译好的lib库。在一个类的头文件中,有个私有变量存储的是Color值,但库的开放接口却没有能力修改这个值。

### 方法

通过头文件的类定义,算出该私有变量在内存中的偏移值,有了偏移值,就可以通过获取该类实例在内存中的地址,从而算出私有变量的内存地址。需要对class内存结构有所了解,如图:

![class struct](http://p.blog.csdn.net/images/p_blog_csdn_net/pathuang68/EntryImages/20090424/1604.GIF)

具体实现代码:

~~~.cpp
// 获取开始内存地址
volatile char *pThis = (char *)&pRichEditChatLogEx;

volatile CHARFORMAT2 cf;
ZeroMemory((char *)&cf, sizeof(CHARFORMAT2));
cf.cbSize          = sizeof(CHARFORMAT2);
cf.crTextColor     = RGB(0, 0, 0);
cf.yHeight         = 20 * 10;
cf.dwMask          = CFM_COLOR | CFM_FACE | CFM_SIZE | CFM_PROTECTED;
cf.dwEffects       = 0;
cf.bCharSet        = 134;
cf.bPitchAndFamily = 34;

// 算偏移地址,篇幅原因,不贴出具体类的定义了
// 下面的公式是取基类最后结束的偏移,仔细想想,是从屁股开始往前推...
int endOffset = sizeof(CRichEditChatLogEx) * 2 - sizeof(CRichEditChatLog);

// 通过调试内存看出,DEBUG下,内存多4个字节
#if _DEBUG
volatile int offset = endOffset - sizeof(CHARFORMAT2) - 20;
#else
volatile int offset = endOffset - sizeof(CHARFORMAT2) - 24;
#endif

// 内存写入要修改的值,注意千万不要超出数据长度哦,否则就是场灾难
memcpy((char *)&pThis[offset], (char *)&cf, sizeof(CHARFORMAT2));
~~~

转自:http://www.yinqisen.cn/blog-530.html
分享到:
评论

相关推荐

    c++访问私有private成员变量的常用方法

    c++访问私有private成员变量的常用方法 在 C++ 编程中,private 成员变量是类的内部实现细节,不能被外部直接访问,这是为了保护类的封装性和安全性。然而,在某些情况下,我们需要访问私有成员变量,例如在测试、...

    利用虚函数让private外部访问成为可能!

    通过分析提供的文件信息,我们可以深入探讨如何利用C++中的虚函数机制实现对私有成员的间接访问。这一技术不仅能够帮助我们理解C++中的多态性,还能够在一定程度上突破语言设计上的限制,实现更为灵活的编程方式。 ...

    c++静态成员使用实例

    在C++中,静态成员函数可以被类的所有对象共享,它并不持有隐含的`this`指针,因此不能访问非静态成员变量。静态成员函数通常用于执行与对象状态无关的操作,如计算、比较等。例如,在`静态成员函数.cpp`中,可能会...

    C++ 类访问控制public、private、protected探讨.pdf

    C++ 类访问控制机制是面向对象编程中的核心概念,它主要涉及到`public`、`private`和`protected`这三个访问修饰符。它们的作用是限制类的成员(数据成员和成员函数)在不同作用域内的可访问性,从而实现数据封装和...

    C++语言建议成员变量设置为private.zip

    `public`成员可以在类的任何地方被访问,`private`成员只能在类的内部访问,而`protected`成员则可以被类本身及其派生类访问。 3. **成员变量的私有化**:将成员变量声明为`private`,意味着它们不能直接从类的外部...

    C++初始化成员列表.

    C++初始化成员列表 C++语言中的初始化成员列表是一种特殊的语法结构,它...C++语言中的初始化成员列表是一种非常有用的机制,它可以解决一些特殊的问题,提高效率,并且可以对const成员或引用类型的成员进行初始化。

    C++ 包含类两个类互相调用彼此的类成员变量和方法

    这种设计允许类A访问类B的成员,同时类B也可以访问类A的成员,形成一种循环依赖的关系。然而,这种关系需要谨慎处理,以避免编译错误和设计上的问题。下面我们将深入探讨这个主题。 首先,我们要理解C++中的“包含...

    C++实验代码 C++课程要求的实验

    在C++中,类的成员可以被声明为私有的(private),这意味着它们在类的外部不能直接访问。这是封装性原则的体现,有助于保护数据的安全性和完整性。然而,在某些情况下,我们需要在类外部修改私有成员,这通常通过...

    C++三种继承方式总结,帮你快速理解继承,进入C++高手

    public成员可以被类外的任何代码访问,protected成员可以被类内和友元访问,private成员只能被类内和友元访问。 现在,让我们深入了解三种继承方式的特点: 1. public继承 在public继承中,基类的public成员、...

    C++类访问权限.doc

    - 友元函数(Friend functions)是非成员函数,但可以访问类的private和protected成员。声明一个函数为友元,可以打破封装原则,允许该函数直接访问类的私有和保护成员。 - 友元类(Friend classes)是整个类而...

    C++三种继承方式

    - **对象访问**:派生类的对象可以直接访问基类的public成员,但不能直接访问protected或private成员。 - **概念理解**:“公有继承”意味着“是一个”。例如,如果`Dog`是从`Animal`公有继承而来,那么可以说每个`...

    C++访问oracle数据库

    C++作为一种强大的编程语言,虽然原生并不包含直接访问数据库的库,但可以通过第三方库如ocilib与Oracle数据库进行交互。本篇将详细介绍如何利用C++结合ocilib库实现对Oracle数据库的访问。 ocilib是一个开源的C/...

    tolua++ 版helloworld (lua脚本调用C++类的成员函数方法)

    关于tolua++的资料太少,这个通过实例让你知道如何通过tolua++和C++交互,简单明了。 通过5个文件来演示这个tolua++版 hello world hello.lua ,hello.h ,hello.pkg ,Main.cpp ,build_pgk.bat 1.启动CodeBlocks...

    易考的c++知识点及习题(二)

    静态成员函数可以访问静态数据成员,但不能直接访问非静态数据成员。 6. **常量成员**:常量成员包括常量数据成员(const data member)和常量成员函数。常量数据成员在类的常量成员函数中不可修改,但在非常量成员...

    C++ 类访问控制的条件总结

    C++ 类访问控制的条件总结 最近在使用C++创建类的时候,忽然发现自己...类成员是否可以访问 Yes Yes Yes 友元函数是否可以访问 Yes Yes Yes 子类是否可以访问 Yes Yes No 类的实例化对象是否可以访问 Yes No No

    C++类变量声明

    1. **访问修饰符的默认值**:在C++中,默认访问修饰符是`private`,而在Java中是`package-private`(同一包内的其他类可以访问)。 2. **构造函数**:C++中构造函数可以是无参或有参,且没有默认构造函数的概念。...

    c++bangzhu手册

    3. 访问控制:C++提供了三种访问控制级别——公共(public)、私有(private)和保护(protected)。公共成员可被类内外的成员访问,私有成员只能被类内部访问,保护成员则允许类及其派生类访问。 4. 构造函数与析...

    练习题(含答案)_c++oj答案_c++类oj习题_

    4. **访问修饰符**:public成员可以被任何代码访问,private成员只能在类内部访问,protected成员可被类及其派生类访问。合理设置访问权限能保证数据安全。 5. **成员函数**:类可以包含各种函数,如方法、友元函数...

Global site tag (gtag.js) - Google Analytics