在地铁上破解软件,被一群人围观!

yudao-cloud 开发如何解决 一键搞定改包难题 最近在接手一个新项目时,发现需要对 yudao-cloud 的包名进行修改。从 Maven 的groupId到前端的title,再到数据库的 SQL 配置,一切都得改。这时候,我发现了 yudao-cloud 提供的 ProjectReactor 工具,它可以一键完成这些繁琐的修改!听我慢慢给你讲。yudao-cloud 其实给我们提供了程序,支持一键改包功能,包括 Maven 的groupIdartifactId、Java 的根package、前端的title标题、数据库的 SQL 配置以及应用的。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

65b702b991e448f0cdf3532200f1a1a3.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:轩辕的编程宇宙


注意看,这是一道软件破解题:

621f0503a026b01f6d15ac53ba04e8d9.jpeg

题目是这样的:附件是一个压缩包,里面是一个exe文件被拆分成了几部分,需要做的是把这个exe文件重新组装起来,成功运行它,然后破解它拿到flag。

这是我给学逆向的同学出的一道典型的CTF Pwn类型的题目。结果200多位小伙伴参与,只有十几位成功破解拿到了flag,真的有这么难吗?来看看你能扛到第几关?

破解思路

首先下载这个压缩包,解压后,会发现有4个文件:

eeae7acf8add156b7267c912d2d931e6.png

然后我们用十六进制编辑器分别打开这四个文件,看一下:

b.dat :

8f57560cd30ade9f52e9dab64c1f4124.png

看不出是个啥,再看看其他的。

d.dat :

d6780f9c212c191d2e6ea4db7f5b8dd8.png

只要学习了PE文件格式的同学,通过MZ标记很容易看得出来,这是PE文件中的DOS头部,是整个文件最开始的部分。

然后用十六进制编辑器创建一个新文件,把这个第一部分d.dat的内容复制进去。

接下来看看其他块。

p.dat :

d1f83089797b025a9e46b6ddc03775e5.png

这个也很容易看出,是NT头,是紧接着前面DOS头后的第二部分。

把这部分内容也复制到咱们刚刚创建的新文件后面。

s.dat :

c7156bc87c17080fc1e4c66bd1145eda.png

这一个部分,看右边的.text、.rdata、.data就能看得出来,这是节表的内容,是在NT头后的第三部分。

这样推断出来,最开始的b.dat应该就是最后文件的正文内容了,它的体积也是最大的。

把这四部分内容按顺序复制到我们新建的那个文件中,然后另存为一个exe文件,尝试去双击执行它。

PS:

实际上,这四个块的命名也有讲究,d就是dos头,p就是PE头,s就是节表section,b就是文件正文体body。

然后,有很多小伙伴发现了一个问题,双击运行程序报错了:

9deb77ed453b5f6debdd90d68d1c90de.png

难道拼的有问题?

有不少小伙伴都倒在了这里。

实际上,这里我埋了一个小小的坑,其中有个节我多塞了一个字节进去,就是这一个字节,让拼出来的PE文件格式错误,运行不起来。

仔细去检查刚才的四个数据块,你就会发现节表的那个块,前面多了一个00:

a2e7bfc432b84d5e6b6ee7b6f128e3be.png

删除这一个字节,我们再次尝试双击这个exe程序,结果发现还是不行,还在报错:

1332f89b8aef5edcac4016281dc410a1.png

不过仔细看,报错类型不一样了,提示是找不到一个动态链接库。其实看到这个报错,就能确定一件事,我们的PE文件组装已经OK了,接下来要解决这个新问题了。

一个exe程序要运行,它通常会依赖一些其他的动态链接库,有系统库,比如kernel32.dll,也有程序自己依赖的其他库。不管哪种情况,这些依赖的动态库都记录在它的文件结构中,这就是PE文件的导入表。

上面这个报错,就是系统在创建进程时,在解析这个PE文件的导入表过程中,发现了它需要依赖一个license.dll文件,然后尝试去加载这个dll,然后又没有找到,所以报了这个错,进程创建失败。

我们可以用DEPENDS工具来看下这个程序的导入表:

80d68801af3898f91cf079d2e91796ed.png

可以看到,这个程序引用了一个叫license.dll动态库中的GetLicense函数。

接下来是我们的逆向分析神器IDA登场的时候了。

把这个组装出来的程序放入IDA中来分析分析:

dcc6ce57d9f125b8a65a5e86050ded28.png

