逆向-beginners之C++封装

文章详细描述了在C++中,通过强制类型转换和指针操作,展示了如何在封装的类中绕过数据隐藏,实现对私有变量的修改,演示了一种潜在的代码攻击手段。

#include <stdio.h>

/*
 * 封装 (encapsulation)
 */

class box
{
    private:
            int color, width, height, depth;
    public:
            box(int color, int width, int height, int depth)
            {
                this->color = color;
                this->width = width;
                this->height = height;
                this->depth = depth;
            }

            void dump()
            {
                printf("this is box.color=%d, width=%d, height=%d, depth=%d\n", color, width, height, depth);
            }
};

#if 0
void hack_oop_encapsulation(class box * o)
{
    o->width = 1; /* that code cant be compiled:
                     "error C2248:'box::width':cannot access private member declared in class 'box'" */
}
#endif

/*
 * 上述代码不可能被成功编译出来。然而,只要把box的数据类型强制转换为整形数组的话,
 * 就可以通过编译并且直接修改相应字段.
 *
 * 功能:将输入数据视为整形数组,然后将数组的第二个元素、一个整形int值修改为123
 */
void hack_oop_encapsulation2(class box * o)
{
    unsigned int *ptr_to_object = reinterpret_cast<unsigned int *>(o);
    ptr_to_object[1] = 123;
}

int main()
{
    box b(1, 10, 20, 30);

    b.dump();

    hack_oop_encapsulation2(&b);

    b.dump();

    return 0;
}

#if 0
/*
 * intel
 */
0000000000001169 <_Z23hack_oop_encapsulation2P3box>:
    1169:    f3 0f 1e fa              endbr64
    116d:    55                       push   %rbp
    116e:    48 89 e5                 mov    %rsp,%rbp
    1171:    48 89 7d e8              mov    %rdi,-0x18(%rbp)
    1175:    48 8b 45 e8              mov    -0x18(%rbp),%rax
    1179:    48 89 45 f8              mov    %rax,-0x8(%rbp)
    117d:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1181:    48 83 c0 04              add    $0x4,%rax
    1185:    c7 00 7b 00 00 00        movl   $0x7b,(%rax)
    118b:    90                       nop
    118c:    5d                       pop    %rbp
    118d:    c3                       retq   

000000000000118e <main>:
    118e:    f3 0f 1e fa              endbr64
    1192:    55                       push   %rbp
    1193:    48 89 e5                 mov    %rsp,%rbp
    1196:    48 83 ec 20              sub    $0x20,%rsp
    119a:    64 48 8b 04 25 28 00     mov    %fs:0x28,%rax
    11a1:    00 00
    11a3:    48 89 45 f8              mov    %rax,-0x8(%rbp)
    11a7:    31 c0                    xor    %eax,%eax
    11a9:    48 8d 45 e0              lea    -0x20(%rbp),%rax
    11ad:    41 b8 1e 00 00 00        mov    $0x1e,%r8d
    11b3:    b9 14 00 00 00           mov    $0x14,%ecx
    11b8:    ba 0a 00 00 00           mov    $0xa,%edx
    11bd:    be 01 00 00 00           mov    $0x1,%esi
    11c2:    48 89 c7                 mov    %rax,%rdi
    11c5:    e8 40 00 00 00           callq  120a <_ZN3boxC1Eiiii>
    11ca:    48 8d 45 e0              lea    -0x20(%rbp),%rax
    11ce:    48 89 c7                 mov    %rax,%rdi
    11d1:    e8 78 00 00 00           callq  124e <_ZN3box4dumpEv>
    11d6:    48 8d 45 e0              lea    -0x20(%rbp),%rax
    11da:    48 89 c7                 mov    %rax,%rdi
    11dd:    e8 87 ff ff ff           callq  1169 <_Z23hack_oop_encapsulation2P3box>
    11e2:    48 8d 45 e0              lea    -0x20(%rbp),%rax
    11e6:    48 89 c7                 mov    %rax,%rdi
    11e9:    e8 60 00 00 00           callq  124e <_ZN3box4dumpEv>
    11ee:    b8 00 00 00 00           mov    $0x0,%eax
    11f3:    48 8b 55 f8              mov    -0x8(%rbp),%rdx
    11f7:    64 48 33 14 25 28 00     xor    %fs:0x28,%rdx
    11fe:    00 00
    1200:    74 05                    je     1207 <main+0x79>
    1202:    e8 59 fe ff ff           callq  1060 <__stack_chk_fail@plt>
    1207:    c9                       leaveq
    1208:    c3                       retq   
    1209:    90                       nop

