病毒专杀工具自己编

第6篇 熊猫烧香专杀工具编写 专杀工具编写 阅读详情

病毒专杀工具自己编

信息来源:neeao blog

如今病毒木马蠕虫层出不穷,变种也是一个接一个。反病毒公司以及各大安全公司随着影响很大的病毒的出现都会免费提供病毒专杀工具,这个举措对普通用户来说确实很有帮助。其实写病毒专杀工具也不像大家想象的那么神秘,利用SDK写个控制台程序来实现病毒专杀,因无须写图形界面,所以简便快捷!你自己也能写!不信?就接着看吧 废话不说了,接下来就开始谈谈病毒专杀工具的思路及实现方法。

此文中讲解的病毒专杀工具是针对木马、蠕虫等独立的程序而言的广义的病毒而言,而不是指那种自我复制感染PE文件的依附于其他程序的那种狭义的病毒。因为写那种病毒的专杀工具需要PE文件结构等知识,相对而言有点难度,所以我们就先从相对简单点的开始,难的以后再介绍。

对于大多数病毒而言,杀毒的思路其实很简单,那就是:终止病毒的进程、删除自启动项目(一般在注册表中的run*主键下)、删除病毒文件,对设置了文件关联的病毒而言还要修改注册表恢复文件关联。下面将分别陈述。

一.终止进程

以前网上曾有许多朋友问我怎么根据文件名终止指定进程,为什么使用函数TerminateProcess()不能直接终止指定进程。首先让我们来看看函数TerminateProcess()的声明吧:Bool TerminateProcess(HANDLE hPeocess,UINT uExitCode),其中第一个参数为进程句柄,而不是进程名称(文件名)。那怎样才能获得指定进程的句柄呢?我们可以使用函数OpenProcess(),其原型为

HANDLE OpenProcess(
DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 处理继承的标志
DWORD dwProcessId // 进程标识号,即进程ID
);

最后一个参数就是该进程的ID,进程句柄和进程ID是两回事,这时你可能很郁闷:怎么知道进程ID呢?方法当然有啦!在Windows9X/2000/XP/2003中,微软均提供了用来枚举进程的ToolHelp API系列函数。先运用函数CreateToolhelp32Snapshot()取得快照句柄,然后使用Process32First()以及Process32Next()枚举当前的进程。枚举过程中会将每一个进程的信息存放到PROCESSENTRY32结构中。PROCESSENTRY32的原型为:

typedef struct tagPROCESSENTRY32
{
DWORD dwSize; // 结构大小;
DWORD cntUsage; // 此进程的引用计数;
DWORD th32ProcessID; // 进程ID;
DWORD th32DefaultHeapID; // 进程默认堆ID;
DWORD th32ModuleID; // 进程模块ID;
DWORD cntThreads; // 此进程开启的线程计数;
DWORD th32ParentProcessID; // 父进程ID;
LONG pcPriClassBase; // 线程优先权;
DWORD dwFlags; // 保留;
char szExeFile[MAX_PATH]; // 进程全名;
} PROCESSENTRY32;
其中th32ProcessID就是进程的ID,szExeFile为该进程的文件名。所以要终止指定进程,我们可以枚举进程,逐一判断szExeFile是否和我们欲终止的进程名相同,如果相同就取其th32ProcessID参数,然后代入OpenProcess函数,取得目标进程的句柄。这样就可以利用函数TerminateProcess()终止该进程了。我写了个终止指定进程的函数,如下:

void KillProcessFromName(LPCTSTR name)//name为你要终止的进程的名称,Win9X则需包括路径
{
PROCESSENTRY32 pe;//定义一个PROCESSENTRY32结类型的变量
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);// 创建快照句柄
pe.dwSize=sizeof(PROCESSENTRY32);//一定要先为dwSize赋值
if (Process32First(hShot,&pe))
{
do
{if (strcmp(pe.szExeFile,name)==0) //判断此进程是否为你要终止的进程
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);//如果是就利用其ID获得句柄
TerminateProcess(hProcess,0);//终止该进程
}
while(Process32Next(hkz,&pe));
}
CloseHandle(hShot);//最后别忘记Close
}
在使用时只要在main()主函数里调用函数KillProcessFromName(),把参数设为你要终止的进程的名称即可,Win9X则需包括路径。还有一点值得注意一下,就是别忘了#include <TlHelp32.h>。

