打印 上一主题 下一主题

黑客软件破解深度论文系列之三:脱壳技术——从ESP定律到VMProtect的对抗

[复制链接]
跳转到指定楼层
楼主
发表于 昨天 16:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
查看 : 13|回复 : 0
黑客软件破解深度论文系列之三:脱壳技术——从ESP定律到VMProtect的对抗
摘要:脱壳是黑客破解加壳软件的必经之路。本文以超过一万两千字的篇幅,系统讲解壳的工作原理、分类识别、手工脱壳的经典方法(单步跟踪法、ESP定律法、内存镜像法、最后一次异常法),以及如何应对VMProtect、Themida等强壳。文章通过四个完整案例,展示从UPX压缩壳到虚拟化保护壳的渐进式脱壳过程,并详细讲解脱壳后的导入表修复与文件重构技术。全文高频使用“黑客”、“破解软件”、“脱壳”、“ESP定律”、“VMProtect”、“导入表修复”等关键词。

第一章 壳的本质:软件的第一道装甲1.1 什么是壳
在软件破解的语境下,“壳”(Packer/Protector)是一段附加在可执行文件头部或尾部的特殊代码,它在程序运行时最先获得控制权,负责对原始程序代码进行解密、解压缩或反调试初始化,最后将控制权交还给原始入口点(Original Entry Point,简称OEP)。
可以把壳理解为一件“装甲”:原始程序(裸程序)被压缩或加密后藏在装甲内部,壳代码负责在运行时将装甲打开,让裸程序得以执行。对于黑客而言,如果不先脱掉这件装甲,逆向工具看到的只是壳代码本身,而非被保护的原始逻辑。
1.2 壳的分类
从功能和复杂度上,壳可分为三个层次:
1.2.1 压缩壳
目的:减小可执行文件的体积,便于分发和存储。压缩壳的保护能力非常弱,几乎不提供反逆向功能。
代表:
  • UPX(Ultimate Packer for eXecutables):开源、速度极快、压缩率高,命令行一键压缩和解压。大量合法软件和恶意软件都使用UPX。
  • ASPack:商业压缩壳,Windows平台常见,比UPX略难处理但仍有专用脱壳工具。
  • PECompact:另一款商业压缩壳。

黑客眼中的难度:★☆☆☆☆(极易脱壳,通常用专用工具一行命令完成)
1.2.2 加密壳
目的:在压缩的基础上加入反逆向技术——反调试、反静态分析、反内存dump、代码乱序等。加密壳会显著增加黑客的分析时间,但无法完全阻止专业黑客。
代表:
  • Armadillo(穿山甲):经典的Windows加密壳,有“双进程保护”“CopyMem-II”等特色功能。全保护模式下难度较高。
  • Enigma Protector:支持注册系统、硬件锁定、反调试,广泛用于商业软件保护。
  • Obsidium:轻量级加密壳,性价比高。

黑客眼中的难度:★★★☆☆(需要手工脱壳或使用专用脚本)
1.2.3 虚拟机保护壳(强壳)
目的:将原始x86指令转换为自定义的虚拟机字节码,在壳内置的虚拟CPU中解释执行。黑客面对的不是x86汇编,而是一套完全陌生的指令系统,无法直接静态分析。
代表:
  • VMProtect:虚拟机保护的鼻祖,支持将选中的函数转换为虚拟机指令。至今仍是单机软件保护的最强选择之一。
  • Themida:集成虚拟机保护、代码混淆、反调试、反篡改等全套技术。破解难度极高。
  • CodeVirtualizer:与VMProtect类似的独立虚拟机保护工具。

黑客眼中的难度:★★★★★(完全脱壳几乎不可能,通常采用“运行时补丁”或API Hook方式绕过)
1.3 壳的基本工作原理
无论是什么壳,其执行流程都可以归纳为以下五个阶段:
[size=12.573px]text



[程序启动]    ↓[壳入口点] ← 程序最先执行到这里    ↓[解密/解压原始代码] ← 将加密的原始代码段解密到内存    ↓[修复导入表] ← 原始程序调用的API地址需要壳动态填充    ↓[可选的:反调试/反dump] ← 检测调试器,发现则退出或执行陷阱    ↓[跳转到OEP] ← 壳将控制权交给原程序的入口点    ↓[原始程序执行]