000000000000120a <_ZN3boxC1Eiiii>:
    120a:    f3 0f 1e fa              endbr64
    120e:    55                       push   %rbp
    120f:    48 89 e5                 mov    %rsp,%rbp
    1212:    48 89 7d f8              mov    %rdi,-0x8(%rbp)
    1216:    89 75 f4                 mov    %esi,-0xc(%rbp)
    1219:    89 55 f0                 mov    %edx,-0x10(%rbp)
    121c:    89 4d ec                 mov    %ecx,-0x14(%rbp)
    121f:    44 89 45 e8              mov    %r8d,-0x18(%rbp)
    1223:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1227:    8b 55 f4                 mov    -0xc(%rbp),%edx
    122a:    89 10                    mov    %edx,(%rax)
    122c:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1230:    8b 55 f0                 mov    -0x10(%rbp),%edx
    1233:    89 50 04                 mov    %edx,0x4(%rax)
    1236:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    123a:    8b 55 ec                 mov    -0x14(%rbp),%edx
    123d:    89 50 08                 mov    %edx,0x8(%rax)
    1240:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1244:    8b 55 e8                 mov    -0x18(%rbp),%edx
    1247:    89 50 0c                 mov    %edx,0xc(%rax)
    124a:    90                       nop
    124b:    5d                       pop    %rbp
    124c:    c3                       retq   
    124d:    90                       nop

000000000000124e <_ZN3box4dumpEv>:
    124e:    f3 0f 1e fa              endbr64
    1252:    55                       push   %rbp
    1253:    48 89 e5                 mov    %rsp,%rbp
    1256:    48 83 ec 10              sub    $0x10,%rsp
    125a:    48 89 7d f8              mov    %rdi,-0x8(%rbp)
    125e:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1262:    8b 70 0c                 mov    0xc(%rax),%esi
    1265:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1269:    8b 48 08                 mov    0x8(%rax),%ecx
    126c:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1270:    8b 50 04                 mov    0x4(%rax),%edx
    1273:    48 8b 45 f8              mov    -0x8(%rbp),%rax
    1277:    8b 00                    mov    (%rax),%eax
    1279:    41 89 f0                 mov    %esi,%r8d
    127c:    89 c6                    mov    %eax,%esi
    127e:    48 8d 3d 83 0d 00 00     lea    0xd83(%rip),%rdi        # 2008 <_IO_stdin_used+0x8>
    1285:    b8 00 00 00 00           mov    $0x0,%eax
    128a:    e8 e1 fd ff ff           callq  1070 <printf@plt>
    128f:    90                       nop
    1290:    c9                       leaveq
    1291:    c3                       retq   
    1292:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
    1299:    00 00 00
    129c:    0f 1f 40 00              nopl   0x0(%rax)

/*
 * arm
 */
