在调用栈中挖掘异常指针

C#异常处理:5大核心策略与3个致命陷阱(你不知道的真相) 在C#开发中,异常处理是“代码健壮性”的生命线。它不仅能防止程序“猝死”,还能让错误信息“显形”,帮助开发者精准定位问题。但你是否想过:本文将通过5大核心策略和3个致命陷阱,带您撕开C#异常处理的“神秘面纱”,从基础语法到高阶技巧,手把手教您写出“无惧崩溃”的代码。 墨氏注释暴击:真实踩坑案例: 某银行系统因未捕获导致交易中断,修复后用try-catch-finally确保资源释放,系统稳定性提升90%。 墨氏注解暴击:冷幽默比喻: 异常传递就像“踢皮球”—— 墨氏注释暴击:真实踩坑案例: 某电商平台用wh 阅读详情

原文地址:http://blogs.msdn.com/b/oldnewthing/archive/2006/08/21/710754.aspx

大家也许经常盯着调用栈,寻找捕捉到的异常以及在哪里发生的异常。

ChildEBP RetAddr  Args to Child
030c21d0 76df3448 00000000 030c6138 76db6b0d ntdll!DbgBreakPoint
030c21dc 76db6b0d 030c2204 77b8d585 030c220c ole32!PeekMessageExceptionFilter+0x42
030c21e4 77b8d585 030c220c 00000000 030c220c ole32!CCliModalLoop::MyPeekMessage+0x41
030c220c 77f36992 030c25d0 030c6128 030c22e8 msvcrt!_except_handler3+0x61
030c2230 77f36964 030c25d0 030c6128 030c22e8 ntdll!ExecuteHandler2+0x26
030c22d8 77f36884 030c1000 030c22e8 00010007 ntdll!ExecuteHandler+0x24
030c25b8 77f6e0dd 030c25d0 00000000 00000000 ntdll!RtlRaiseException+0x3d
030c262c 77d3c239 77d4a4b6 77d3e2c5 030c3767 ntdll!RtlDeactivateActivationContextUnsafeFast+0x233
030c2630 77d4a4b6 77d3e2c5 030c3767 030c26a0 USER32!UserCallWinProcCheckWow+0x167
030c2634 77d3e2c5 030c3767 030c26a0 77d4a46f USER32!_NLG_Return2
030c265c 77d3e288 030c57b4 ffffffff 030c2688 USER32!__local_unwind2+0x70
030c2688 77f36992 030c26f8 030c57b4 030c27a4 USER32!_except_handler3+0xd5
030c26ac 77f36964 030c26f8 030c57b4 030c27a4 ntdll!ExecuteHandler2+0x26
030c2a74 77b8d36d 030c6128 77b8d36d 00000000 ntdll!ExecuteHandler+0x24
030c2a9c 77b8d59d 030c6128 030c2ac0 00000000 msvcrt!__global_unwind2+0x18
030c2ac0 77f36992 030c2ba4 030c6128 030c2bc0 msvcrt!_except_handler3+0x75
030c2ae4 77f36964 030c2ba4 030c6128 030c2bc0 ntdll!ExecuteHandler2+0x26
030c2b8c 77f36796 030c1000 030c2bc0 030c2ba4 ntdll!ExecuteHandler+0x24
030c2b8c 77b7aa54 030c1000 030c2bc0 030c2ba4 ntdll!KiUserExceptionDispatcher+0xe
030c3300 77b7b4dc 030c3324 7715b1b4 00000000 msvcrt!_woutput_l+0x18

(大家可以从符号服务器上获取到需要的调试符号,如果你的磁盘空间上G的话,也可以一次下载全部的符号信息。不过即便你打包下载了符号信息,你还是得需要符号服务器。因为调试信息会随着系统文件的更新而相应更新。)

这里可以看到,PeekMessageExceptionFilter函数捕捉到了一个异常。那是什么异常?首先,异常过滤函数会被传入一个EXCEPTION_POINTERS结果作为参数。

