首页
论坛
专栏
课程

[原创]VT入门---- 闭门造VT [有码]

2011-12-24 18:36 55083

[原创]VT入门---- 闭门造VT [有码]

2011-12-24 18:36
55083
前言

传说中的VT貌似很神秘的样子,关于VT入门的资料又很少,于是研究了一番
由于资源有限,自身水平亦有限,并且是闭门造车之作,如有错误的地方请指正,不胜感激!
关于VT可以先参考海风月影写的关于VT调试器http://bbs.pediy.com/showthread.php?t=96122

运行环境
操作系统: windows XP
CPU : intel i3-390M
状态: 单核运行

驱动没有卸载部分,测试前请先保存好文档. boot.ini 文件中添加 /numproc=1,重启
VT简介

Intel VIrtual Techonlogy , intel 硬件虚拟化技术 ,在硬件级别上完成计算机的虚拟化

为实现硬件虚拟化 ,VT增加了 12新的 VMX指令

[VMCS控制 5 ]
VMPTRLD
VMPTRST
VMCLEAR
VMREAD
VMWRITE

[VMX命令 5]
VMLAUNCH
VMCALL
VMXON
VMXOFF
VMRESUME

[Guest software 2]
INVEPT
INVVPID

12条指令对应的机器码(xen-3.4.1\xen\include\asm-x86\hvm\vmx\vmx.h)
代码中使用 _emit

#define VMCALL_OPCODE ".byte 0x0f,0x01,0xc1\n"
#define VMCLEAR_OPCODE ".byte 0x66,0x0f,0xc7\n" /* reg/opcode: /6 */
#define VMLAUNCH_OPCODE ".byte 0x0f,0x01,0xc2\n"
#define VMPTRLD_OPCODE ".byte 0x0f,0xc7\n" /* reg/opcode: /6 */
#define VMPTRST_OPCODE ".byte 0x0f,0xc7\n" /* reg/opcode: /7 */
#define VMREAD_OPCODE ".byte 0x0f,0x78\n"
#define VMRESUME_OPCODE ".byte 0x0f,0x01,0xc3\n"
#define VMWRITE_OPCODE ".byte 0x0f,0x79\n"
#define INVEPT_OPCODE ".byte 0x66,0x0f,0x38,0x80\n" /* m128,r64/32 */
#define INVVPID_OPCODE ".byte 0x66,0x0f,0x38,0x81\n" /* m128,r64/32 */
#define VMXOFF_OPCODE ".byte 0x0f,0x01,0xc4\n"
#define VMXON_OPCODE ".byte 0xf3,0x0f,0xc7\n"

驱动初在始化一个VMCS (Virtual Machine Control Structures)内存区域后,启动VMM (Virtual Machine Monitor) ,
得到最高权限从而管理硬件资源, 操作系统是运行于ring0
VMM要监控管理整个系统的资源,因而VMM的权限是大于操作系统,它处于一个全新的级别ring -1
用一个形象的比喻来讲就是:当前操作系统的的“政权”被VMM颠覆了
下面这个图是: VMM Guest OS 的联系



下面简单介绍一下VMM的建立过程,看看“政权”是如何被颠覆的
首先通过CPUID检查CPU是否支持VT

硬件环境的检测,通过指令CPUID检测CPU是否支持VT
ECX的第5bit标志代表对 VT 的支持与否
(更多检测可以看
http://bbs.pediy.com/showthread.php?t=96122
回贴部分)
初始化主要的内存区域
使用VMXON 进入 VMX (虚拟机指令扩展指令集)操作

执行VMXON指令 , EFLAGS.CF 可判断执行是否成功
__asm
{
PUSH 0
PUSH PhysicalVMXONRegionPtr.LowPart

_emit 0xF3 // VMXON [ESP]
_emit 0x0F
_emit 0xC7
_emit 0x34
_emit 0x24

PUSHFD
POP eFlags

ADD ESP, 8
}

接下来开始初始化VMCS区域,(相当于部署军队,准备起义)
这个结构只能够被VMCLEAR, VMPTRLD, VMREAD,VMWRITE操作。
VMM运行后guest 执行这些指令时会引发#VMExit事件

VMCS 结构如下图