二、删除文件
这一步骤很简单,调用函数DeleteFile()即可,Bool DeleteFile(LPCTSTR lpFilename),把lpFilename设要指向删除的文件的文件名的指针即可,可包含具体路径。

三、修改注册表,删除启动项及文件关联

首先用函数RegOpenKeyEx()打开目标主键,RegOpenKeyEx()函数原型为
LONG RegOpenKeyEx(
HKEY hKey,// 将要打开的键的句柄
LPCTSTR lpSubKey,// 指向将要打开的包含子建的名称字符串指针
DWORD ulOptions,// 为保留字,必须为NULL
REGSAM samDesired,// 访问权限
PHKEY phkResult//指向打开键的句柄指针
);
获得句柄后用函数RegSetValueEx()进行修改键值,函数原型为:
LONG RegSetValueEx(
HKEY hKey, //当前打开的键的句柄
LPCTSTR lpValueName, //指向非空的包含要查询的值名称的字符串指针
DWORD Reserved, //保留值,必须为NULL
DWORD dwType,//键值类型,比如REG_SZ、REG_DWORD等
CONST BYTE * lpData , //指向键值数据的指针,注意此变量类型,不是LPCTSTR!
DWORD cbData//指向保存设定值长度变量的指针,以字节为单位
);
当然也可以用函数RegDeleteValue()来删除键值。操作完毕后别忘了用函数RegCloseKey()来Close。

使用这些函数很简单,只要把相应的参数换为你要删除或修改注册表的相应数值,唯一值得注意的是RegSetValueEx()函数中第5个参数的类型是BYTE而不是LPCTSTR!通过这些就可以很方便删除指定启动项以及恢复文件关联,为了便于大家理解,我举个修复EXE文件关联的例子,大家修改相应的参数就可以适用其它键值的修改,换用RegDeleteValue函数就可以实现删除自启动项。

HKEY hKey;
LPCTSTR data1="/"%1/" %*";//EXE文件默认的open方式,”%1/"表EXE文件本身
DWORD lResult=RegOpenKeyEx(HKEY_CLASSES_ROOT,"exefile//shell//open//command",0,KEY_WRITE,&hKey);
if(lResult==ERROR_SUCCESS)
RegSetValueEx(hKey,"",NULL,REG_SZ,(LPBYTE)data1,9);//修改键值
RegCloseKey(hKey);

到这里,一个病毒专杀工具的模型就已初步完成了,大家自己编写时只需把文中函数的形参换为你要杀的目标病毒的相应特征数据编译即可。这个是个简单的专杀工具,只能对付普通的木马、蠕虫等病毒,大家应具体情况具体分析,根据具体情况扩充该程序功能,比如有些木马是通过修改win.ini、system.ini来实现自动运行,我们就需操作文件删除相应数据,除此之外,有时还需添加终止服务、卸载DLL模块、进入RING0操作等功能。总之,我相信大家一定能自己写出病毒木马专杀工具的!呵呵,是不是很有成就感呢!

 

这是杀木马蠕虫的方法,给你一个杀文件型病毒的例子

N年前写的垃圾

#include <stdio.h>
#include <windows.h>

void usage(void);
int EnumDisk(void);
int EnumAllFile(char *lpDir);
int AniVirus(char *lpFileName);

int main(void)
{
     usage();
     printf("Start scan disk ..../n");
     EnumDisk();
     return 1;
}

int EnumDisk(void)
{
     int i;
     char AllDisk[3][3]={"c:","d:","e:"};
     for(i=0;i<3;i++)
     {
           EnumAllFile(AllDisk
);
     }
     return 1;
}