IDA定位到了main函数,然后很容易看出main函数的代码逻辑,这里调用前面的GetLicense函数,然后检查函数的返回值,检查通过就打印输出flag,失败则输出一个错误信息。

当然,为了避免一眼就直接拿到flag,我对flag进行了一个简单的编码,打印输出的时候,需要先解码还原。

如果大家看汇编有些吃力,还可以直接用IDA反编译成C语言,这看起来就容易得多了:

2c24716117d08d2dbc7056cb3c62be5b.png

根据我们刚才的分析,把上面那些函数和变量重新命个名,看起来更清晰:

ca146edf1fdf169ffd3218335299a0b5.png

是不是好理解得多了?

看到这里,思路就出来了:

方法1:自己编写一个这个名字的DLL文件,然后导出一个名为GetLicense的函数,让程序成功运行起来,打印出flag。

方法2:直接暴力破解,修改关键汇编指令,让程序强行走入打印flag的分支。

方法3:最简单的,找到解码flag的函数,直接分析它是如何解的,自己写程序模拟解一遍就行了。

我们三种方法都试一下。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

方法1:编写DLL

观察一下IDA分析视角下,程序中调用GetLicense函数的汇编指令,可以看得出来这个GetLicense函数只有一个整型参数,然后返回值是一个字符串指针。函数的声明就出来了:

char* GetLicense(int n);

第一种方法的关键,是要让GetLicense函数返回一个符合要求的字符串,也就是license,这样才能通过程序里的检查。

所以,我们先来分析一下,原程序中,是怎么检查license的:

e7de679501d2f570d5b9da1a7e093916.png

检查函数返回的是一个bool,里面的检查逻辑也比较简单。

首先通过strlen获取license的长度,检查长度是不是16,如果不是,则返回false。

接着是一个for循环,我们先跳过,最后来看它。

最后的return是一组&&连接的检查,首先检查license的第4-7个字符的和(ASCII的和)减去第0-3个字符的和是不是为1。然后检查第8位是不是45。换成ASCII字符就是短横线-:

ab5654bc0de9ba0352200bec002f714a.png

最后回过头看看中间那个for循环。里面在调用另一个sub_401096函数,然后把license的每一个字符传进去。

进去看一下这个函数:

7db077a2a09c6e8e39cba3865d151d04.png

这个函数里面又是一个for循环,在检查参数传进来的字符是不是在一个byte数组中,如果是就返回1,否则返回0。

这个数组里面是啥呢?进去看看:

66bd6362bba781be9f8c86ddff3a5fcf.png

好了,总结一下,前面的检查license的函数里面在干四件事:

  1. 检查license字符串长度是不是16;

  2. 检查license字符串中的每一个字符是不是在上面的byte数组中;

  3. 检查license字符串第0-3个字符的和比第4-7位字符的和小1;

  4. 检查license字符串的第8位字符是一个短横线。

其实这个license检查规则,是我根据字符串xuanyuan-zhifeng设计出来的,但不是说license必须是这个,你的字符串只要符合上面的要求都可以。

好了,咱们来编写一个DLL:

extern "C"
__declspec(dllexport) 
char* GetLicense(int code)
{
 return "xuanyuan-zhifeng";
}

注意,需要使用extern "C",否则导出的函数名字会发生变化。

然后把DLL放置到前面我们拼接的exe目录下,这时候再来运行我们的程序:

5d1d028d57052f0c5b6ff48fbb2d019a.png

flag已经出来了:xuanyuan@biancheng.universe。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

方法2:暴力破解

这里先不动用动态分析,还是用IDA来搞定。

具体怎么暴力破解呢?首先想到的最简单的,就是这条JZ指令,只要能把它窜改成JNZ,即便license检查不通过,也会走入打印flag的分支。

48cc9c843edce7bfe000a761c5a0c053.png

但在这之前,我们需要让程序能够先运行起来,不受那个DLL的依赖束缚。

前面讲过,程序的依赖项是在导入表中,那为今之计,就是找到导入表,把这个DLL干掉。

首先需要定位到导入表在PE文件中的哪个位置。先找到文件头的数据目录,数据目录的第二项是导入表的RVA。然后根据节表中每个节的RVA,定位到导入表在哪个节。然后再根据那个节的FOA,定位到文件中的位置。

然后通过导入表描述符的Name字段,就能知道这第一项就是license.dll。