VMCS 是一个4K的内存区域
在逻辑上,虚拟机控制结构被划分为 6 部分:
1) GUEST-STATE 域:虚拟机从根操作模式进入非根操作模式时,处理器所处的状态;
2) HOST-STATE 域:虚拟机从非根操作模式退出到根操作模式时,处理器所处的状态;
3) VM 执行控制域:虚拟机在非根操作模式运行的时候,控制处理器非根操作模式退出到根操作模式;
4) VM 退出控制域:虚拟机从非根操作模式下退出时,需要保存的信息;
5) VM 进入控制域:虚拟机从根操作模式进入非根操作模式时,需要读取的信息;
6) VM 退出信息域:虚拟机从非根操作模式退出到根操作模式时,将退出的原因保存到该域中。

在这里初始化的代码比较多,要初始化 host guest CR0CR3CR4IDTRGDTRLDTRRflagSYSENTER_CSSYSENTER_EIPSYSENTER_ESP
初始化时使用VMWRITE 指令设置 , 设置时主要的宏是
GUEST_ES_SELECTOR = 0x00000800,
GUEST_CS_SELECTOR = 0x00000802,
GUEST_SS_SELECTOR = 0x00000804,
GUEST_DS_SELECTOR = 0x00000806,
GUEST_FS_SELECTOR = 0x00000808,
GUEST_GS_SELECTOR = 0x0000080a,
GUEST_LDTR_SELECTOR = 0x0000080c,
GUEST_TR_SELECTOR = 0x0000080e,
HOST_ES_SELECTOR = 0x00000c00,
HOST_CS_SELECTOR = 0x00000c02,
HOST_SS_SELECTOR = 0x00000c04,
HOST_DS_SELECTOR = 0x00000c06,
HOST_FS_SELECTOR = 0x00000c08,
HOST_GS_SELECTOR = 0x00000c0a,
HOST_TR_SELECTOR = 0x00000c0c,

使用 VMWRITE 指令集成的函数
VOID WriteVMCS( ULONG encoding, ULONG value )
{
__asm
{
PUSHAD
PUSH value
MOV EAX, encoding

_emit 0x0F
_emit 0x79
_emit 0x04
_emit 0x24

POP EAX
POPAD
}
}
例如初始化 GDT , IDT 使用的是以下代码
__asm
{
SGDT gdt_reg
}
temp32 = 0;
temp32 = gdt_reg.BaseHi;
temp32 <<= 16;
temp32 |= gdt_reg.BaseLo;
Log( "Setting Host GDTR Base" , temp32 );
WriteVMCS( HOST_GDTR_BASE, temp32 );

__asm
{
SIDT idt_reg
}
temp32 = 0;
temp32 = idt_reg.BaseHi;
temp32 <<= 16;
temp32 |= idt_reg.BaseLo;

Log( "Setting Host IDTR Base" , temp32 );
WriteVMCS( HOST_IDTR_BASE, temp32 );

比较重要的是设置 #VMExit 事件处理入口 HOST_RIP
WriteVMCS( HOST_RIP, (ULONG)VMMEntryPoint ); //0x6C16

最后执行 VMLAUNCH 指令 ,正式启动虚拟机(建立了新的政权)
__asm
{
_emit 0x0F
_emit 0x01
_emit 0xC2
}
至此,整个VMM的帝国已经运行起来,帝国将会管理整个系统资源
接下来的就是#VMExit的事件循环处理(类似在调试器中下断点后,等待事件发生)
运行过程中Guest OS 遇到要监控的指令,会发生 #VMExit 事件 (相当于被调试程序执行到中断事件)
此时由VMM 处理,例如cpuid ,
处理完后由 VMRESUME 继续执行 (相当于在 OD F9 继续运行)

#VMExit事件的类型

#VMExit事件分为二种
1 无条件事件CPUID GETSEC INVD XSETBV 所有 VMX指令
2 有条件事件I/O访问,中断事件, MSR寄存器访问, HTL (要设置VMCS相应部分触发)

VMM使用VMREAD读取虚拟机状态,主要的一些变量有
VM_EXIT_REASON = 0x00004402, //退出代码
VM_EXIT_INTR_INFO = 0x00004404, //中断信息
VM_EXIT_INTR_ERROR_CODE = 0x00004406,
IDT_VECTORING_INFO = 0x00004408,
IDT_VECTORING_ERROR_CODE = 0x0000440a,
VM_EXIT_INSTRUCTION_LEN = 0x0000440c, //指令长度
VMX_INSTRUCTION_INFO = 0x0000440e,
GUEST_ES_LIMIT = 0x00004800,
GUEST_CS_LIMIT = 0x00004802,
GUEST_SS_LIMIT = 0x00004804,
GUEST_DS_LIMIT = 0x00004806,