int EnumAllFile(char *lpDir)
{
     WIN32_FIND_DATA Finddata;
     HANDLE      hFindFile=INVALID_HANDLE_VALUE;
     
     char lpBuf[MAX_PATH],lpTmp[MAX_PATH];
     char lpFileName[MAX_PATH];
     int IntSize=0;
     ZeroMemory(lpBuf,MAX_PATH);
     ZeroMemory(lpTmp,MAX_PATH);
     ZeroMemory(lpFileName,MAX_PATH);
     strcpy(lpBuf,lpDir);
     strcat(lpBuf,"//*.*");
     hFindFile = FindFirstFile(lpBuf,&Finddata);
     if(hFindFile == INVALID_HANDLE_VALUE)
     {
           printf("FindFirstFile Error,Code:%d/n",GetLastError());
           return 0;
     }
     while(FindNextFile(hFindFile,&Finddata)!=0)
     {
           if(Finddata.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
           {
                 if(strncmp(Finddata.cFileName,"..",2)==0)
                 {
                       continue;
                 }
                 strcpy(lpTmp,lpDir);
                 strcat(lpTmp,"//");
                 strcat(lpTmp,Finddata.cFileName);
                 EnumAllFile(lpTmp);
           }
           IntSize = strlen(Finddata.cFileName);
           if(strcmp(Finddata.cFileName+IntSize-4,".exe")==0||strcmp(Finddata.cFileName+IntSize-4,".EXE")==0)
           {
                 printf("Find a Exe File FileName:%s/n",Finddata.cFileName);
                 strcpy(lpFileName,lpDir);
                 strcat(lpFileName,"//");
                 strcat(lpFileName,Finddata.cFileName);
                 AniVirus(lpFileName);
           }
     }
     return 1;
}

void usage(void)
{
     printf("Kill my virus,I don't like it/nready go!/n");
     return;
}

int AniVirus(char *lpFileName)
{
     HANDLE hFile = INVALID_HANDLE_VALUE;
     HANDLE hMap = NULL;
     LPVOID pFile = NULL;

     PIMAGE_DOS_HEADER            dosheader;
     PIMAGE_NT_HEADERS            peheader;
     PIMAGE_SECTION_HEADER      sectionheader;

     char *SectionName = NULL;

     DWORD *VirusEntry = NULL;
     BYTE      *btTmp = NULL;
     DWORD dwCount = 0;
     DWORD dwEntry = 0;
     int ECode;

     hFile = CreateFile(lpFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0);
     if(hFile==INVALID_HANDLE_VALUE)
     {
           printf("OpenFile Error,Code:%d/n",GetLastError());
           return 0;
     }
     
     hMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,NULL,NULL,NULL);
     if(hMap == NULL)
     {
           printf("CreateFileMapping Error,Code:%d/n",GetLastError());
           CloseHandle(hFile);
           return 0;
     }
     
     pFile = MapViewOfFile(hMap,FILE_MAP_READ|FILE_MAP_WRITE,NULL,NULL,NULL);
     if(pFile == NULL)
     {
           printf("MapViewOfFile Error,Code:%d/n",GetLastError());
           CloseHandle(hMap);
           CloseHandle(hFile);
           return 0;
     }
     dosheader = (PIMAGE_DOS_HEADER)pFile;
     __try
     {
           if(IMAGE_DOS_SIGNATURE != dosheader->e_magic)
           {
                 UnmapViewOfFile(pFile);
                 CloseHandle(hMap);
                 __leave;
           }
           peheader = PIMAGE_NT_HEADERS((DWORD)pFile+dosheader->e_lfanew);
           __try
           {
                 if(IMAGE_NT_SIGNATURE != peheader->Signature)
                 {
                       UnmapViewOfFile(pFile);
                       CloseHandle(hMap);
                       __leave;
                 }

                 sectionheader = (PIMAGE_SECTION_HEADER)((DWORD)peheader + ((peheader->FileHeader.NumberOfSections-1)*sizeof(IMAGE_SECTION_HEADER)) + sizeof(IMAGE_NT_HEADERS));
                 SectionName = (char *)&(sectionheader->Name);
                 if(strncmp(SectionName,".chi",4)!=0)
                 {
                       UnmapViewOfFile(pFile);
                       CloseHandle(hMap);
                       __leave;
                 }
                 printf("发现病毒,准备清除病毒/n");
                 VirusEntry = (DWORD *)((DWORD)pFile + sectionheader->PointerToRawData);
                 for(dwCount = 0;dwCount<sectionheader->SizeOfRawData/4;dwCount++,VirusEntry++)
                 {

                             if(*VirusEntry==0x00401375)
                             {
                                   //printf("找到源程序入口代码特征/n");
                                   VirusEntry = VirusEntry + 6;
                                   btTmp = (BYTE *)VirusEntry;
                                   btTmp++;
                                   VirusEntry = (DWORD *)btTmp;
                                   dwEntry = *VirusEntry - peheader->OptionalHeader.ImageBase;
                                   //printf("Entry:0x%x/n",dwEntry);
                                   peheader->OptionalHeader.AddressOfEntryPoint = dwEntry;

                                   peheader->FileHeader.NumberOfSections--;

                                   peheader->OptionalHeader.SizeOfImage = peheader->OptionalHeader.SizeOfImage - (sectionheader->Misc.VirtualSize/peheader->OptionalHeader.SectionAlignment+1) * peheader->OptionalHeader.SectionAlignment;
                                   ZeroMemory(sectionheader->Name,8);
                                   ECode = SetFilePointer(hFile,sectionheader->PointerToRawData,0,FILE_BEGIN);
                                   UnmapViewOfFile(pFile);
                                   CloseHandle(hMap);
                                   ECode = SetEndOfFile(hFile);
                                   if(ECode!=0)
                                   {
                                         printf("病毒清除成功/n");
                                   }
                                   else
                                   {
                                         printf("病毒清除失败,但是病毒已被屏蔽/n");
                                   }
                                   __leave;
                             }

                 }
           }
           __except(1)
           {
                 __leave;
           }
     }
     __finally
     {
           CloseHandle(hFile);
     }
     return 0;
}