b8d0d0c4d91c3930a7c73ecc81629f22.png

用导入表的后面第二项kernel32.dll的内容覆盖license.dll的导入表项。然后把原来kernel32.dll的项清零,就完成把license.dll从导入表中抹去的工作。

我们用Depends工具来看下现在这个程序的导入表:

027c2c6a7ba8fc2471fddec0b0ae5be3.png

可以看到,现在只依赖kernel32.dll了,不需要license.dll了。

但你现在去执行还是有问题,因为咱们程序里面使用了外部引入的GetLicense函数啊,你现在都没license.dll了,这个函数没法调用了。

d38a3179b22c7b59530e1bc09d7a99eb.png

那干脆一不做二不休,直接HOOK main函数的流程,让它一进来就直奔打印flag的分支。先不管它堆栈平衡的问题,反正咱们的目的是拿到flag,拿到以后哪管它崩不崩溃。

4ff0a8e6071edcf5c93d9392d58649d3.png

所以,我们可以把main函数入口地方直接篡改成一条短跳指令,直接跳到flag解码打印的分支:

d4bdcace8080937a0c96082b0e2be34c.png

然后来执行这个程序:

14df224be6837ffd8d47663960bfcaf7.png

flag又被我们召唤出来了!

方法3:直接解码flag

前面两种方法还是有一点麻烦,既然我们要的是flag,那么直接对flag下手,看它藏在哪里,然后想办法把它解出来就行了!

通过IDA反编译出来的C代码,可以看到这个函数就是在负责对flag进行解码。

cc7c417d0a373e9d4f740e580baad38a.png

双击这个函数,然后反编译看一下解码函数的逻辑:

3735c310de719386953bdcb9c8f45dff.png

经过对汇编指令的分析,这个函数实际上是没有返回值的,我们对其中的一些变量名称以及类型、函数的返回值类型进行人工修正,让它看起来更清晰:

acb1c182f19592f378efda8df4027ef3.png

这下简单明了了吧,实际上就是在对flag字符串的每一位,与一个key进行异或运算。

双击看一下这个key是个啥:

563c3361d4c2a6f936f30f70d4d15509.png

就是一个字节的0xCC。

然后回去看一下解码前的那个flag:

735bdbaf0fe357d69649ee48dbda2b64.png

切换到十六进制窗口:

001ef36b76ae38384ad6cf0962f4642a.png

都到这儿了,问题都好办了吧,自己写个简单的程序,按照解码函数那样把这段数据处理一遍就出来了:

void my_decode_flag() {

 char flag_bytes[] = {
  0xB4, 0xB9, 0xAD, 0xA2, 0xB5, 0xAD, 0xA2, 0x8C, 
  0xAE, 0xA5, 0xAD, 0xA2, 0xAF, 0xA4, 0xA9, 0xA2, 
  0xAB, 0xE2, 0xB9, 0xA2, 0xA5, 0xBA, 0xA9, 0xBE, 
  0xBF, 0xA9, 0x00
 };

 for (int i = 0; i < strlen(flag_bytes); i++) {
  flag_bytes[i] ^= 0xCC;
 }

 printf(flag_bytes);
 printf("\n");
}

来编译运行下试试:

75d6cdffa3e3445e5aa025ee82090b6f.png

再一次成功拿到了flag!

地铁上争分夺秒:

2d94c32107c518f74b72280a58aea1b9.png

欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

2a152c7628a7e648253cd30668ae2e45.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

330de44673a62b5646194c85461c87c1.png

7b797f3ba33d328e49c71805dbdd111c.pngaecc0f0c1c8ae71e12abf31b00525eeb.pngb835b32a97669d272bd3e4b8f4b86e90.png2d04b8900c6683e86a720b0ff7a9abe8.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略 芋道开发框架,低代码平台 阅读详情

相关推荐

若依芋道源码文档加sql 拒绝任何人割韭菜

免费免费免费免费免费免费免费免费免费免费看不惯恶心的人

【亲测免费】 Yudao-Cloud 开发者指南

