通过system调用Am命令执行动作

Android三方APK通过Socket实现高权限Shell命令执行方案详解 在Android开发中,进程间通信(IPC)是解决应用沙盒隔离与功能扩展需求的核心技术。通过Socket通信机制,不同进程可以建立稳定、高效的数据通道,实现跨进程的指令与数据交换。这一原理在系统级功能集成、自动化测试和设备管理等领域具有重要技术价值,能够突破普通应用权限限制,安全地执行高权限操作。具体到Android三方APK执行Shell命令的场景,通过构建客户端-服务端架构,利用拥有系统权限或Root权限的服务端作为命令执行代理,普通应用即可通过Socket发送指令并获取执行结果。该方案涉及权限管理、通 阅读详情

在底层代码中看到这样一条语句:

         system("/system/bin/sh -c \"am broadcast -a android.intent.action.AT_AIRPLANE_MODE --ez state true\"");

system 这是干什么的啊??

         经google原来system是系统调用,执行一个系统命令。

        

  这里system加上其参数的意思:

    调用system,通过shell,执行可执行程序或者脚本am,

    发送broadcast Action为:android.intent.action.AT_AIRPLANE_MODE 广播参数--ez 键值对 state true……

        

         这样也可以啊,我原来以为android底层要主动和上层进行交互,就得通过socket等,原来这样也可以的,真是学习了。

        

1 system命令

  system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed.

During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.

  system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令;

  在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说;

  在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。

        

  为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作:

    a.fork一个子进程;

    b.在子进程中调用exec函数去执行command;

    c.在父进程中调用wait去等待子进程结束。

 

    对于fork失败,system()函数返回-1。

  如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。

  注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了

  如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127.

  如果command为NULL,则system()函数返回非0值,一般为1.

 

具体可参考这篇文章:

         http://my.oschina.net/renhc/blog/53580

        

2 AM

         am的代码实现在\frameworks\base\cmds\am\目录下:

\frameworks\base\cmds\am\am 这个就是放在system/bin/am:

  base=/system

  export CLASSPATH=$base/framework/am.jar

  exec app_process $base/bin com.android.commands.am.Am "$@"

        

  通过app_process创建执行com.android.commands.am.Am这样进程 $@传递所有参数给Am

    \frameworks\base\cmds\am\src

    \frameworks\base\cmds\am\Android.mk

  将编译java层Am为一个am.jar包,下面看一下Am的支持的功能。

         

复制代码
public static void main(String[] args) {
        try {
            (new Am()).run(args);
        } catch (IllegalArgumentException e) {
            showUsage();
        }
    }
    
    private void run(String[] args) throws Exception {
        ……
        //获取ActivityManagerService实例
        mAm = ActivityManagerNative.getDefault();

        mArgs = args;
        String op = args[0];
        mNextArg = 1;
        
        //Am所支持的命令 
        if (op.equals("start")) {
            runStart();
        } else if (op.equals("startservice")) {
            runStartService();
        } else if (op.equals("force-stop")) {
            runForceStop();
        } else if (op.equals("kill")) {
            runKill();
        } else if (op.equals("kill-all")) {
            runKillAll();
        } else if (op.equals("instrument")) {
            runInstrument();
        } else if (op.equals("broadcast")) {
            sendBroadcast();
        }
        …… //很多命令
    }
复制代码

 

看一下发送广播的命令:

复制代码
private void sendBroadcast() throws Exception {
        //解析发送广播的参数
        Intent intent = makeIntent(UserHandle.USER_ALL);
        IntentReceiver receiver = new IntentReceiver();
        
        //通过AMS发送广播
        mAm.broadcastIntent(null, intent, null, receiver, 0, null, null, null, true, false,
                mUserId);
        receiver.waitForFinish();
    }
复制代码

  所以Android 还有这样一个工具am,通过看showUsage,可以干很多事情的;

魔兽世界怀旧服宏命令全解析:从自动换装到智能判定,老玩家才知道的黑科技 本文全面解析魔兽世界怀旧服宏命令的高级应用,从自动换装到智能判定,揭秘老玩家专属的黑科技技巧。深入探讨怀旧服特有的宏命令机制,包括施法队列、装备切换系统和职业专属技巧,帮助玩家在经典旧世版本中提升战斗效率。 阅读详情

相关推荐

point transformer v3结构

分割结构: embedding->enc->dec embedding->enc0->enc1->enc2->enc3->enc4->dec3->dec2->dec1->dec0 embedding ->block0->block1 ->dow->block0->block1 ->dow->block0->block1 ->dow->block0->block1-&gt