其中最重要的就是VM_EXIT_REASON , 可以看作是消息类型
主要的类型有
#define EXIT_REASON_EXCEPTION_NMI 0
#define EXIT_REASON_EXTERNAL_INTERRUPT 1
#define EXIT_REASON_TRIPLE_FAULT 2
#define EXIT_REASON_INIT 3
#define EXIT_REASON_SIPI 4
#define EXIT_REASON_IO_SMI 5
#define EXIT_REASON_OTHER_SMI 6
#define EXIT_REASON_PENDING_VIRT_INTR 7
#define EXIT_REASON_PENDING_VIRT_NMI 8
#define EXIT_REASON_TASK_SWITCH 9
#define EXIT_REASON_CPUID 10
#define EXIT_REASON_HLT 12
#define EXIT_REASON_INVD 13
#define EXIT_REASON_INVLPG 14
#define EXIT_REASON_RDPMC 15
#define EXIT_REASON_RDTSC 16
#define EXIT_REASON_RSM 17
#define EXIT_REASON_VMCALL 18
#define EXIT_REASON_VMCLEAR 19
#define EXIT_REASON_VMLAUNCH 20
#define EXIT_REASON_VMPTRLD 21
#define EXIT_REASON_VMPTRST 22
#define EXIT_REASON_VMREAD 23
#define EXIT_REASON_VMRESUME 24
#define EXIT_REASON_VMWRITE 25
#define EXIT_REASON_VMXOFF 26
#define EXIT_REASON_VMXON 27


DWORD VmxRead(DWORD in_code)
{
DWORD m_vmread = 0;
__asm
{
PUSHAD

MOV EAX, in_code
_emit 0x0F // VMREAD EBX, EAX
_emit 0x78
_emit 0xC3

MOV m_vmread, EBX
POPAD
}
return m_vmread;
}

VOID VMMReadGuestState( )
{
HandlerLogging = 0;
ExitReason = VmxRead(VM_EXIT_REASON); //0x4402
ExitInterruptionInformation = VmxRead( VM_EXIT_INTR_INFO); //0x4404
ExitInstructionLength = VmxRead(VM_EXIT_INSTRUCTION_LEN); //0x440c
ExitQualification = VmxRead(EXIT_QUALIFICATION) ; //0x6400
ExitInterruptionInformation = VmxRead(VM_EXIT_INTR_INFO); //0x4404
ExitInterruptionErrorCode = VmxRead(VM_EXIT_INTR_ERROR_CODE); //0x4406

IDTVectoringInformationField = VmxRead(IDT_VECTORING_INFO); //0X00004408 // IDT-Vectoring Information Field
IDTVectoringErrorCode = VmxRead(IDT_VECTORING_ERROR_CODE); //0X0000440A // IDT-Vectoring Error Code
ExitInstructionLength = VmxRead(VM_EXIT_INSTRUCTION_LEN); //0x0000440C // VM-Exit Instruction Length
ExitInstructionInformation = VmxRead(VMX_INSTRUCTION_INFO) ; //0x0000440E //VM-Exit Instruction Information
GuestEIP = VmxRead(GUEST_RIP); //0x0000681E; //GuestEIP
GuestESP = VmxRead(GUEST_RSP); //0x0000681c //esp
GuestCR3 = VmxRead(GUEST_CR3); //0X6802 GuestCR3

}

CPUID指令的拦截与修改

guest OS 执行 cupid ,会得到这样一个错误号 10 (VMX_EXIT_CPUID )
当执行到CPUID这条指令的时候,响应,然后就可以修改cpuid的返回值

if( ExitReason == VMX_EXIT_CPUID )
{
if( GuestEAX == 0 )
{
DbgPrint("CPUID EIP == %08X \n" , GuestEIP );
//0x34EC2B
__asm
{
POPAD
MOV EAX, 0
CPUID

//修改CPUID返回值
MOV EBX, 0x80808080
MOV ECX, 0x90909090
MOV EDX, 0x10101010
JMP Resume
}
}
else
{
__asm
{
POPAD
MOV EAX, GuestEAX
CPUID
JMP Resume
}
}
}

最后运行的效果

运行VT cupid


运行VT cpuid