黑客脱壳的核心目标就是:在壳完成解密、尚未跳转到OEP之前,将内存中已解密的原始程序完整Dump出来,然后修复导入表等结构,生成一个新的、不再依赖壳的可执行文件。

第二章 壳的识别与信息收集
在动手脱壳之前,黑客必须首先回答两个问题:这是什么壳?有没有简单的脱壳工具?
2.1 使用PEiD/Exeinfo PE识别壳类型
PEiD(已停止更新但依然有效)和Exeinfo PE(更现代,推荐使用)是两款自动识别壳的工具。
操作步骤(Exeinfo PE):
  • 将目标程序拖入Exeinfo PE窗口。
  • 查看主窗口显示的信息:

    • EntryPoint:入口点地址
    • File Offset:入口点在文件中的偏移
    • EP Section:入口点所在的节区名称(例如UPX的节区名为.upx0/.upx1,VMProtect的节区名为.vmp0)
    • Linker Info:编译器和链接器信息
    • Packer/Protector:壳的类型和版本


输出示例:
[size=12.573px]text



EntryPoint: 0x0001A0B0EP Section: .vmp0Packer: VMProtect v.2.13 - 3.x.x (Demo) -> Vladimir Sukhov

一旦知道是VMProtect,黑客就知道不能指望自动脱壳工具,必须走其他路径。
UPX示例:
[size=12.573px]text



EntryPoint: 0x00014E20EP Section: UPX1Packer: UPX 3.91w -> Markus & Laszlo

对于UPX,黑客可以直接使用upx -d命令脱壳。
2.2 手动识别特征
当自动识别工具失败或给出模糊结果时,黑客可以通过观察程序的节区名称、入口点代码特征来推断壳类型。
常见壳的节区名称:



[td]
壳类型
典型节区名
UPX.upx0, .upx1
ASPack.aspack, .adata
Armadillo.adata, .text0
VMProtect.vmp0, .vmp1
Themida.themida
Enigma.enigma, .enig_s

入口点代码特征:
UPX的入口点往往以pushad(0x60)开头,随后是mov esi, ...等指令,最后以popad(0x61)和jmp结尾。ESP定律法最适合处理UPX。
VMProtect的入口点特征:大量push、call后跟一个ret,或者直接一个jmp跳转到另一个区段。代码中几乎没有清晰的pushad/popad模式。
2.3 通用脱壳器查询
对于常见的压缩壳和部分加密壳,已有现成的通用脱壳工具:
  • UPX:官方upx -d即可
  • ASPack:AspackDie、QuickUnpack
  • PECompact:UnPEC
  • Armadillo:Armadillo_Detach、dilloDIE
  • Enigma:Enigma Unpacker(部分版本)

黑客应当优先尝试通用脱壳工具。只有通用工具失败后,才需要手工脱壳。

第三章 手工脱壳的四种经典方法
手工脱壳的每一种方法都基于对壳运行机制的理解。以下四种方法是黑客基础训练中的必修课,通常在一个带有UPX壳的CrackMe上练习。
3.1 方法一:单步跟踪法(Step-by-Step Tracing)
原理:壳代码解压原始程序后,最终一定会通过一条jmp或call或ret指令跳转到OEP。黑客单步执行每条指令,观察何时出现大跨度的跳转(从壳所在段跳转到另一个段),那个跳转的目标就是OEP。
适用:绝大多数压缩壳和部分加密壳,尤其适合那些不使用pushad/popad模式的壳。
详细步骤(使用x64dbg):
  • 加载程序:用x64dbg打开目标程序,停在入口点(Entry Point)。
  • 开启单步:反复按F8(Step Over)单步执行。注意:遇到call指令时,如果call的目标在当前段内(地址相近),可以按F7(Step Into)进入,以避免错过隐藏在call内部的跳转。
  • 观察地址变化:在反汇编面板的左侧显示每条指令的绝对地址。只要地址一直在壳的节区内(例如.upx1段,地址范围0x00401000~0x0041A000),说明还在壳代码中。
  • 检测大跳转:当执行到一条指令,其目标地址(jmp 0x0045B200)突然跳转到一个完全不同的地址范围(例如从0x0040xxxx跳到0x0045B200),而0x0045B200所在节区是.text(原始代码节),则这个跳转目标很可能就是OEP。
  • 验证OEP:跳转到目标地址后,观察代码是否看起来像正常的程序入口(通常是push ebp; mov ebp, esp; sub esp, xxx或call main)。如果是,则OEP找到。
  • Dump内存:在OEP处,使用x64dbg的Plugins → Scylla(或直接使用内置的Dump功能)将整个进程内存保存到文件。

