Lua中的Hook机制

【逆向实战入门】Lua Hook进阶:从函数拦截到流程控制的实战解析 本文深入解析Lua Hook技术的进阶应用,从基础函数拦截到复杂流程控制,提供实战技巧与避坑指南。通过保存原函数指针、条件性Hook及调用栈分析等高级方法,帮助开发者在游戏辅助、自动化工具等场景中精准控制程序行为,同时确保稳定性和反检测能力。 阅读详情
The hook mechanism of the debug library allows us to register a function that will be called at specific events as your program runs. There are four kinds of events that can trigger a hook: call events happen every time Lua calls a function; return events happen every time a function returns; line events happen when Lua starts executing a new line of code; and count events happen after a given number of instructions. Lua calls hooks with a single argument, a string describing the event that generated the call: "call", "return", "line", or "count". Moreover, for line events, it also passes a second argument, the new line number. We can always use debug.getinfo to get more information inside a hook.

To register a hook, we call debug.sethook with two or three arguments: The first argument is the hook function; the second argument is a string that describes the events we want to monitor; and an optional third argument is a number that describes at what frequency we want to get count events. To monitor the call, return, and line events, we add their first letters (`c´, `r´, or `l´) in the mask string. To monitor the count event, we simply supply a counter as the third argument. To turn off hooks, we call sethook with no arguments.

As a simple example, the following code installs a primitive tracer, which prints the number of each new line the interpreter executes:

 debug.sethook(print, "l")

It simply installs print as the hook function and instructs Lua to call it only at line events. A more elaborated tracer can use getinfo to add the current file name to the trace:

    function trace (event, line)
      local s = debug.getinfo(2).short_src
      print(s .. ":" .. line)
    end
    
    debug.sethook(trace, "l")


cocos2d lua游戏逆向 打印日志(通杀) lua 脚本解密 通杀打印 阅读详情

相关推荐

别再只会print了!用Lua Hook机制打造你的自动化调试工具箱

本文深入探讨了Lua Hook机制在自动化调试中的应用,通过函数拦截技术实现非侵入式的日志监控、动态错误修复和性能分析。文章详细介绍了基础Hook模式实战和高级调试技巧,帮助开发者提升调试效率,特别适用于Redis、Nginx等嵌入式环境。

weixin_33749242的博客 755

【零基础破解辅助第一课】Lua脚本hook基础之浅述函数拦截机制

## Hook概念举例 >先给出一段示例代码,然后我们针对源代码进行分析 ```lua --lua代码 --当前时间20:09 print(os.data("%H:%M")); ``` **输出** ``` >>20:09 ``` >可以看到,这个方法把当前的时间获取,并且被print打印出来

qq_43118243的博客 2582

游戏逆向实战:通过Hook技术动态提取Lua脚本源码

在游戏开发与安全分析领域,脚本语言如Lua因其轻量级和易嵌入性被广泛用于游戏逻辑驱动。理解其加载机制是进行运行时分析的基础,Lua虚拟机通过API函数将源代码编译为字节码执行。Hook技术通过拦截关键函数调用,能在不破坏原有流程的前提下捕获内存数据,这一原理在游戏逆向、安全审计等场景中具有重要价值。本文聚焦于**luaL_loadbuffer**和**内存操作**等核心热词,详细阐述了如何定位函数地址、实现内联Hook,并构建一个能够动态提取加密或打包Lua脚本的Dump工具,为分析游戏逻辑架构提供了实用的

weixin_33968104的博客 414

Lua学习笔记:debug.sethook函数

使用Lua的debug.setHook函数

孙君的空间站 2447

别再死记硬背了!从Lua虚拟机运行原理,彻底搞懂Hook函数拦截是怎么一回事

本文深入解析Lua虚拟机运行原理,揭示Hook函数拦截的本质。通过函数重写、元表拦截和调试接口等多种方式,详细讲解如何在Lua中实现Hook技术,并对比其他语言的拦截机制。文章还提供了构建安全Hook系统的实战示例,帮助开发者掌握这一强大工具,提升代码调试和功能扩展能力。

weixin_30684743的博客 313

UE4SS与LUA脚本注入:从原理到实战的游戏Mod开发指南

在游戏开发与修改领域,脚本注入技术是实现功能扩展的核心手段之一。其原理是通过将脚本语言虚拟机嵌入到目标进程的内存空间中,从而实现对程序运行时行为的动态拦截与修改。这项技术的核心价值在于,它允许开发者在无需修改原始游戏代码的情况下,通过编写外部脚本,灵活地添加新功能、调整游戏逻辑或修复问题,极大地提升了二次开发的效率与安全性。在应用场景上,它广泛应用于单机游戏的模组(Mod)开发、自动化测试、游戏研究及辅助工具制作。LUA语言因其轻量、高效和易于嵌入的特性,成为游戏行业脚本化扩展的首选方案。本文以UE4SS(

weixin_29001683的博客 302

lua中通过debug.sethook()动态跟踪脚本当前执行的情况,包括运行到哪行、哪个函数、哪个文件

lua debug.sethook debug.getinfo

c1s2d3n4cs的博客 1852

Lua 5.3 源码分析(四)线程 lua_State

Lua 5.3 源码分析(四)线程 lua_StateLua 的THREAD 类型定义如下图: /* ** ‘per thread’ state */ struct lua_State { //1 Lua 类型公共头部 CommonHeader; //2 global_State *l_G

TTc 's share 2539

24.2 hooks

Hook机制的作用:一个运行程序执行某个事件时,会调用我们注册过的相应的函数。有四种事件可以触发一个hook: 调用事件(call):当Lua调用一个函数时发生;返回事件(return):当一个函数返回时发生;行事件(line):当Lua执行一行新的代码时发生计数事件(count):在执行完给定的指令条数之后发生 Lua用一个参数调用hook,就是用一个字符串表示事件:“call”(或

语言观止 1615

用Lua脚本Hook函数,5分钟搞定游戏辅助的“时间暂停”功能

本文详细介绍了如何使用Lua脚本Hook函数实现游戏时间暂停功能,特别适合《塞尔达传说:旷野之息》等开放世界游戏。通过函数覆盖、元表劫持和调试钩子三种方法,开发者可以轻松拦截并修改游戏时间函数,实现时间冻结或变速效果。文章还提供了完整的实战方案和进阶技巧,帮助玩家在单机游戏中获得更好的体验。

weixin_30892763的博客 397

STM32 BLDC无刷电机霍尔信号捕获与换相控制实战解析

本文深入解析了STM32如何实现BLDC无刷电机的霍尔信号捕获与换相控制。详细阐述了硬件接口配置、定时器霍尔传感器模式的使用、抗干扰的滤波器与软件容错设计,以及中断服务与换相逻辑的实战代码。重点解决了信号抖动、换相不准等常见问题,旨在帮助开发者构建稳定可靠的电机驱动基础。

weixin_29193259的博客 366

Lua中的错误处理与调试类

一、错误处理 pcall:返回两个参数值,第一个标记为true/false,第二个为错误信息;

mozhi 1554

【高级-RAG-优化方法】

本文介绍了两种优化RAG(检索增强生成)系统的高级方法。第一部分介绍KnowFlow项目,它采用父子分块技术,将文档分为父分块(800-1500字符)和子分块(200-400字符),通过精确匹配子分块再返回父分块内容来保证搜索精确性和上下文完整性。第二部分探讨Milvus的多种增强技术,包括查询增强(如假设问题生成、回溯提示)、索引增强(自动合并块、分层索引)、检索器增强(句子窗口检索、元数据过滤)、生成器增强(提示压缩、块排序)以及管道增强(自我反省、代理查询路由)。这些方法共同提升了RAG系统的检索效率

weixin_48585108的博客 958

【亲测免费】 探索Lua性能瓶颈的利器:lua-profiler

探索Lua性能瓶颈的利器:lua-profiler 项目介绍 在Unity3D手游开发中,Lua因其轻量级和灵活性被广泛应用,尤其是在需要频繁更新和bug修复的场景中。然而,Lua代码的性能问题却常常成为开发者的痛点。传统的调试工具往往无法深入分析Lua代码的执行效率,导致性能瓶颈难以定位。为了解决这一问题,lua-profiler应运而生。 lua-profiler是一个专为Unity3D环境设...

gitblog_00235的博客 767

手把手教你搭建三端口DC-DC变换器(含Boost+Buck电路实战)

本文详细介绍了如何从零开始搭建三端口DC-DC变换器,涵盖Boost和Buck电路的硬件设计、元器件选型、电路板布局、焊接技巧、控制系统设计与调试等关键步骤。通过实战案例和优化建议,帮助工程师避开常见陷阱,提升系统效率和稳定性,适用于光伏、储能等电力电子应用场景。

x8y9z0的博客 929

Altium Designer20-柔性PCB绘制技巧

Altium Designer2020-柔性PCB绘制技巧 注:教程所用PCB随意找的,并没有完全绘制完,大家学习PCB折弯方法即可。 1.打开PCB,点击视图->板子规划模式1,如下图所示 2.点击设计->定义分割线,用两条分割线绘出要折弯的区域 3.点击设计->定义弯曲线(弯曲线呈现黄色) 4.用快捷键d,k进入layer manage stack(层叠管理器),在f...

weixin_44450279的博客 1万+

lua-protobuf钩子机制详解:如何自定义编码解码行为

在使用lua-protobuf进行数据序列化和反序列化时,钩子机制是一个强大而实用的功能,它允许开发者自定义编码和解码行为,满足特定业务需求。本文将详细介绍lua-protobuf钩子机制的使用方法,帮助你轻松掌握这一高级特性。 ## 钩子机制概述:什么是lua-protobuf钩子 钩子(Hook)是lua-protobuf提供的一种回调机制,通过注册自定义函数,你可以在数据编码或解码的特定

gitblog_00468的博客 1219

Java Swing之多文档界面设计-JDesktopPane、JInternalFrame类简单应用示例

Java MDI多文档界面是一种用户界面风格,允许在一个主窗口中包含多个子窗口(文档窗口),每个子窗口可以显示不同的内容或功能模块,从而可以满足用户打开不同窗口完成不同功能的需求。开发多文档程序,一般需要JDesktopPane(桌面面板类)和JInternalFrame(内部窗体类)两个类。以下简单介绍,最后通过一个实例介绍实现逻辑。

编程语言教学工作者的博客 2209

Compositor 免费开源图像编辑器:1.7万星的 PS 平替为何爆火

每月订阅费交到手软,GIMP 的界面又陌生得像进错厨房——Mac 上想找个全功能图像编辑器,一直没得选。Compositor 就是为此而生的:免费、开源、能商用的 macOS 图像编辑器,图层、蒙版、调整图层、Camera Raw 式调色一应俱全,PS 老手几乎零成本迁移。 ## 项目名片:它到底是什么 作者在 README 里把动机写得直白: > "Adobe Photoshop cost

gitblog_00012的博客 1102

简单记录一次拿网站后台的过程

本文章重在让大家了解拿后台的逻辑与流程,请不要利用此文章的内容对别人的网站进行攻击破坏,否则后果自负,作者不承担任何责任。

kk的博客 916

OWASP 2025版AI大模型攻击安全风险汇总(攻击方法种类)

提示词注入是大模型最基础、最常见的核心漏洞,攻击者通过构造直接或间接的恶意自然语言输入,篡改大模型原本的正常行为与输出结果。哪怕这类恶意内容对人类是隐藏、不可见的,只要模型能够正常解析读取,就会触发漏洞。它和大家常说的模型“越狱”相关,但并不等同:越狱是提示词注入的极端形式,会直接让模型彻底无视所有内置安全协议,完全脱离管控;而普通提示词注入,更多是针对性篡改模型行为、诱导执行特定操作。

墨痕诉清风的博客 513

leetcode.nvim Hook机制深度应用:如何自动化你的刷题工作流

🚀 **提升刷题效率的终极秘籍**:掌握leetcode.nvim的Hook机制,让你的LeetCode刷题工作流自动化程度翻倍!作为一款强大的Neovim插件,leetcode.nvim不仅让你在编辑器中直接解决算法问题,更通过Hook机制提供了无限的自定义可能性。本文将为你揭秘Hook机制的核心原理,并展示如何利用它打造个性化的刷题自动化工作流。 ## 🔧 什么是leetcode.nvi

gitblog_01035的博客 1163

【点云鸟瞰图BEV】点云鸟瞰图BEV原理与可视化

本节将介绍激光雷达等点云的鸟瞰图生成原理、代码及效果图。 1 BEV视图原理 点云BEV(Bird's Eye View)视图是指点云在垂直于高度方向的平面上的投影。通常,在获得bev视图前,会将空间分割成体素,利用体素对点云进行下采样,然后将每个体素作为一个点进行投影。体素是指将三维空间按照固定尺寸长方体进行划分时的长方体(Δl*Δw*Δh)。 体素投影时可以得到BEV视图的像素点坐标。每个像素点的特征取值则可以通过多种方式得到。 ...

叶子的博客 2万+

运行时Hook技术揭秘:动态捕获Lua脚本的原理与实践

在软件逆向工程与安全分析领域,Hook技术是一种通过拦截程序执行流程来监控或修改其行为的基础方法。其核心原理是在目标函数执行路径上插入自定义代码,从而在运行时获取关键数据或改变程序逻辑。这项技术的工程价值在于,它能够绕过静态加密和混淆,直接访问内存中的明文或解密后内容。在游戏分析、安全审计和竞品研究等场景中,Hook常被用于动态提取脚本、分析通信协议或理解程序内部状态。本文聚焦于利用Hook技术,针对Lua虚拟机加载代码的关键函数(如luaL_loadbuffer)进行拦截,从而在游戏运行时动态捕获并保存其

weixin_34378969的博客 353

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

浅析android手游lua脚本的加密与解密

本文转载自看雪论坛-littleNA,如需转载请联系原作者 0.前言 这篇文章是本人在学习android手游安全时总结的一篇关于lua的文章,不足之处欢迎指正,也欢迎大牛前来交流。本文目录如下: 目录 0. 前言 1. lua脚本在手游中的现状 2. lua、luac、luaJIT三种文件的关系 3. lua脚本的保护 3.1 普通的对称加密,在加载脚本...

u014753748的博客 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Hook lua库函数时遇到的问题

最近在为distri.lua实现一个lua调试系统,有一个简单的需求,lua导入一个文件的时候,将这个文件的文件名记录下来, 以方便调试器在设置断点的时候判断是否一个合法的文件. lua导入文件是通过luaL_loadfilex实现的,一个简单的思路就是修改luaL_loadfilex,在luaL_loadfilex中调用一个外部定义的函数将导入的文件名传给那个外部函数,由它记录下来. 但这种侵入...

weixin_33696822的博客 279

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: lua 说明self,点号或冒号的关系
下一篇: Nginx + Lua + 共享内存实现动态查询(简单例子)
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值