顺道打印了执行CPUID程序的 EIP,与输出的 00401009一致
00401003 |. 53 push ebx
00401004 |? B8 00000000 mov eax,0
00401009 |. 0FA2 cpuid
0040100B |. 894424 0C mov dword ptr ss:[esp+C],eax
0040100F |? 894C24 08 mov dword ptr ss:[esp+8],ecx
00401013 |? 895C24 04 mov dword ptr ss:[esp+4],ebx
00401017 |? 68 10614000 push cpuid.00406110 ; ASCII "---------cpuid------",LF

[招聘]欢迎市场人员加入看雪学院团队!

上传的附件:
最新回复 (48)
网监张局 1 2011-12-24 18:39
2
0
EXIT_REASON 的所有类型注释

VirtualBox\src\VBox\VMM\VMMR3\HWACCM.cpp

EXIT_REASON(VMX_EXIT_EXCEPTION          ,  0, "Exception or non-maskable interrupt (NMI)."),
    EXIT_REASON(VMX_EXIT_EXTERNAL_IRQ       ,  1, "External interrupt."),
    EXIT_REASON(VMX_EXIT_TRIPLE_FAULT       ,  2, "Triple fault."),
    EXIT_REASON(VMX_EXIT_INIT_SIGNAL        ,  3, "INIT signal."),
    EXIT_REASON(VMX_EXIT_SIPI               ,  4, "Start-up IPI (SIPI)."),
    EXIT_REASON(VMX_EXIT_IO_SMI_IRQ         ,  5, "I/O system-management interrupt (SMI)."),
    EXIT_REASON(VMX_EXIT_SMI_IRQ            ,  6, "Other SMI."),
    EXIT_REASON(VMX_EXIT_IRQ_WINDOW         ,  7, "Interrupt window."),
    EXIT_REASON_NIL(),
    EXIT_REASON(VMX_EXIT_TASK_SWITCH        ,  9, "Task switch."),
    EXIT_REASON(VMX_EXIT_CPUID              , 10, "Guest software attempted to execute CPUID."),
    EXIT_REASON_NIL(),
    EXIT_REASON(VMX_EXIT_HLT                , 12, "Guest software attempted to execute HLT."),
    EXIT_REASON(VMX_EXIT_INVD               , 13, "Guest software attempted to execute INVD."),
    EXIT_REASON(VMX_EXIT_INVPG              , 14, "Guest software attempted to execute INVPG."),
    EXIT_REASON(VMX_EXIT_RDPMC              , 15, "Guest software attempted to execute RDPMC."),
    EXIT_REASON(VMX_EXIT_RDTSC              , 16, "Guest software attempted to execute RDTSC."),
    EXIT_REASON(VMX_EXIT_RSM                , 17, "Guest software attempted to execute RSM in SMM."),
    EXIT_REASON(VMX_EXIT_VMCALL             , 18, "Guest software executed VMCALL."),
    EXIT_REASON(VMX_EXIT_VMCLEAR            , 19, "Guest software executed VMCLEAR."),
    EXIT_REASON(VMX_EXIT_VMLAUNCH           , 20, "Guest software executed VMLAUNCH."),
    EXIT_REASON(VMX_EXIT_VMPTRLD            , 21, "Guest software executed VMPTRLD."),
    EXIT_REASON(VMX_EXIT_VMPTRST            , 22, "Guest software executed VMPTRST."),
    EXIT_REASON(VMX_EXIT_VMREAD             , 23, "Guest software executed VMREAD."),
    EXIT_REASON(VMX_EXIT_VMRESUME           , 24, "Guest software executed VMRESUME."),
    EXIT_REASON(VMX_EXIT_VMWRITE            , 25, "Guest software executed VMWRITE."),
    EXIT_REASON(VMX_EXIT_VMXOFF             , 26, "Guest software executed VMXOFF."),
    EXIT_REASON(VMX_EXIT_VMXON              , 27, "Guest software executed VMXON."),
    EXIT_REASON(VMX_EXIT_CRX_MOVE           , 28, "Control-register accesses."),
    EXIT_REASON(VMX_EXIT_DRX_MOVE           , 29, "Debug-register accesses."),
    EXIT_REASON(VMX_EXIT_PORT_IO            , 30, "I/O instruction."),
    EXIT_REASON(VMX_EXIT_RDMSR              , 31, "RDMSR. Guest software attempted to execute RDMSR."),
    EXIT_REASON(VMX_EXIT_WRMSR              , 32, "WRMSR. Guest software attempted to execute WRMSR."),
    EXIT_REASON(VMX_EXIT_ERR_INVALID_GUEST_STATE,  33, "VM-entry failure due to invalid guest state."),
    EXIT_REASON(VMX_EXIT_ERR_MSR_LOAD       , 34, "VM-entry failure due to MSR loading."),
    EXIT_REASON_NIL(),
    EXIT_REASON(VMX_EXIT_MWAIT              , 36, "Guest software executed MWAIT."),
    EXIT_REASON_NIL(),
    EXIT_REASON_NIL(),
    EXIT_REASON(VMX_EXIT_MONITOR            , 39, "Guest software attempted to execute MONITOR."),
    EXIT_REASON(VMX_EXIT_PAUSE              , 40, "Guest software attempted to execute PAUSE."),
    EXIT_REASON(VMX_EXIT_ERR_MACHINE_CHECK  , 41, "VM-entry failure due to machine-check."),
    EXIT_REASON_NIL(),
    EXIT_REASON(VMX_EXIT_TPR                , 43, "TPR below threshold. Guest software executed MOV to CR8."),
    EXIT_REASON(VMX_EXIT_APIC_ACCESS        , 44, "APIC access. Guest software attempted to access memory at a physical address on the APIC-access page."),
    EXIT_REASON_NIL(),
    EXIT_REASON(VMX_EXIT_XDTR_ACCESS        , 46, "Access to GDTR or IDTR. Guest software attempted to execute LGDT, LIDT, SGDT, or SIDT."),
    EXIT_REASON(VMX_EXIT_TR_ACCESS          , 47, "Access to LDTR or TR. Guest software attempted to execute LLDT, LTR, SLDT, or STR."),
    EXIT_REASON(VMX_EXIT_EPT_VIOLATION      , 48, "EPT violation. An attempt to access memory with a guest-physical address was disallowed by the configuration of the EPT paging structures."),
    EXIT_REASON(VMX_EXIT_EPT_MISCONFIG      , 49, "EPT misconfiguration. An attempt to access memory with a guest-physical address encountered a misconfigured EPT paging-structure entry."),
    EXIT_REASON(VMX_EXIT_INVEPT             , 50, "INVEPT. Guest software attempted to execute INVEPT."),
    EXIT_REASON_NIL(),
    EXIT_REASON(VMX_EXIT_PREEMPTION_TIMER   , 52, "VMX-preemption timer expired. The preemption timer counted down to zero."),
    EXIT_REASON(VMX_EXIT_INVVPID            , 53, "INVVPID. Guest software attempted to execute INVVPID."),
    EXIT_REASON(VMX_EXIT_WBINVD             , 54, "WBINVD. Guest software attempted to execute WBINVD."),
    EXIT_REASON(VMX_EXIT_XSETBV             , 55, "XSETBV. Guest software attempted to execute XSETBV."),
    EXIT_REASON_NIL()