全面防御ARP欺骗的病毒专杀工具开发 随着数字时代的到来,网络安全成为了一个不可忽视的话题。在众多网络安全威胁中,ARP病毒因其能够对局域网造成严重的破坏而备受关注。ARP病毒专杀工具应运而生,它作为网络安全管理的重要组成部分,能够有效预防和清除ARP病毒,保证网络环境的稳定和安全。在局域网环境下,ARP病毒利用ARP协议的漏洞,通过发送伪造的ARP响应包来篡改网络中的ARP缓存表。这导致了数据包被错误地路由,使得攻击者可以截取或篡改网络流量。实时防护机制的核心在于不断监测网络活动,及时识别并阻断异常的ARP响应。 阅读详情

相关推荐

Office宏病毒专杀工具与防御实战

病毒定义库是专杀工具检测能力的核心,必须保持实时更新,以应对新型宏病毒的变种与演化。

weixin_35826166的博客 3487

自制杀毒软件

我自制的易语言杀毒软件,用的是Clamav的引擎。 这里的云查杀好像有点问题,总是加载,进不去。 我这个标签默认的没有,又不满三级,只能写python了 下载地址:百度网盘 请输入提取码 提取码:1234 ...

a1140911的博客 1837

全面防护:感染性病毒专杀工具实战指南

感染性病毒是计算机安全领域内最常见的威胁之一,它们以自我复制和传播能力为特征,能够在未经授权的情况下感染计算机系统。病毒感染通常会导致系统性能下降,数据损坏,甚至系统崩溃。本章将深入探讨感染性病毒的基本定义,并分析其传播方式。计算机病毒是一种恶意程序代码,它能够自我复制,并通过感染其他程序和文件来传播。病毒通常会附加到宿主文件上,当宿主文件执行时,病毒代码就会激活,并进行自身的复制和传播行为。

weixin_35696112的博客 1192

为了王心凌,我拳打电脑管家,脚踢金山毒霸,3分钟用Python撸一个杀毒软件

事情要从一次重保行动说起,由于活动还没结束,这里就先不透漏了。我抱着亲手做的康师傅红烧牛肉泡面,还没开始吃,就听见后面有人喊我名字,说是有个用户的电脑卡死了,要我过去看看。 我问她能不能等我吃完这桶泡面再去,我已经3个小时没有吃过饭了,现在饿得没有力气走到用户那里。 她说那是主任的电脑,你自己看着办吧。 我向来不畏惧权贵,但九年义务教育告诉我,别人有困难的时候一定要去帮一把…… 我到现场一看,电脑上就只有一个空空的桌面,连个鼠标都找不到,看来是电脑太卡了,软件图标都卡没了。 我问用户之前有没有做过什么奇怪的