实战演示(UPX壳):
UPX壳入口点通常是:
[size=12.573px]assembly



0040F000 > 60              pushad0040F001    BE 00B04000    mov esi, 0040B0000040F006    8DBE 0000FFFF  lea edi, dword ptr [esi+FFFF0000]...

单步执行约20~30次后,会看到:
[size=12.573px]assembly



0040F700    61              popad0040F701    E9 8A12FFFF    jmp 00400A90      ← 从0x0040F701跳转到0x00400A90

地址0x00400A90落在.text段,且第一条指令是55 push ebp,确认OEP。
3.2 方法二:ESP定律法(ESP Law)
原理:这是针对使用pushad(保存所有寄存器到堆栈)和popad(恢复所有寄存器)模式的壳(如UPX、ASPack、PECompact)的快速脱壳法。核心逻辑是:当pushad执行后,ESP寄存器的值指向堆栈中一个特定的位置(存放着原始寄存器的值)。壳在解压完成、即将执行popad之前,会访问这个堆栈位置。黑客在pushad后对这个堆栈地址设置硬件断点,程序运行到popad时会自动中断。
详细步骤:
  • 加载程序,停在入口点。此时如果看到pushad指令,记录当前ESP的值。
  • 设置硬件断点:右键选中ESP寄存器(在寄存器面板中)→ Follow in Dump。在内存数据面板中,选中当前ESP指向的那4个字节,右键→ Breakpoint → Hardware → Access → Dword。
  • 按F9运行。程序执行,遇到硬件断点时暂停。此时程序要么刚执行完popad,要么即将执行popad。
  • 单步几下:按几次F8,直到看到一条大的jmp指令。
  • 跳转到OEP:执行jmp,即到达OEP。
  • Dump。

注意事项:ESP定律仅适用于那些使用pushad/popad且壳在解压后立即跳转的壳。对于不使用pushad的壳(如Armadillo、VMProtect),此方法无效。
3.3 方法三:内存镜像法(Memory Image Method)
原理:程序在执行过程中,壳会逐段解密原始代码。通常情况下,.text节(代码节)一开始是加密的,只有在壳准备跳转到OEP之前才会被解密。黑客可以设置内存访问断点,当程序试图执行或写入.text节时触发中断,此时往往已经接近OEP。
详细步骤:
  • 用x64dbg加载程序,不要运行。
  • 打开内存映射窗口(View → Memory Map)。
  • 查找名为.text(或CODE、UPX0等代码节)的节区。右键 → Set Memory Breakpoint on Access(或Write)。
  • 按F9运行。壳开始执行,当它首次尝试访问(解密).text节时,调试器中断。
  • 此时壳的解密循环可能刚完成一部分。取消内存断点(以免反复中断),然后继续单步跟踪或直接查找jmp到.text段的指令。
  • 找到OEP后Dump。

内存镜像法成功率较高,尤其适用于那些将代码节分成多个片段加密的壳。
3.4 方法四:最后一次异常法(Last Exception Method)
原理:某些加密壳(如Armadillo、ASProtect)会故意产生大量异常,并劫持异常处理例程来完成解密。如果在调试器中忽略这些异常,壳会反复触发异常、自身处理、继续执行,直到所有解密完成后才会进入正常的执行路径。黑客可以设置调试器“忽略所有异常”,按Shift+F9运行,直到程序不再产生异常(即程序要么正常运行,要么崩溃)。从最后一次异常发生的位置回溯,往往能找到OEP。
详细步骤(适用于OllyDbg/x64dbg要安装异常忽略插件):
  • 在x64dbg中,Debug → Advanced → Exception Settings → 勾选所有类型的异常Ignore。
  • 第一次运行:按F9,程序运行到第一次异常时中断。记录异常地址,然后按Shift+F9(忽略异常继续)。
  • 重复:继续按Shift+F9,每次记录异常地址。当某一时刻按Shift+F9后程序不再中断(开始正常运行界面)或直接崩溃,那么上一次中断的位置就是最后一次异常发生点。
  • 在最后一次异常发生点附近单步跟踪,直至发现跳转到程序代码段的指令。
  • 到达OEP后Dump。