Yudao-Cloud 是一个基于 Spring Cloud 微服务架构的开源项目。以下是项目的目录结构及其简要介绍: ``` yudao-cloud/ ├── .gitee/ # Gitee 仓库同步文件 ├── .github/ # GitHub 仓库相关文件 ├── .image/ # 项目图片资源 ├── sql...

gitblog_00932的博客 1297

单体文档-yudao-vue-pro,芋道源码收费文档,完整开发技术文档

单体文档--yudao-vue-pro,芋道源码收费文档,完整开发技术文档

芋道源码

芋道源码 来源链接:http://www.iocoder.cn/

李昊的博客 2363

芋道源码防割韭菜指南[代码]

文章介绍了如何避免被割韭菜,通过使用插件解锁芋道源码的开发指南文档。具体操作简单,只需小小步骤即可观看原本需要付费的内容。项目地址为otomayss/free-yd (github.com),提供了相关插件的获取途径。

IPSec Over GRE和GRE Over IPSec技术

IPSec Over GRE 和 GRE Over IPSec 一. 技术介绍 IPsec     主要作用是对数据进行加密,因为他能提供所有有时候被单独用作实现加密的一种方法!IPsec建立的是一个逻辑隧道,并不是真正意义上的隧道!并且不能提供路由功能,因为IPsec不支持非ip流量,也不支持广播(组播)! GRE     (通用路由封装)能很好的提供一个真正意义上的点对点的隧道,GRE是一种三层VPN封装技术。GRE可以对某些网络层协议(如IPX、Apple Talk、IP等)的报文进行封装,使封装后

qq_56228347的博客 9870

终于知道工资为什么要保密了。。。

点击关注公众号,SQL干货及时获取 后台回复:1024,获取海量学习资源 SQL刷题专栏 SQL145题系列最近在网上看到一个关于薪资的帖子:在职场待久了,大家都会形成一些默认的共识,其中不要打听别人的薪资或者公布自己的薪资,这是最基本的操作。有人可能会好奇:不就是工资吗?有必要那么较真吗?你还别说,真有必要。从公司层面来说,同一个岗位,根据面试者过往的经验和薪资水平,面试的时候给的工资或多或少会...

SQL数据库开发 676

时序SDC约束set_data_check及常见应用场景

时序约束SDC之set_data_check命令及常见应用场景解析

weixin_37584728的博客 2288

芋道以开源之名行下作之事 恬不知耻 标榜自己开源 特公开全部源码+sql 不用再加入知识星球 2024-08-14

链接: https://pan.baidu.com/s/1TeuxbAUfLQ5_BqMBF1kniQ?pwd=cqud 提。依次为后端、补充版的sql、前端。此文档内安装部署等一应俱全。

bojikeqian的博客 5030

金桔智慧物流之容器(托盘、周转箱等)定位及周转方案原理

金桔智慧物流之容器(托盘、周转箱等)定位及周转方案原理 在物流行业种,托盘是标准化运输的关键的配件,而容器存在丢失、盘点、闲置等管理问题。如何通过信息化的手段提升容器的寿命,提高调配效率,降低闲置是物流容器行业的关键点。 金桔蓝牙网关配合金桔蓝牙资产管理终端可以解决物流行业痛点问题。 容器管理面临的问题: 技术方案 场景描述之库房 场景描述之车辆 场景描述之终端 方案优势 ...

jinjufocus的博客 1183

振动能量采集技术:从原理到实战,破解物联网供电难题

能量采集技术旨在捕获环境中的废弃能量(如机械振动、热能、光能)并将其转化为电能,其核心原理在于通过压电、电磁、静电或摩擦电等物理效应实现能量形式的转换。这项技术的核心价值在于为物联网(IoT)中难以布线或更换电池的分布式传感器节点、植入式医疗设备等提供近乎永续的电力解决方案,从而解决物联网部署的“最后一米供电”瓶颈。其应用场景广泛覆盖工业预测性维护、结构健康监测、可穿戴设备及消费电子等领域。本文聚焦于振动能量采集这一细分方向,深入剖析了压电式、电磁式、电容式及摩擦纳米发电机(TENG)等主流技术路线的实战考

weixin_42660494的博客 569

芋道源码 yudao-cloud:构建全功能后台管理系统的技术探索

芋道,以开发者为中心,打造中国第一流的快速开发平台,全部开源,个人与企业可 100% 免费使用。master分支为 JDK 8 + Spring Boot 2.7,分支为 JDK 17/21 + Spring Boot 3.2管理后台的电脑端:Vue3 提供 element-plus、vben(ant-design-vue) 两个版本,Vue2 提供 element-ui 版本管理后台的移动端:采用 uni-app 方案,一份代码多终端适配,同时支持 APP、小程序、H5!

chenchuang0128的博客 1万+

华为OD机试双机位B卷 - 比赛的冠亚季军 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位B卷 比赛的冠亚季军,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。 华为OD机试 比赛的冠亚季军

qq_45776114的博客 703

芋道框架讲解

官方文档:yudao-cloud 开发指南gitee:yudao-cloud: ruoyi-vue-pro 全新 Cloud 版本,优化重构所有功能。基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城、CRM、ERP 等功能。你的 ⭐️ Star ⭐️,是作者生发的动力!

Java后端技术栈 4583

保姆级教程:一步步创建 ABAP Text Table

有朋友反馈,问有没有一个自己动手创建 Text Table 的例子,因为自己没有动手实践过,总觉得心里不踏实。这个行为的语义是,ZAI_TYPE_T 这张表的 AI_TYPE 字段值,不能随便维护,必须是表。然后另一个需要添加的字段是 AI_TYPE 这个字段值对应的文本值,本例笔者采用 SAP 标准的。也是自己创建的,很简单的一个 Data Element,类型为 CHAR,长度为 2.依次给主表的 01,02,03 三个字段值维护对应的描述信息,最后效果如下。按照下面的字段结构,创建另一。

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

C#上位机+TensorFlow Lite 轻量化AI模型部署实战(工业级完整版,低算力工控机首选)

工业自动化轻量化AI部署指南:C# + TensorFlow Lite实战 摘要:本文针对工业自动化领域机器视觉部署的痛点,提出基于C#和TensorFlow Lite(TFLite)的轻量化解决方案。该方案完美适配低算力工控环境(J1900/2G内存),具有以下核心优势:1)极致轻量化,模型体积仅KB-MB级;2)CPU深度优化,单帧推理≤15ms;3)零环境依赖,纯C#部署;4)工业级稳定性,7×24小时运行。教程涵盖从环境搭建、模型转换到C#封装的完整流程,特别提供YOLOv8等工业常用模型的TFLi

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1031

免费获取芋道源码ruoyi-vue-pro和yudao-cloud的sql脚本,持续更新!

ruoyi-vue-pro和yudao-cloud都属于芋道源码,但用过的人都知道,这两个开源项目下有商城、ERP、CRM等模块,这些模块的SQL需要加入芋道源码的知识星球才能获取,加入费用为199元,有点小贵!芋道源码的ruoyi-vue-pro和yudao-cloud都已经发布到GoldPanKit上,通过GoldPanKit构建项目不仅可以免费获取到SQL,还能选配功能模块,调整包名,自动配置数据库。

Caesar's blog 1万+

Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机

使用FinalShell或Asbru远程连接虚拟机

howard2005的专栏 2279

被警告了!

前两天,在一个安全大佬云集的神群里,发生了一件事儿。事情大致是一位网友购买某平台的课程后发现被骗不给退钱,然后其好友因为精于破解技术,遂拔刀相助,破解了该平台的APP,以泄其愤。随后,该公...

纯洁的微笑 3506

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

芋道商城部署文档,完整sql,视频资源自取

芋道源码,芋道商城,文档,视频,sql,公开,自取,免费

云胜的笔记 761

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

芋道快速开发平台学习笔记

登录是将用户对象转换成string,使用key-value方式保存到redis中。有个不算bug的buffer,浏览器不会默认勾选http请求头参数tenant-id,需要手动勾选,如果项目不需要,可以在配置中设置忽略该请求,application.yaml。其次检查最外层的pom文件modules的引用是否正确,少引用了mavne会首先从本地服务器查找,本地缺失就会从服务器下载,下载不到就编译报错。城市地区信息保存在area.csv文件,启动时加载到内存,使用AreaUtils.java获取城市信息。

如是所来的专栏 2508

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

芋道源码(无遮羞布版)Spring Boot 全景指南

芋道源码()项目基于Spring Boot构建,旨在提供一个全面且易于定制的企业级应用框架。│├── gitignore # Git忽略文件配置├── LICENSE # 开源许可协议MIT├── README.md # 项目读我文件,包含项目说明和访问文档方式├── pom.xml # Maven项目的主POM文件,定义依赖和构建设置│├── mysql_script # 数据库初始化脚本│├── yudao-dependencies # Maven依赖版本管理模块。

m0_67393827的博客 2336
上一篇: SpringBoot 动态权限校验,优雅的实现方案
下一篇: SpringBoot 在部署的时候打包成 jar 和 war 有什么不同?
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值