m0_59235699的博客 520

新版威金病毒专杀工具发布

威金病毒,亦称WannaCry,最初于2017年爆发,因其迅速传播和高破坏性引起全球关注。它通过利用Windows SMB漏洞传播,感染了全球数以十万计的计算机系统。深度扫描技术是一种先进的病毒检测方法,它通过多层次、多维度的检查机制来识别恶意软件。与传统的病毒扫描相比,深度扫描不仅仅依赖于病毒定义数据库,它还会分析文件的行为模式、运行时状态以及可疑的活动迹象。这项技术运用启发式算法和行为分析技术,模拟软件运行环境,执行文件并监测其行为,以此来检测那些能够逃避传统签名检测的高级持续性威胁(APT)。

weixin_33670640的博客 1161

自制杀毒软件C++源码

自制杀毒软件C++源码

[自制杀毒软件分析] PYAS杀毒软件查杀引擎分析

【代码】[自制杀毒软件分析] PYAS杀毒软件查杀引擎分析。

vShaShen_的博客 4871

做个简单的杀毒程序(超简单)

简单的杀毒程序,只需几十秒就可以完成!将代码复制到文本中,以bat格式打开,就可以完成清理!

【免杀技术】绕过名为 PYAS 的自制杀毒软件的几种方法

【代码】【免杀技术】绕过名为 PYAS 的自制杀毒软件的几种方法。

vShaShen_的博客 916

查病毒的一个小程序

查毒.bat 一个学来的小程序,赚赚积分哈。 

lpk蠕虫病毒专杀工具

lpk专杀 lpk/ups10 专杀 lpk*.dll

Office 宏病毒专杀工具 k4

Office 宏病毒专杀工具 k4 【下载地址】Office宏病毒专杀工具k4 Office宏病毒专杀工具k4是一款针对新型宏病毒的高效查杀工具,尤其适用于当前网络环境下日益猖獗的宏病毒威胁。该工具专注于Excel文档中的宏病毒,提供深度扫描与清除功能,特别针对k4宏病毒特征码进行精准查杀。用户可指定目录进行批量扫描,确...

gitblog_06735的博客 2089

自制的杀毒软件源程序-Antivirus

自制的杀毒软件源代码-Antivirus

蠕虫病毒专杀工具介绍:解决蠕虫病毒困扰,一键深度清理

蠕虫病毒专杀工具介绍:解决蠕虫病毒困扰,一键深度清理 【下载地址】蠕虫病毒专杀工具介绍 面对蠕虫病毒难以彻底清除的难题,传统方法往往费时费力。本开源项目提供了一款专为蠕虫病毒设计的深度清理工具,有效弥补了常规杀毒软件的不足。通过使用这款工具,您可以高效清除蠕虫病毒,避免重做系统的麻烦,节省大量时间与精力。无论是个人用户还...

gitblog_06792的博客 1892

matlab球面投影(二)

matlab球面投影,想做一个全景相机,不知道,要做成啥样,于是在MATLAB先仿真一下,看下是个啥样子 百度别人做的,复制下面的代码到MATLAB的命令串口下,,网上找了张全景图,可以是bmp,jpg,改程序就可以了 回车运行就可以看到结果。 复制下面代码时,下面的中文注释记得删除,MATLAB是会报错的, close all; clear all; clc [x,y,z]=sphere(50); A=imread('a.JPG'); //名字是自己命名的,记得改 B=warp(x,y,-z,

rjszcb的博客 3166

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4988

2019勒索病毒专杀工具合集,常见勒索病毒解密工具合集下载地址分享【持续更新】