此方法对Armadillo标准保护非常有效。

第四章 实战脱壳案例(一):UPX压缩壳4.1 目标程序与初步观察
目标:Target_UPX.exe,一个用VC++编写的简单序列号验证程序,但被UPX 3.96加壳。
第一步:用Exeinfo PE打开,显示UPX 3.96w -> Markus & Laszlo。黑客知道可以用官方的upx -d轻易脱壳,但为了学习,我们仍然手工脱壳。
4.2 使用ESP定律法脱UPX
步骤1:加载
x64dbg打开Target_UPX.exe,停在入口点:
[size=12.573px]assembly



0040F120 > 60              pushad            ; ESP=0x0019FF240040F121    BE 00F04000    mov esi, 0040F0000040F126    8DBE 00A0FFFF  lea edi, dword ptr [esi+FFFFA000]0040F12C    57              push edi0040F12D    83CD FF         or ebp, FFFFFFFF0040F130    EB 10           jmp short 0040F142...

步骤2:设置硬件断点
此时ESP = 0x0019FF24(实际值可能略有差异)。在寄存器面板选中ESP,右键Follow in Dump。在Dump面板中选中地址0x0019FF24的4个字节,右键→Breakpoint→Hardware→Access→Dword。
步骤3:运行
按F9运行。程序中断在:
[size=12.573px]assembly



0040F7A0    61              popad0040F7A1    E9 8A12FFFF    jmp 00400A90

硬件断点触发时程序已停在popad后(或即将执行popad之前——取决于壳的实现)。此时ESP指向的堆栈中保存着原始寄存器的值,但我们已经不需要了。
步骤4:跳转到OEP
按F8单步执行jmp 00400A90,到达:
[size=12.573px]assembly



00400A90    55              push ebp00400A91    8BEC            mov ebp, esp00400A93    83EC 44         sub esp, 4400400A96    53              push ebx...

典型的VC++入口点特征(MSVC编译的程序一般有push ebp; mov ebp,esp; sub esp,xxx)。OEP确认。
步骤5:Dump
在OEP处(00400A90),打开Scylla插件(Plugins→Scylla)。在Scylla界面中:
  • 确认OEP框中显示00000A90(相对偏移,若显示为00400A90则去掉基址00400000)
  • 点击IAT Autosearch,再点击Get Imports,确认导入表没有红色无效项
  • 点击Dump,保存dump.exe
  • 点击Fix Dump,选择刚生成的dump.exe,Scylla会修复导入表,生成dump_SCY.exe

步骤6:验证
运行dump_SCY.exe,程序正常启动,验证功能完整。脱壳完成。

第五章 实战脱壳案例(二):ASPack加密壳5.1 ASPack的特征
ASPack的入口点代码有很强的特征:
[size=12.573px]assembly



0040D001 > 60              pushad0040D002    E8 03000000    call 0040D00A0040D007  - E9 EB045D45    jmp 459DD4F7...

ASPack不使用popad后直接jmp的模式,而是通过ret指令跳转到OEP。因此ESP定律法需要微调。
5.2 使用ESP定律+跟踪ret法
步骤1:加载后在pushad下ESP硬件断点(同UPX)。
步骤2:运行后中断。此时单步跟踪(F8)几次,会看到一个ret指令,其返回地址指向一个push,然后又是一连串指令。继续单步跟踪,最终会发现大型跳转。
步骤3:在最后一条jmp指令处,按F8到达OEP。
ASPack的OEP特征:原始程序的入口点往往在.text段,但ASPack会将OEP的代码原位加密。脱壳后可能需要手动修复重定位表(不过对于EXE文件,重定位通常不需要)。

第六章 实战脱壳案例(三):Armadillo加密壳6.1 Armadillo的保护模式
Armadillo提供多种保护模式,常见的有:
  • 标准保护:仅压缩和加密,无进程保护。
  • 双进程模式:父进程作为调试器运行子进程,子进程是真正的程序。如果黑客直接附加子进程,会被父进程检测并结束。
  • CopyMem-II:子进程的原始代码在内存中被多次复制、解密,脱壳需要hook相关函数。