typedef struct _EXCEPTION_POINTERS {
    PEXCEPTION_RECORD ExceptionRecord;
    PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

现在,我们看一下PeekMessageExceptionFilter的参数:

030c21dc 76db6b0d 030c2204 77b8d585 030c220c ole32!PeekMessageExceptionFilter+0x42

0:0000> dd 030c2204 l2
030c2204 030c25d0 030c22e8
         -------- --------
         .exr     .cxr

第一个值是ExceptionRecord的指针,第二个值是ContextRecord的指针。你可以通过输入命令.exr 030c25d0查看异常信息,还可以通过.cxr 030c22e8查看异常的上下文内容(比如,异常发生时在执行什么指令)。这两个值也作为ExecuteHandler2函数的第一和第三个参数出现。

(译注:.cxr实际上会执行切换上下文的操作。)


现在就用.exr 030c25d0看一下异常信息,异常代码是c015000f,正好是STATUS_SXS_EARLY_DEACTIVATION。切换到发生异常的上下文,调用栈显示如下:

ChildEBP RetAddr
030c262c 77d3c239 77d4a4b6 77d3e2c5 030c3767 ntdll!RtlDeactivateActivationContextUnsafeFast+0x233
030c2630 77d4a4b6 77d3e2c5 030c3767 030c26a0 USER32!UserCallWinProcCheckWow+0x167
030c2634 77d3e2c5 030c3767 030c26a0 77d4a46f USER32!_NLG_Return2
030c265c 77d3e288 030c57b4 ffffffff 030c2688 USER32!__local_unwind2+0x70
030c2688 77f36992 030c26f8 030c57b4 030c27a4 USER32!_except_handler3+0xd5
030c26ac 77f36964 030c26f8 030c57b4 030c27a4 ntdll!ExecuteHandler2+0x26
030c2a74 77b8d36d 030c6128 77b8d36d 00000000 ntdll!ExecuteHandler+0x24
030c2a9c 77b8d59d 030c6128 030c2ac0 00000000 msvcrt!__global_unwind2+0x18
030c2ac0 77f36992 030c2ba4 030c6128 030c2bc0 msvcrt!_except_handler3+0x75
030c2ae4 77f36964 030c2ba4 030c6128 030c2bc0 ntdll!ExecuteHandler2+0x26
030c2b8c 77f36796 030c1000 030c2bc0 030c2ba4 ntdll!ExecuteHandler+0x24
030c2b8c 77b7aa54 030c1000 030c2bc0 030c2ba4 ntdll!KiUserExceptionDispatcher+0xe
030c3300 77b7b4dc 030c3324 7715b1b4 00000000 msvcrt!_woutput_l+0x18

哇,在处理一个异常的时候又发生了另外一个异常。(碰巧这次在原来的调用栈里一眼就能看出来,但是通常情况下,找到后面的异常可能没那么容易。)

拿这个异常重复一次上面的练习:
0:000> .exr 030c2ba4
ExceptionAddress: 77b7aa54 (msvcrt!_woutput_l+0x00000018)
   ExceptionCode: c00000fd (Stack overflow)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000001
   Parameter[1]: 030c2e88


0:000> .cxr 030c2bc0
eax=030c33b0 ebx=00000000 ecx=0000005c edx=00000000 esi=030c33c4 edi=030c33c4
eip=77b7aa54 esp=030c2e8c ebp=030c3300 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
msvcrt!_woutput_l+0x18:
001b:77b7aa54 53          push    ebx

哈哈,原来SXS异常是由堆栈溢出引起的。在这个上下文里,你可以使用“k”命令查看是如何引发这个结果的。

这个bug是由于错误的递归导致的栈溢出引发的。当时线程正在为调用一个COM对象,等待它返回。而这个时候又收到了一个新的请求。问题的细节在这里并不重要;本文的目的就是展示如何在调用栈上挖掘异常指针,从中了解引发问题的Win32异常的信息。

易语言64位HOOK与封包分析:传奇4漏洞挖掘与明文发包实战 本文深入探讨了如何利用易语言实现64位环境下的HOOK技术与封包分析,专注于《传奇4》游戏的漏洞挖掘与明文发包实战。内容涵盖64位逆向分析基础、内存结构定位、HOOK技术实现、封包协议解析及漏洞挖掘方法论,为游戏安全研究人员提供实用技术指南。 阅读详情

相关推荐

FORGE:基于LLM反馈驱动的智能二进制漏洞挖掘系统

在软件安全领域,自动化漏洞挖掘技术如模糊测试和符号执行,通过模拟程序执行来发现潜在缺陷,但其路径探索的盲目性和状态爆炸问题限制了效率。大语言模型凭借其强大的代码语义理解能力,为这一领域带来了新的可能。其技术价值在于,能够将程序的动态执行反馈转化为智能的探索策略,从而引导分析过程更精准地触及高危代码区域。FORGE系统正是这一理念的工程实践,它构建了一个“执行-反馈-决策”的闭环,将LLM作为策略分析师,深度融合了反馈驱动执行与语义理解,旨在从海量二进制代码中高效识别堆溢出、栈溢出等复杂漏洞模式,显著提升了自

weixin_34348174的博客 394

C++程序崩溃诊断:调用栈捕获与符号解析实战指南

在软件开发和运维中,程序崩溃是常见且棘手的问题,尤其对于C++这类系统级语言。理解程序崩溃后的诊断技术,关键在于掌握调用栈(Call Stack)这一核心概念。调用栈记录了函数调用的层级关系,其原理是通过栈帧指针链式回溯,获取每个函数的返回地址。这项技术的价值在于,它能将崩溃瞬间的机器状态转化为可读的执行路径,极大提升问题定位效率。在应用场景上,无论是服务端后台、游戏引擎还是嵌入式系统,都需要在发生段错误(Segmentation Fault)、断言失败或未捕获异常时,自动捕获并解析调用栈。本文聚焦于C++

weixin_33863087的博客 325

iTerm2+oh-my-zsh最全配置

iTerm2+oh-my-zsh最全配置安装前先看效果图一.安装[iTem2](https://iterm2.com/)二.安装[oh-my-zsh](https://ohmyz.sh/)三.安装[Powerline](https://powerline.readthedocs.io/en/latest/installation.html)四.安装 [Meslo](https://github.com/powerline/fonts) 字体库五.安装agnoster主题六.安装语法高亮七.安装代码补全插件八

xinximo的博客 2610

DLL的绑定进程和解绑定进程引起的死锁

DLL的绑定和解绑定其实操作系统做了很多的工作,资源的分配和资源的释放,我们在使用的过程中,一不小心就会中招,这里说一下我遇到的一个死锁的问题。

justin_bkdrong的专栏 4850

利用HFSS仿真优化圆极化微带天线的耦合馈电设计

本文深入探讨了利用HFSS仿真软件优化圆极化微带天线性能的关键方法。通过对比传统直接馈电与耦合馈电方式,详细阐述了耦合馈电在提升阻抗匹配、改善轴比带宽及增强设计鲁棒性方面的显著优势。文章结合FR4板材的实战案例,逐步演示了在HFSS中建立模型、进行参数扫描与圆极化性能优化的完整流程,为设计高性能、高纯度的圆极化天线提供了实用指南。

weixin_29233333的博客 547

固定资产报废的损失鉴定怎么做?

在社会生产的日常中,企业经常会遇到固定资产报废的损失鉴定,那么怎么去做鉴定?哪些情况下能申请固定资产报废损失鉴定呢? 今天,华碧鉴定就和大家说一说固定资产报废损失鉴定那些事儿。 符合下列条件之一的固定资产可申请报废: 1、使用年限过长,功能丧失,完全失去使用价值,或不能使用并无修复价值的; 2、产品技术落后,质量差,耗能高,效率低,已属淘汰且不适于继续使用,或技术指标已达不到使用要求的; 3、严重损坏,无法修复的或虽能修复,但累计修理费已接近或超过市场价值的; 4、主要附件损坏,无.

weixin_50362670的博客 2115

多线程锁详解之【WaitForSingleObject】

WaitForSingleObject

qq492927689的博客 4772

005、开关电源中的基本拓扑结构简介

本文介绍了开关电源设计中常见拓扑结构的特性与选型经验。文章从实际炸机案例入手,强调深入理解拓扑的重要性,详细分析了Buck、Boost、Buck-Boost等非隔离拓扑以及反激、正激、半桥、全桥、LLC等隔离拓扑的工作原理、设计要点和典型误区,重点指出各拓扑的电压/电流应力、效率瓶颈和常见设计错误。作者根据多年经验总结出不同功率等级和输入输出条件下的拓扑选型原则,并强调细节设计对成败的决定性影响。文章通过大量工程实例说明,正确的拓扑选择和参数计算是电源设计成功的基础,而忽略基础原理将导致反复修改甚至炸机风险

Jack010169的博客 224

用户 APC

无论如何,在 APC 内获取锁可能是一个坏主意,但在内核中,微软已经部分解决了这个问题 - 您可以通过将 IRQL 提升到 APC_LEVEL 或通过 KeEnterCriticalRegion / KeEnterGuardedRegion 禁用 APC 来阻止 APC 到获取特定锁的线程 - 有时它是例如,某些 API(例如 ExAcquireResourceSharedLite)需要。APC(异步过程调用)是一种可在 Windows 中使用的机制,用于对要在特定线程的上下文中完成的作业进行排队。

史D芬周 1228

蓝牙攻防实战指南:低功耗蓝牙

Bluetooth Low Energy(也称Bluetooth Smart)是经典蓝牙(Bluetooth Classic)的演进版本,设计目标是实现极低功耗,适用于无需频繁更换电池的设备,如智能手环、健康监测器、蓝牙标签等。Bluetooth Low Energy 是一项极具前景的无线通信技术,它以极低的功耗实现了短距离高效通信,广泛应用于智能设备和物联网领域。然而,其简化的协议结构和配对机制也带来了不小的安全挑战。

idlecloud0105的博客 682

PCL 逐点插入法构建Delaunay三角网(C++详细过程版)

点云构建Delaunay三角网的逐点插入法基于PCL点云库的C++详细过程版实现

点云侠的博客 2991

Win7下过盛*大Hack*Shield的部分驱动保护

在Win7下很多XP的驱动都不适用了!前几个月研究了一下盛*大游戏的泡泡*堂的Hack*Shield驱动保护发现Hook了十多个内核函数,Ring 3和 Ring 0的双重保护,同时加了Themida的壳。 现在暂时发现钩住了以下函数: hook NtReadVirtualMemory hook NtWriteVirtualMemory Hook NtClose Hook NtProte

o6108的专栏 6500

基于RK3588调试WiFi模块AIC8800

本文介绍了在RK3588平台上移植AIC8800 WiFi模块驱动的过程。开发环境基于Linux 6.1内核和Buildroot文件系统。驱动移植步骤包括:将驱动包放入SDK指定目录、修改Makefile、编译内核、放置固件文件、手动加载驱动模块等。文章还分析了两种常见异常情况:无法识别模块(检查USB信号线路和供电)和偶发断连(检查硬件连接和调整PHY寄存器)。成功加载后可通过ifconfig看到wlan0节点。

qq_45147279的博客 667

剑和沙盒 6 - 线程辱骂 – 使用线程名称进行攻击

进程注入是攻击者使用的重要技术之一。我们可以在几乎所有恶意软件中发现其变体。防御规避:将恶意模块隐藏在不同进程的掩护下对现有进程的干扰:读取其内存、挂钩所使用的 API 等。特权升级由于恶意模块对进程内存的干扰会造成很大的破坏,因此各种 AV 和 EDR 产品都会监控此类行为并尝试阻止它们。但是,这种监控是基于对注入方法实现中使用的通用 API 的了解。这种猫捉老鼠的游戏永无止境。网络犯罪分子以及红队成员不断尝试通过使用一些非典型 API 来破坏已知模式,并借此逃避当时实施的检测。其中一个例子是。

ms44的专栏 1067

用一套可追溯的闭环,把设备变成可管理的资产:SAP S/4HANA Asset Management 模块详解

摘要:SAP S/4HANA的资产管理模块(EAM)通过标准化流程管理企业资产全生命周期,解决资产状态、需求和资源的不确定性。系统将资产抽象为技术对象,支持纠正性和预防性维护流程,通过维护工单实现可执行的工作包,并与物料管理、财务、生产计划等模块集成形成管理闭环。该模块可帮助降低非计划停机时间,通过数据驱动决策优化维护策略,提升资产可用率和运营效率。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 251

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

谁说空指针不能访问的?

在C语言这种手动管理内存的程序语言中,一般会按照默认的规则将空指针视为不可访问。去查找VMA,如果VMA可用,那么就按照指定地址分配,这个时候内核会直接返回指定的地址,但如果通过指定的地址申请内存失败,那么这个内核会按照默认的逻辑自顶向下的查找可用内存区域,此时就不会根据指定地址进行分配了,而且在自顶向下查找的过程中,内核会通过。内存分配涉及到物理内存这种宝贵的物理资源,这种敏感的资源一般都是由内核管理的,进程想要访问内存,需要先通过系统调用向内核提出申请,应用程序是无法访问未经内核同意的内存区域的。

advdbgger的博客 628

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

2026自动售货机异常重启根因分析:从日志挖掘到内存取证的技术实践~YH

重启日志采集与分类初步判断重启类型,内存取证工具(Kdump+crash)精准定位内核崩溃根因,系统资源监控提前发现内存泄漏等渐进性问题,关联分析识别批量重启的外部诱因。系统化的根因分析方法可将平均问题定位时间从数天缩短至数小时。以智购科技为例,其设备软件系统预置kdump内核崩溃转储和应用层崩溃堆栈捕获功能,所有崩溃数据自动上传云端供开发团队分析,持续改进软件质量。产品已出口至全球100多个国家和地区,售后网络覆盖国内外600多个城市、30000多个网点。本文基于行业公开信息与技术调研整理,仅供参考。

2601_96446488的博客 259

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

当回调函数在Dump中“消失”:深入挖掘内存损坏的幽灵

摘要:C/C++开发中,内存损坏导致的崩溃dump分析极具挑战性。本文通过一个回调函数地址异常(0x41414141)的案例,揭示了悬挂指针访问的多重危害:从立即崩溃、数据损坏到堆元数据破坏。深入剖析了虚函数表指针被覆盖的机制,展示了如何使用GDB内存断点、AddressSanitizer等工具定位问题根源。文章还提供了防御性编程的最佳实践,包括使用智能指针、边界检查和内存canary检测等。通过系统化的dump分析流程,开发者可以准确识别内存损坏特征,将难以捉摸的"幽灵问题"转化为可修

John_ToStr的博客 758

使用Windbg精准定位C++内存不足导致的bad_alloc异常

内存管理是C++程序开发中的核心挑战,尤其当程序因内存不足而抛出std::bad_alloc异常时,传统的调试方法往往难以定位根本原因。这类问题通常源于内存泄漏、碎片化或超大对象分配,导致进程虚拟地址空间耗尽或无法满足连续内存请求。事后分析工具如Windbg,通过解析崩溃转储文件,能深入探查异常发生时的进程状态、堆内存布局和关键变量值,从而逆向推导问题源头。其技术价值在于,无需预设大量日志,即可实现从崩溃结果到代码根因的精准回溯,极大提升了复杂内存问题的诊断效率。在大型数据处理、图形渲染或长时间运行的后台服

weixin_34310369的博客 448

Impactful Presentations: Virgilio‘s Guide to Building and Delivering Compelling Data Science Talks

> 导读:本指南是 Virgilio 数据科学学习项目中软技能(Soft Skills)系列的核心文档,专为需要向管理层、客户、同事或跨部门听众汇报数据结论的数据科学从业者而写。阅读完成后,你将掌握一套可复用的方法论:如何围绕数据驱动决策构建演讲内容(受众分析、内容打磨、三幕式结构、少即是多、数据可视化节制),以及如何上台呈现(建立信任、避免照读、制造悬念、运用幽默与故事化叙事),让听众真正感知到

gitblog_00623的博客 323

C++异常处理工程化:从标准库到自定义异常体系构建

异常处理是现代编程语言中实现错误管理的基础机制,其核心原理是通过分离正常执行流与错误处理逻辑来提升代码的健壮性。在C++中,异常机制的技术价值在于支持跨函数栈的错误传播与资源安全回收,是实现复杂系统容错性的关键。通过RAII(资源获取即初始化)等模式,可以确保在异常发生时自动清理资源,避免泄漏。在实际应用场景中,异常特别适合处理那些不常发生但影响严重的错误,如文件I/O失败、网络中断或内存分配问题。本文聚焦于如何基于C++标准异常库,构建一套工程化的项目级异常处理体系,涵盖从标准异常类的正确使用到自定义异常

weixin_29895109的博客 303

0day漏洞实战挖掘:从攻击面测绘到稳定利用的十大核心技巧

漏洞挖掘是信息安全领域的核心技术,其本质在于发现并利用软件系统中未知的安全缺陷。其原理通常围绕攻击面分析、代码审计与动态测试展开,通过识别程序处理外部输入的逻辑错误或内存管理缺陷,实现未授权访问或代码执行。这项技术的核心价值在于主动发现潜在威胁,提升系统安全性,并推动安全防御体系的演进。在应用场景上,它广泛渗透于渗透测试、红队评估、CTF竞赛及安全研究等多个领域。本文聚焦于0day漏洞的实战挖掘,系统性地拆解了从信息收集、逆向分析到模糊测试与利用开发的完整链条,并深入探讨了攻击面测绘、基于覆盖率的引导式Fu

weixin_33672109的博客 460

[逆向工程]逆向工程核心名词详解(十八)

逆向工程核心名词详解

曼岛_的博客 1641

AI驱动Windows内核漏洞挖掘:30天百洞背后的技术革命

模糊测试(Fuzzing)与静态分析是软件安全测试的核心技术,通过自动化生成异常输入或扫描代码来发现潜在缺陷。其原理在于模拟攻击行为,触发程序异常以定位漏洞。AI技术的融入,特别是大语言模型(LLM)和机器学习,正从根本上颠覆这一领域。AI赋能的安全测试能实现智能化的攻击面测绘、语义感知的测试用例生成与变异,以及对海量崩溃报告的智能聚类与去重,极大提升了漏洞挖掘的效率和规模。这为自动化安全审计、红蓝对抗和软件开发生命周期(SDL)左移带来了前所未有的技术价值。在操作系统内核、驱动程序等高价值目标的安全评估中

weixin_34221332的博客 474

Bochsdbg漏洞挖掘实战:从确定性调试到堆溢出分析

在软件安全与漏洞挖掘领域,调试器是分析程序行为、定位逻辑错误的核心工具。传统调试器依赖于实时执行环境,难以复现复杂状态依赖型漏洞。Bochsdbg作为开源x86模拟器Bochs的内置调试器,通过全系统模拟和确定性执行原理,提供了可暂停、可回溯的虚拟化环境,实现了时间旅行调试能力。这一技术价值在于能够像操作录像带一样反复分析程序崩溃瞬间,精准捕捉稍纵即逝的漏洞触发条件。在操作系统内核、固件和底层软件的漏洞挖掘场景中,Bochsdbg的确定性调试特性使其成为分析复杂状态机漏洞的利器。本文聚焦于利用Bochsdb

angou6476的博客 396

LibFuzzer实战指南:从覆盖引导模糊测试到CVE漏洞挖掘

覆盖引导模糊测试是一种先进的自动化软件测试技术,它通过监控代码执行路径来智能地生成和变异测试输入,从而高效探索程序的深层状态空间。其核心原理在于利用代码覆盖率作为反馈信号,引导测试数据向未执行的代码区域进化,这比传统的随机测试方法能更有效地触发边界条件和异常状态。这项技术的工程价值在于能够自动化地发现内存损坏、逻辑缺陷等各类安全漏洞,显著提升软件安全测试的效率和深度。在应用场景上,它特别适用于对C/C++编写的库函数、文件解析器、网络协议处理等核心组件进行高强度测试。本文以LibFuzzer这一主流覆盖引导

diaoqu4574的博客 303
上一篇: MFC4.0的CString在多线程环境下的一点研究
下一篇: 被安全软件撞了一下腰
FireBurn
博客等级 码龄22年 18粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值