pDriObj 2011-12-24 19:00
3
0
这个必须得顶!!!
雪yaojun 2011-12-24 19:04
4
0
这是神马????
Fido 2011-12-24 19:08
5
0
强帖留名啊...我的天啊..膜拜啊...
xiejienet 2011-12-24 19:12
6
0
虽然看不懂,但是觉得好牛逼
雪yaojun 2011-12-24 20:11
7
0
cpuid是拦截个什么过程呀??楼主可不可以详细说明一下。
要是代码加个缩进就好了。
panti 2011-12-25 04:28
8
0
是好东西,不知道怎么看
后面的可以拦截CPU指令是什么意思?在虚拟机中拦截?
网监张局 1 2011-12-25 17:23
9
0
后面是VMM已经启动, VMM 监控操作系统的运行
而CPUID这个指令是会主动触发#VMExit的,不用配置VMCS

1 无条件事件CPUID GETSEC INVD XSETBV 所有 VMX指令

如果事件ID == VMX_EXIT_CPUID 就代表执行的是 CPUID
游戏神通 2011-12-25 19:30
10
0
不错 顶    .
nevergone 3 2011-12-25 22:48
11
0
学习。谢谢分享
wowocock 1 2011-12-26 14:13
12
0
虽然已经很老了,但还是不错。
wowocock 1 2011-12-26 14:16
13
0
参考很久以前 ROOTKIT.COM上的例子,在VMEXIT里处理,修改GUEST各寄存器的返回值,来达到修改CPUID结果的效果。
dkxzl 1 2011-12-26 16:25
14
0
VMM不是只能接管虚拟机环境中执行的指令而引发的#VMExit,你那个CPUID好象直接就是在R3真实机下的一个程序,这难道也能被VMM接管?
vvking 2011-12-26 16:53
15
0
虽然看不懂,但是还想要留个名儿~~
网监张局 1 2011-12-26 17:59
16
0
VT就是对硬件的一个虚拟化 , VMM 就是管理这个抽象的硬件平台,其权限是大于真机系统的,
所以真机执行的一些指令是要经过VMM的处理的,
除cpuid指令外还有很多,比如
LGDT, LIDT, SGDT,  SIDT ,LLDT, LTR, SLDT,  STR