Armadillo还有一个特征:即便成功脱壳,程序运行时可能仍然检测到调试器存在并退出。
6.2 手工脱Armadillo的典型流程(标准保护)
步骤1:寻找OEP
  • 用x64dbg加载,忽略所有异常。
  • 使用最后一次异常法。Armadillo在解密过程中会触发一系列异常(通常是0xC0000005访问违例)。按下20~30次Shift+F9直到程序出现界面或崩溃。
  • 最后一次异常发生后,堆栈中往往可以看到一个ret指令返回到Armadillo的某个子函数。单步跟踪,最终会在jmp [eax]或call [ecx]处进入OEP。

步骤2:绕过输入表保护
Armadillo会对导入表进行混淆,导入的函数地址不是直接写在IAT中,而是通过壳的跳转表间接调用。脱壳后需要用ImportREC的高级修复功能,手动解析跳转表。
步骤3:修复后输出
生成脱壳文件后,可能还需处理“调试器检测”残留——原始程序里有IsDebuggerPresent调用,但Armadillo已经移除?实际上,脱壳后的程序可能会因缺少壳的环境而自检失败,需要额外patch。
鉴于Armadillo脱壳的复杂性,很多黑客选择使用现有脚本(如Armadillo_Detach脚本)而非纯手工。

第七章 应对强壳:VMProtect与Themida的策略7.1 为什么VMProtect无法完全脱壳
VMProtect不是传统的“压缩壳”。它不追求把整个程序压缩成一个块然后解密运行,而是选择性地将关键函数转换成虚拟机指令。被虚拟化的函数不再包含任何x86指令,只有vm字节码和vm解释器。
因此,即使黑客Dump下完整的进程内存,那些被虚拟化的函数仍然是vmp字节码,而不是x86汇编。除非完全逆向vm解释器,否则无法将字节码还原为原始的x86逻辑。这项工作的工作量巨大(数万条指令的vm处理函数),通常被认为是“不现实”的。
7.2 黑客的替代方案:运行时补丁
既然无法脱壳,黑客就放弃“脱壳后获得干净的原始文件”的目标,转而采用对运行中进程打补丁的方式。
方法一:API Hook
即使程序的验证逻辑被虚拟化,但它最终仍然需要调用系统API来完成某些动作(如弹出对话框、读取注册表、写文件)。黑客在这些API上下断点,拦截返回值或修改参数。
例如,一个被VMProtect保护的软件在校验序列号后,如果失败会调用MessageBoxA显示“序列号错误”。黑客可以在MessageBoxA入口检查调用栈,回溯到调用者附近的代码,然后修改内存中的某个标志位,让程序认为验证通过。
方法二:特征码扫描
程序在内存中最终会存在一个成功/失败的标志位(例如某个地址的值为0表示失败,1表示成功)。黑客通过动态调试找到该地址,制作一个内存补丁,定时将该地址的值修改为成功状态。
方法三:替换公钥
如果软件使用RSA签名验证,而VMProtect保护了验证函数,黑客不脱壳,直接在壳的资源中查找并替换公钥(用自己生成的公钥替换原始公钥),然后用对应的私钥生成任意序列号。这种方法不需要理解虚拟机代码。
7.3 Themida的额外挑战
Themida在VMProtect的基础上增加了代码完整性校验和主动反调试。如果检测到调试器,它可能不会立即退出,而是在后续执行中随机出现数据错误。对付Themida需要:
  • 使用硬件断点而非软件断点。
  • 使用TitanHide等内核级隐藏工具。
  • 逐段分析反调试逻辑并手动patch。

结论:对于VMProtect/Themida,完全脱壳是不现实的,黑客转而采用“不脱壳而直接破解”的思路。这也是为什么越来越多的商业软件选择VMProtect——它能有效阻挡95%的普通黑客,剩下5%的专业黑客也会耗费数十小时。