从互联网上收集了一些勒索病毒的专杀工具和解密工具分享给大家,希望对中了勒索病毒朋友有帮助。 专杀工具:勒索病毒专杀工具合集下载地址 专杀工具包含: 1)卡巴斯基反病毒实用工具(含勒索解密以及病毒查杀) 2)FBI敲诈专杀工具 3)勒索软件专杀工具 解密工具:勒索病毒解密工具合集下载地址 解密工具包括: 1)Allcry解密工具 2)Aurora勒索病毒专用解密工具 3)Bcry...

tyu1853的博客 1万+

Mac微信聊天记录备份终极指南:用软链接轻松迁移到外接硬盘(附重签名教程)

本文详细介绍了如何通过软链接技术将Mac微信聊天记录备份迁移到外接硬盘,解决内置存储空间不足的问题。教程包括备份文件定位、软链接创建及微信重签名步骤,帮助用户高效管理微信数据,释放Mac存储空间。

uuu88的博客 1169

【免费下载】 蠕虫病毒专杀工具(亲测可用)

蠕虫病毒专杀工具(亲测可用) 【下载地址】蠕虫病毒专杀工具亲测可用 本仓库提供了一个专门用于清除蠕虫病毒的工具,经过亲测,该工具能够有效帮助用户从蠕虫病毒的侵扰中解脱出来。蠕虫病毒是一种可以自我复制的恶意代码,通过网络传播,无需人为干预即可感染其他计算机。一旦感染,蠕虫病毒会迅速扩散,控制越来越多的计算机,给用户带来极大...

gitblog_09814的博客 7255

基于PLC的图书馆机器人设计与仿真

本文设计了一种基于PLC的图书馆机器人系统,该系统能提升图书馆自动化管理水平,选用西门子S7-1200系列PLC作为核心控制单元,结合电机驱动、传感器采集以及超声波避障等技术,设计出机器人行走、图书识别与分拣的功能模块,系统借助条形码扫描模块获取图书信息,将其分析后与设定的存放位置做对比,精准达成图书的存取和归还。仿真结果显示,机器人执行任务时运动控制响应时间是0.35秒,避障成功率为98.3%,图书识别准确率高达99.4%,在控制系统方面,运用STEP7-MICRO/WIN软件编程,结合WINCC设计组态

weixin_44553616的博客 1926

perftest实战:从零到一,精准评估RDMA网络性能

想象一下,两台服务器传输数据就像在同一个主板上交换内存,这种零拷贝、低延迟的特性,正是高性能计算、分布式存储等场景梦寐以求的。对于云环境用户,主流云厂商现在都提供RDMA实例(比如AWS的EFA、阿里云的eRDMA)。但要注意,不同机型支持的RDMA协议版本可能不同,这会直接影响测试结果的上限值。记得记录每次测试的BW average值,绘制成曲线图后,你可能会发现类似"阶梯状"的性能变化,这通常与网卡的DMA引擎设计有关。在云环境中,由于虚拟化层的影响,延迟会比裸金属高20-30%。

weixin_28700411的博客 215

布朗特克(Bron.tok)病毒专杀工具

    这是我自己编写的布朗特克病毒专杀工具,绿色软件无需安装,(需要MS .Net Framework2.0支持)欢迎各位同胞下载试用。有任何建议或意见,请联系我 E-mail:pp34(at)163.com QQ:26927755编写此程序的缘由:一哥们使用U盘在我电脑上拷贝东西,之后感染了布朗特克病毒,在各大杀毒软件厂商网站都没有找到专杀工具,最后只得按照网上介绍的手工查杀病毒步骤进行查

awuzi的专栏 6677

基于YOLO26深度学习框架的人脸识别门禁系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的人脸识别门禁系统实现方法。系统采用YOLO26目标检测算法,通过CSPDarknet53主干网络、特征金字塔结构和注意力机制实现高效人脸检测。研究内容包括数据预处理、模型训练优化和身份验证等关键技术,使用迁移学习策略和CIoU损失函数提升检测精度。该系统可应用于智能安防场景,具有实时性强、识别准确的特点,为门禁管理提供了智能化解决方案。

一键难忘的博客 766
上一篇: 隐藏任意进程,目录/文件,注册表,端口
下一篇: 你会用sizeof吗?(vc篇)
goingup
博客等级 码龄22年 52粉丝 158原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值