weixin_45625419的博客 582

35.注册监听器的两种方法(View.OnClickListener)

1. 使用匿名类注册监听器public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV

liuzhiqinag的博客 3547

Versal - 从零构建Petalinux 2024.2 AI边缘计算平台(VD100+SDT+JupyterLab实战)

本文详细介绍了如何从零开始,基于AMD Versal VD100开发板和Petalinux 2024.2构建AI边缘计算平台。内容涵盖开发环境搭建、Petalinux工程创建与配置、SDT新流程实战、启动SD卡制作,并最终集成JupyterLab与Conda,打造出开箱即用的交互式AI开发环境,帮助开发者快速进行算法验证与部署。

5f4d3s2a1q的博客 490

【Android】 应用程序运行 /system/bin 下setting命令

因有需求做app来通过按钮来调用/system/bin/ 的脚本。 将此处加入对应代码中,如果是第三方应用需要主意执行/写入权限问题。 try{ // 执行setting 命令将状态栏跟虚拟按键设置成沉浸模式 Runtime.getRuntime().exec(" settings put global policy_control immersive.full=...

Healer 2047

ArcMap投影变换避坑指南:为什么你的坐标转换总出错?常见问题解析与解决方案

本文深入解析ArcMap中坐标转换与投影变换的核心区别与常见陷阱。针对坐标转换总出错的问题,从混淆“定义投影”与“投影变换”、栅格数据重采样选择、矢量数据地理变换参数设置等关键环节,提供清晰的避坑指南与实战解决方案,帮助用户确保空间数据的精确匹配。

weixin_29210727的博客 357

PaddleOCR实战指南:从环境搭建到自定义模型训练

本文提供了PaddleOCR从环境搭建到自定义模型训练的完整实战指南。详细介绍了使用Anaconda或Docker搭建稳定开发环境、准备与标注数据集、进行文本检测与识别模型训练的核心步骤与参数调优技巧,并分享了数据增强、模型微调及解决实际项目难题的实用方法,帮助开发者高效掌握PaddleOCR应用。

gold的博客 644

Android 新增可执行脚本方式总结

shell rc android 节点

xss534890437的博客 1792

作物生长模型Oryza V3实战10:运行文件参数详解

运行文件(.rer)用于批量模拟农业场景,包含多组参数集(Rerunset),每组设定独立的时间范围、灌溉施肥方案等,支持测试不同农艺措施效果。该文件可实现参数自动校准,通过多组参数组合迭代寻找最优值。模拟结果文件(res.dat)会记录全部测试时间段的数据,便于用户对比产量、水分利用率等指标,筛选最优方案或分析气候适应性策略。

209

/system/bin|sh -c 请教大神一个问题

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 【码工】信仰...

qq_41348985的博客 1026

MoveIt 运动学、运动规划、混合规划、move_group

混合规划是运动规划方法的一个术语,它将异构运动规划器结合起来,以产生更稳健或反应更快的解决方案。这种通用方法在导航领域已经非常成熟,并在导航2等流行项目中成功实施。MoveIt 的混合规划架构结合了一对全局规划器和局部规划器,它们以不同的规划速度和问题范围并行、并发运行。全局规划器的任务是解决全局运动规划问题,这与 “感知-规划-行动 ”应用中使用的规划器非常相似。所使用的规划器算法应该是完整的,因此假定其计算时间相对较慢。此外,全局规划器不要求实时安全,这意味着无法保证规划器在特定期限内找到解决方案。

机器人控制与仿真应用 2132

微信公众号 - 解决报错 “err_msg“:“system:access_denied“,微信环境浏览器真机使用微信支付、微信授权登录、分享朋友圈转发好友报错system:access_denied

微信公众号,微信网页,手机h5网页,微信报错,system:access_denied,微信支付,提示报错,微信登录授权报错,微信朋友圈分享,微信转发,WeixinJSBridge,微信环境下,微信内置浏览器,微信公众号项目报错system:access_denied,如何解决,invoke(),API调用后出现报错,微信内部H5 WeixinJSBridge.invoke system:access_denied,使用微信jssdk时报access_denied错误,还是报错,真机运行,真机调试api返回

🏆 前端领域优质创作者 1万+

Android中通过system调用Am命令执行动作

Android中通过system调用Am命令执行动作 在底层代码中看到这样一条语句: system("/system/bin/sh -c \"am broadcast -a android.intent.action.AT_AIRPLANE_MODE --ez state true\""); system 这是干什么的啊?? 经google原来system是系统调用

lovewlforever的专栏 4169

Claude Code 100个真实案例 - 用AI搭建GIS地理信息系统(地图标注+热力图)

本案例展示如何使用 Claude Code 从零搭建一个完整的 GIS 地理信息系统。我们将使用 Python + Flask 作为后端,Leaflet.js 作为前端地图引擎,实现地图标注、热力图展示、区域绘制、坐标搜索等功能。全程通过与 Claude Code 对话完成,让你感受 AI 在地理信息领域的强大开发能力。

yueyeguzhuo的专栏 113

python os模块system_Python如何使用OS模块调用cmd

在os模块中提供了两种调用 cmd 的方法,os.popen() 和 os.system()os.system(cmd) 是在执行command命令时需要打开一个终端,并且无法保存command命令的执行结果。os.popen(cmd,mode) 打开一个与command进程之间的管道。返回值是一个文件对象,可以读或者写(由mode决定,默认是'r')。如果mode为'r',可以使用此函数的返回值...

weixin_39929377的博客 346

深度学习工具包 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")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深入解析系统调用接口(System Call Interface, SCI)

系统调用(System Call)是应用程序访问操作系统内核功能的唯一方式。由于用户态程序运行在受限的环境中,它们不能直接访问硬件资源,例如磁盘、网络、内存管理等。因此,操作系统提供了一组系统调用,使应用程序能够请求内核执行这些操作。类别典型系统调用进程控制fork()execve()exit()wait()文件管理open()close()read()write()lseek()设备管理ioctl()read()write()信息维护getpid()getuid()setuid()内存管理。

Interview_TC的博客 1407

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android system开发测试命令

(1)  /system/bin命令执行区 (2)  /system/Xbin

Helloguoke的专栏 1421

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python 使用OS模块两种调用 cmd 的方法

在os模块中提供了两种调用 cmd 的方法,os.popen() 和 os.system() os.system(cmd) 是在执行command命令时需要打开一个终端,并且无法保存command命令的执行结果。 os.popen(cmd,mode) 打开一个与command进程之间的管道。返回值是一个文件对象,可以读或者写(由mode决定,默认是’r’)。如果mode为’r’,可以使用此函数的返回值调用read()来获取command命令的执行结果。 os.system() 定义: def syste

python学习者的博客 7168

在TI AM57xx/AM65x开发板上构建Android Automotive OS完整指南

Android Automotive OS(AAOS)是专为车载信息娱乐系统(IVI)设计的完整操作系统,与手机投屏方案有本质区别。其核心原理基于Android开源项目(AOSP)框架,通过硬件抽象层(HAL)实现与车辆硬件的标准化通信,技术价值在于为数字座舱提供了统一的应用生态和安全框架。在工程实践中,开发者需要在嵌入式平台(如TI的AM57xx/AM65x系列)上完成从环境搭建、设备树代码修改到系统构建的全流程,其中涉及交叉编译工具链、内核配置以及关键的车辆HAL服务集成。应用场景涵盖车载气候控制、车辆

weixin_34166847的博客 427

远程命令执行漏洞深度解析:从原理到实战利用与防御

远程命令执行是Web安全领域一个核心且高危的漏洞类型,其本质源于应用程序对用户输入边界的信任缺失,将不可信数据直接传递给系统命令执行函数。从技术原理上看,它涉及操作系统进程调用、Shell解析以及输入验证机制。其技术价值在于,一旦被利用,攻击者能直接获得服务器操作系统层面的控制权,危害性极高。常见的应用场景包括Web应用中的参数拼接、模板注入、反序列化以及第三方组件调用等环节。本文将以渗透测试的工程实践视角,深入剖析RCE漏洞的发现、利用链构造及权限维持方法,并探讨如何通过手工探测、Fuzz技巧以及反向Sh

weixin_30634661的博客 408

命令执行RCE漏洞

RCE命令执行漏洞

sjhfdffg的博客 708

python调用os_Python如何使用OS模块调用cmd

在os模块中提供了两种调用 cmd 的方法,os.popen() 和 os.system()os.system(cmd) 是在执行command命令时需要打开一个终端,并且无法保存command命令的执行结果。os.popen(cmd,mode) 打开一个与command进程之间的管道。返回值是一个文件对象,可以读或者写(由mode决定,默认是'r')。如果mode为'r',可以使用此函数的返回值...

weixin_39942397的博客 436
上一篇: Android平台根目录文件
下一篇: Android相关权限的概念
WythePlus
博客等级 码龄11年 397粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值