000000000040062c <_Z23hack_oop_encapsulation2P3box>:
  40062c:    d10083ff     sub    sp, sp, #0x20
  400630:    f90007e0     str    x0, [sp, #8]
  400634:    f94007e0     ldr    x0, [sp, #8]
  400638:    f9000fe0     str    x0, [sp, #24]
  40063c:    f9400fe0     ldr    x0, [sp, #24]
  400640:    91001000     add    x0, x0, #0x4
  400644:    52800f61     mov    w1, #0x7b                      // #123
  400648:    b9000001     str    w1, [x0]
  40064c:    d503201f     nop
  400650:    910083ff     add    sp, sp, #0x20
  400654:    d65f03c0     ret

0000000000400658 <main>:
  400658:    a9be7bfd     stp    x29, x30, [sp, #-32]!
  40065c:    910003fd     mov    x29, sp
  400660:    910043a0     add    x0, x29, #0x10
  400664:    528003c4     mov    w4, #0x1e                      // #30
  400668:    52800283     mov    w3, #0x14                      // #20
  40066c:    52800142     mov    w2, #0xa                       // #10
  400670:    52800021     mov    w1, #0x1                       // #1
  400674:    9400000a     bl    40069c <_ZN3boxC1Eiiii>
  400678:    910043a0     add    x0, x29, #0x10
  40067c:    9400001d     bl    4006f0 <_ZN3box4dumpEv>
  400680:    910043a0     add    x0, x29, #0x10
  400684:    97ffffea     bl    40062c <_Z23hack_oop_encapsulation2P3box>
  400688:    910043a0     add    x0, x29, #0x10
  40068c:    94000019     bl    4006f0 <_ZN3box4dumpEv>
  400690:    52800000     mov    w0, #0x0                       // #0
  400694:    a8c27bfd     ldp    x29, x30, [sp], #32
  400698:    d65f03c0     ret

000000000040069c <_ZN3boxC1Eiiii>:
  40069c:    d10083ff     sub    sp, sp, #0x20
  4006a0:    f9000fe0     str    x0, [sp, #24]
  4006a4:    b90017e1     str    w1, [sp, #20]
  4006a8:    b90013e2     str    w2, [sp, #16]
  4006ac:    b9000fe3     str    w3, [sp, #12]
  4006b0:    b9000be4     str    w4, [sp, #8]
  4006b4:    f9400fe0     ldr    x0, [sp, #24]
  4006b8:    b94017e1     ldr    w1, [sp, #20]
  4006bc:    b9000001     str    w1, [x0]
  4006c0:    f9400fe0     ldr    x0, [sp, #24]
  4006c4:    b94013e1     ldr    w1, [sp, #16]
  4006c8:    b9000401     str    w1, [x0, #4]
  4006cc:    f9400fe0     ldr    x0, [sp, #24]
  4006d0:    b9400fe1     ldr    w1, [sp, #12]
  4006d4:    b9000801     str    w1, [x0, #8]
  4006d8:    f9400fe0     ldr    x0, [sp, #24]
  4006dc:    b9400be1     ldr    w1, [sp, #8]
  4006e0:    b9000c01     str    w1, [x0, #12]
  4006e4:    d503201f     nop
  4006e8:    910083ff     add    sp, sp, #0x20
  4006ec:    d65f03c0     ret

00000000004006f0 <_ZN3box4dumpEv>:
  4006f0:    a9be7bfd     stp    x29, x30, [sp, #-32]!
  4006f4:    910003fd     mov    x29, sp
  4006f8:    f9000fa0     str    x0, [x29, #24]
  4006fc:    f9400fa0     ldr    x0, [x29, #24]
  400700:    b9400001     ldr    w1, [x0]
  400704:    f9400fa0     ldr    x0, [x29, #24]
  400708:    b9400402     ldr    w2, [x0, #4]
  40070c:    f9400fa0     ldr    x0, [x29, #24]
  400710:    b9400803     ldr    w3, [x0, #8]
  400714:    f9400fa0     ldr    x0, [x29, #24]
  400718:    b9400c04     ldr    w4, [x0, #12]
  40071c:    90000000     adrp    x0, 400000 <_init-0x4b8>
  400720:    911fa000     add    x0, x0, #0x7e8
  400724:    97ffff7f     bl    400520 <printf@plt>
  400728:    d503201f     nop
  40072c:    a8c27bfd     ldp    x29, x30, [sp], #32
  400730:    d65f03c0     ret
  400734:    00000000     .inst    0x00000000 ; undefined


#endif

本资源是一套基于 CSDN 技术文章《七种车辆类型细粒度检测系统》落地实现的可交互单文件工作台。它沿用原文 Vue3 + Spring Boot + Flask 三服务架构设计,将方案转化为开箱即用的产品原型,采用深色科技数据大屏风格,无需安装依赖、无需启动后端,双击 HTML 即可在浏览器运行,适用于算法演示、教学讲解、产品评审与功能展示。 资源含两大文件:工作台本体 vehicle_detect_workbench.html 与配套 车辆检测系统工作台_功能说明.md,已打包为 车辆检测系统工作台.zip 便于分发。 工作台内置八大模块。数据看板为首页,实时呈现累计检测量、检出车辆数、平均耗时等 KPI,并提供五模型 mAP 对比、七类车型分布、三十天趋势等图表;图片、视频、摄像头三类检测台覆盖主流输入,支持模型选择、阈值调节、SVG 精准标注与 AI 解读,结果自动落库;检测记录模块支持分类筛选、分页与详情回溯;模型训练台可配超参并动态生成 loss 与 mAP 曲线;模型对比实验室以指标总表与雷达图横向评测 YOLOv8/v10/v11/v12/v26 五模型;系统架构模块还原三服务拓扑并列出完整接口清单。 数据层内置七类车型(小型汽车、中型车、大型车、轻型货车、重型货车、油罐车、特种车辆)与五模型实测指标,各模块共享同一 MockDB,实现"操作即数据、数据即看板"的活联动。全局 API 层已映射文章真实接口,可在配置中一键切换纯前端 Mock 与真实后端,便于二次开发对接。 无论是交通安防教学、算法选型汇报还是产品原型评审,本资源都能帮助你直观、专业地呈现七类车型细粒度检测能力的全貌。
内容概要:本研究针对微电网在遭受拒绝服务(DoS)攻击时面临的功率分配不均与电能质量问题,提出了一种兼顾功率精确均分与电压频率质量恢复的抗攻击混合动态事件触发二次控制策略。该策略通过设计新型混合动态事件触发机制,有效减少控制器与分布式单元间的网络通信负担,同时增强系统对DoS攻击的鲁棒性。研究构建了完整的微电网二次控制框架,整合了分布式协同控制算法与事件触发通信机制,在保证系统稳定性的同时,实现了对频率、电压偏差的快速调节和有功/无功功率的精确分配。通过Simulink平台进行仿真实验,验证了所提方法在遭受DoS攻击及正常运行工况下均能有效维持微电网的稳定运行与高质量电能输出。; 适合人群:具备电力系统自动化、分布式控制或微电网相关基础知识,从事新能源、智能电网领域研究的研发人员及高年级研究生。; 使用场景及目标:① 解决微电网在通信受限及网络攻击场景下的协同控制难题;② 实现微电网在异常工况下功率均分与电能质量的双重优化;③ 为设计高安全性、高可靠性的智能微电网控制系统提供理论依据与仿真验证方案。; 阅读建议:本资源侧重于控制策略的设计与仿真验证,建议读者结合微电网基础理论与Simulink仿真技术,深入理解事件触发机制与抗DoS攻击控制算法的实现细节,并动手复现仿真案例以加深对系统动态性能与鲁棒性的认识。
内容概要:本文围绕《【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)》展开,系统阐述了采用粒子群优化算法(PSO)对风能与水力发电系统进行联合优化调度的研究方法与技术路径。研究聚焦于构建多能源互补协调的优化模型,详细论述了目标函数的设计、系统约束条件的处理、算法求解流程及收敛性分析,并通过Matlab编程实现了完整的仿真验证过程,有效提升了可再生能源系统的运行效率与稳定性。该工作属于电力系统智能优化领域,强调对高水平期刊论文的高精度复现,兼具理论深度与工程实用性,适用于科研复现、学术研究与教学参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源优化调度、智能算法应用的工程技术人员。; 使用场景及目标:①用于复现《太阳能学报》等高水平期刊中关于风-水电联合调度的EI/SCI论文;②掌握粒子群算法在多源协同优化中的建模、编码与求解关键技术;③辅助完成学位论文、科研项目申报或学术竞赛中的仿真建模任务; 阅读建议:建议结合文中提供的网盘资源下载完整代码与文档资料,按照目录结构循序渐进学习,重点关注算法实现细节、电力系统建模逻辑与参数设置方法,同时可延伸学习灰狼优化算法、YALMIP工具包等先进优化技术,以全面提升科研仿真与创新能力。
内容概要:本文聚焦“基于源网荷储一体化的配电网协同优化研究”,提出一种面向高渗透率电动汽车接入场景的双层优化模型,并采用Matlab实现完整的仿真与求解。研究系统整合电源、电网、负荷与储能四大环节,构建多时段、多约束条件下的协同调度框架,涵盖电动汽车有序充电、V2G(车网互动)技术、分布式能源并网、无功优化及储能协同配置等关键要素。通过引入二阶锥松弛或凸规划方法对非线性模型进行线性化处理,有效提升优化求解效率与收敛性。同时,结合熵权法与模糊综合评价方法,建立多维度的配电网承载能力量化评估体系,实现对系统运行状态的科学评判。文中配套提供完整Matlab代码,具有较强的可复现性与工程应用价值,适用于科研仿真与实际项目开发。; 适合人群:具备电力系统分析基础和Matlab编程能力,从事新能源接入、智能配电网、综合能源系统优化等方向的研究生、科研人员及电力行业工程技术开发者。; 使用场景及目标:①用于高比例可再生能源与大规模电动汽车接入背景下配电网承载能力的量化评估;②实现源---储多主体参与的协同优化调度建模与仿真分析;③支撑硕博学位论文撰写、高水平期刊论文结果复现及科研项目的算法验证与系统开发。; 阅读建议:建议结合文中提供的Matlab代码与相关参考文献同步研习,重点关注双层优化架构的设计逻辑、二阶锥松弛的数学处理技巧以及多指标综合评价体系的构建流程,建议动手调试代码以深入掌握模型实现细节与算法运行机制。
源码链接: https://pan.quark.cn/s/a4b39357ea24 DMA(直接内存访问)是计算机系统中一种关键的数据传输机制,它使得特定的硬件子系统得以直接对系统内存进行读写操作,无需CPU的介入。这种机制对于提高I/O操作的效能具有极其重要的作用,特别是在网络设备、存储设备等驱动程序的编写过程中占据着核心地位。Cache(缓存)则是一种用于暂存频繁访问的数据和指令的存储结构,其目的是减少处理器对主存储器的访问次数,进而增强系统的整体性能。然而,DMA和Cache之间存在着一致性的挑战,特别是在部分嵌入式系统中,DMA操作可能绕过Cache机制,从而引发数据不一致的情况,这就需要采取一系列策略来维护Cache的一致性。 在DMA的运作模式中,主要存在两种Cache一致性问题:流式DMA(streaming DMA)与一致性DMA(coherent DMA)。流式DMA通常应用于需要大量数据传输的场景,它不关注Cache的一致性,因此传输速度较快,但要求软件开发者自行管理数据的一致性。而一致性DMA则保证了在DMA传输期间,数据在Cache与主内存之间保持同步,通常适用于对一致性要求较高的应用场景。 在Linux内核中,为了有效管理DMA操作,提供了一系列接口函数。其中,一致性DMA接口负责维护数据的一致性,而流式DMA接口则提供了更快的传输速度,但要求开发者自行解决数据一致性的问题。开发者在选用这些接口时,必须依据硬件平台的特点和性能需求,选择合适的DMA模式。 Cache一致性的解决方案通常取决于硬件平台的属性。在某些先进的处理器架构中,Cache对程序员而言是透明的,即处理器与Cache控制器之间的交互对程序员不可见,从而简化了编程的复...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值