另外还可以轻松接管 int 1  , int 3  , 所以昆山滴水VT可以实现那样强大的调试功能,
dkxzl 1 2011-12-26 18:41
17
0
以前只知道由 VMX root进入到VMX non-root之后,VMX non-root的虚拟环境才会被VMM给监视,VMX non-root会根据VM-execution control的信息会判断那些指令的执行该产生#VMEXIT,还真不知道VMM能直接监控真实机的指令执行
网监张局 1 2011-12-26 19:04
18
0
cpuid 是无条件触发,跟VMX指令一样,不用设置VM-execution control
所以实验起来比较简单
dkxzl 1 2011-12-26 20:10
19
0
看样子是我错误理解LZ的意思了,LZ也错误理解我的意思了,我之前以为LZ说的是VMM能监控到非VMX non-root模式下指令执行。
LZ再接再厉把软VT也写了吧!
ugvjewxf 2012-1-1 22:03
20
0
好开头,高端实验室产品
sbppp 2012-1-3 06:46
21
0
进来就顶下了。
9571 2012-1-3 19:27
22
0
这篇文章威力很强大啊,准备深度拜读......
zuoyefeng 2012-1-8 00:04
23
0
ding VT~~~~~~~~~~~~~
xiaocaijk 2012-1-8 17:35
24
0
强帖 看不懂 留名~~
JoenChen 4 2012-1-17 13:43
25
0
VT技术可以开始研究了. 哈哈.. 这个必须得顶啊
jerrynpc 2012-1-17 14:51
26
0
wowocock知道的太多了~·
cvcvxk 10 2012-1-18 04:21
27
0
XDT的访问指令接管没啥用,现在基本都是直接读SelfKPCR的IDTBase来xx,我阴暗了~
Troy 1 2012-1-25 11:26
28
0
必须顶。~~~! 想问下如果是多核有哪些不一样?
huyongtq 2012-1-25 21:06
29
0
这个可以顶,贴子里面讲的东西都是好东西
yodamaster 2012-2-8 10:57
30
0
学习。。。。
fixker 2012-2-8 13:00
31
0
虽然看不懂,但是觉得好牛逼
ufofind 2012-2-10 21:44
32
0
是的必要顶才行,用好快三年VM机都不知他为什么,怎样能实现的!
只学了win32asm(386~586)
lcz 2 2012-2-27 18:01
33
0
顶,强贴啊。
张振江 2012-3-1 18:20
34
0
这里面 有海风 的 力量?
ydfivy 2012-3-2 15:34
35
0
帅帅帅帅帅帅。
lslx 2012-3-15 13:55
36
0
标记拜读……
Jobcrazy 2012-3-16 12:15
37
0
mark一下,以后来看
hsdund 2012-5-10 01:40
38
0
这个暂时还看不懂,以前不太明白,看了海风的解说明白了一点
yhswwr 2012-12-4 06:45
39
0
强贴留名~
可惜08 32位蓝了,几台电脑没一个XP悲催,看不到效果了
pushmop 2012-12-4 09:44
40
0
虽不明,但觉厉。
xiongchang 2012-12-4 10:25
41
0
坐地膜拜~~学习学习
ling林 2013-10-14 13:05
42
0
楼主,有更多介绍vt技术的资料和连接吗?
半斤八兩 10 2013-10-29 00:18
43
0
支持一下, 学习一下vt 技术.~
fayn 2014-7-1 14:03
44
0
谢谢楼主~!~!~!~!
lhglhg 1 2014-7-1 14:52
45
0
这个scr sys部分是如何编译?
一二三六 2015-6-16 19:26
46
0
刚刚NewBluePill看到最后了,有些不懂的,看了您的源码,基本就拨开云雾了,感谢大神
红颜世家、 2015-6-16 19:53
47
0
虽然看不懂
但是感觉楼主已超神
白菜大哥 2015-10-19 22:08
48
0
楼主好牛X。。。God like了
陈jack 2018-7-26 16:10
49
0
学习一下
游客
登录 | 注册 方可回帖
返回