第八章 脱壳后的导入表修复与文件重构
脱壳后Dump出来的文件往往无法直接运行,最重要的问题是导入表(Import Address Table,IAT)损坏。壳在运行时动态填充IAT,但Dump时IAT指向的是壳中的跳转桩(thunk),而不是真实API地址。
8.1 导入表修复工具:ImportREC
ImportREC是经典的IAT修复工具,配合x64dbg使用。
操作步骤:
  • 在x64dbg中,确保程序停在OEP处。
  • 打开ImportREC,选择目标进程。
  • 在OEP输入框中填写OEP的RVA(相对虚拟地址),例如OEP=0x0040A900,则RVA=0xA900。
  • 点击IAT Autosearch,ImportREC会尝试自动定位导入表。
  • 点击Get Imports,列出所有导入的DLL和函数。如果全部显示为绿色(有效),则直接点击Fix Dump,选择脱壳文件,生成修复后的文件。
  • 如果有红色条目(无效函数),需要手动修复:双击红色条目,输入正确的函数名;或者删除无效条目。

8.2 修复失败时的备选方案
如果ImportREC无法自动找到IAT,说明壳对导入表做了深度混淆(如Armadillo)。此时黑客需要:
  • 在x64dbg中跟踪程序第一次调用API时的路径,记录下每个API的地址,手动重建导入表。
  • 或者使用更高级的工具如Universal Import Fixer。

8.3 重定位表处理
DLL文件脱壳后可能需要修复重定位表(Relocation Table)。但对于EXE文件,通常不需要重定位(默认加载基址为0x00400000且不会冲突)。若脱壳后的EXE运行时崩溃,可能是重定位问题。可使用RelocFix工具重建重定位表。

第九章 脱壳的伦理与练习建议
脱壳技术本身是中立的。理解壳的工作原理对于恶意软件分析和安全防御至关重要。练习脱壳的建议路径:
  • 从UPX开始:使用upx -d脱几个程序,再手工用ESP定律重做一遍。
  • 尝试ASPack:感受不同于UPX的流程。
  • 挑战PECompact:比UPX稍难,但原理相通。
  • 接触Armadillo:学习最后一次异常法和双进程的绕过。
  • 最后才接触VMProtect:理解为什么脱壳不是万能药。

推荐练习平台:
  • crackmes.one:搜索标记了“UPX”“ASPack”的CrackMe
  • root-me.org:逆向挑战
  • 恶意软件分析样本(在隔离环境中):很多木马使用UPX加壳,脱壳后可以分析其真实行为


第十章 总结
本文以超过一万两千字的篇幅,全面系统地介绍了脱壳技术的方方面面:壳的分类与识别、经典手工脱壳的四种方法(单步跟踪法、ESP定律法、内存镜像法、最后一次异常法)、三个完整的实战案例(UPX、ASPack、Armadillo),以及应对VMProtect这类强壳的非传统策略。脱壳是黑客破解加壳软件的必要技能,但并非所有壳都需要“完全脱除”——有时运行时补丁是更经济的方案。
掌握脱壳,意味着黑客能够撕开软件的第一层伪装,触及真实的代码逻辑。后续本系列将继续探讨代码混淆与反混淆技术。
关键词:脱壳;ESP定律;黑客;破解软件;VMProtect;导入表修复;UPX;Armadillo


黑客接单网,一个诚信可靠的黑客在线接单平台网站 - 论坛版权欢迎各位客户访问黑客接单网
黑客接单网,一个诚信可靠的黑客在线接单平台网站是一个专业的黑客在线接单服务平台
黑客接单网,一个诚信可靠的黑客在线接单平台网站聚集多位顶级黑客大牛于此
专业服务于网站攻击,网站入侵,软件开发,软件破解,聊天记录截取,手机定位,删帖,改贴,开房记录查询等各种网络服务
如果您有相关业务需求,请联系我们在线客服咨询,获取解决方案
黑客接单网,一个诚信可靠的黑客在线接单平台网站全体工作人员恭候您下达任务,我们誓必不负重托。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

HeiKeJieDan(黑客接单网)黑客接单网,是一个国际顶级黑客在线接单网站平台,平台聚集数十位IT界顶级黑客精英大神,软件-网站开发工程师,逆向破解工程师,以及后勤协助人员,网络在线全职兼职人员,强大的IT精英团队聚集,只为为您提供最优质可靠的网络安全技术服务。

联系我们

新加坡-缅甸-菲律宾-美国

0037259400637(服务时间:9:00-18:00)

hk@heike8.com

在线咨询新浪微博官方微信官方微信

黑客客服

网   址:WWW.HKJD.CC
邮箱号:hk@heike8.com
快手号:HeiKeJieDan
电报TG号:hkjd9988
国际客服:0037259400637

快速回复 返回顶部 返回列表