易语言教程_易语言源码_易语言视频教程_易语言论坛

 找回密码
 点击注册

Vip新手入门区
新手学习指南  学员作品展示 Vip课程总纲  Vip绝密课程系列

Vip相关下载区
Vip模块下载   Vip模块绑定   Vip模块例子 魔鬼插件下载  魔鬼插件例子  教程工具下载

Vip论坛服务区
教程问题提问区   模块问题提问区 技术交流区   魔鬼插件建议   忘记密码找回

VIP会员办理QQ: 8643245   
【请先加好友,然后到好友列表双击联系客服,办理VIP会员。】
【基础篇】易语言辅助入门基础教程
VIP模块办理QQ: 7189694 办理正版魔鬼作坊VIP模块 【基础篇】OD与CE入门基础教程
办理【终身VIP会员】“秒杀价” 仅需 RMB278.00元… 【基础篇】零基础绝密汇编语言入门课程 (共26课已完成)…
办理VIP详情…猛击这里查看详情 【基础篇】VIP辅助入门基础教程-新手必学 已发布10课 ……
VIP教程免费试看章节…猛击下载 【第1款】制作“辅助挂”教程目录查看(共107+16_x64下更新课已完成)…
亲爱的VIP学员,请到此写下你学习的感受与发布作品截图… 【第2款】制作“任务挂”教程目录查看(共77+1_x64下更新课已完成)…
卍解吧!不用bp send类封包断点找CALL的各种通杀思路 【第3款】驱动过保护技术课程(共38课已完成)…
【绝密教程】VIP绝密教程系列---注意:随时会更新! 【第4款】VIP邪恶二叉树辅助课程 (共31+17_x64下更新课已完成)…
【精品第13款】3D射击游戏与页游透视 智辅课程 已完成17课… 【第5款】零基础易语言按键辅助教程 (30课已完成)…
【精品第14款】变态功能辅助是如何炼成的 已完成36课… 【第6款】从零开始学习封包辅助技术教程(20课已完成) …
【精品第15款】DNF商业变态辅助的修炼之路 已完成27课… 【第7款】大杀特杀分析来源与CALL吸血鬼课程 (56课已完成)
【精品第16款】中控台多线程多开自动化商业辅助课程 已完成66课… 【第8款】完全零基础网页辅助课程(40课已完成)
【全新精品第17款】检测原理与过游戏内存检测技术课程 已发布9课… 【第9款】自动登录与操控LUA技术课程 (共46+8_x64下更新课已完成)…
【全新精品第18款】手游全自动化任务脚本辅助课程 已发布25课…… 【第10款】网页辅助封包脱机进阶课程 已完成30课…
【全新精品第19款】D3D方框骨骼透视与自瞄辅助课程进阶篇 已发布34课…… 【第11款】VC++ Lua脚本辅助课程 已完成112课…
【全新精品第20款】 X64模拟器吃鸡游戏方框透视自瞄辅助课程 发布中... 【第12款】网游脱机封包智辅课程 已完成35课…
查看: 2072|回复: 0

教你 如何进入VMX(Intel) 实现秒杀过保护

[复制链接]

15

主题

6

回帖

26

积分

编程入门

Rank: 1

魔鬼币
541
发表于 2017-5-30 08:45:42 | 显示全部楼层 |阅读模式

1、检测你的CPU是否支持VMX
MOV EAX,1
CPUID
检测ECX的第5位,如果为1则支持VMX

2、初始化VMXON region
pVMXONRegion = MmAllocateNonCachedMemory( 4096 );
RtlZeroMemory( pVMXONRegion, 4096 );
PHYSICAL_ADDRESS       PhysicalVMXONRegionPtr=MmGetPhysicalAddress( pVMXONRegion );
__asm
{
MOV             ECX, IA32_VMX_BASIC_MSR_CODE //0x480
RDMSR
LEA              EBX, vmxBasicMsr
MOV             [EBX+4], EDX
MOV             [EBX], EAX
}
*(pVMXONRegion) = vmxBasicMsr.RevId;
3、设置VMXE位(CR4)
CR4_REG                                         cr4_reg = {0};
__asm
{
PUSH     EAX
_emit      0x0F       // MOV   EAX, CR4
_emit      0x20
_emit      0xE0
MOV             cr4_reg, EAX
POP        EAX
}
cr4_reg.VMXE = 1;
__asm
{
PUSH     EAX
MOV             EAX, cr4_reg
_emit      0x0F       // MOV   CR4, EAX
_emit      0x22
_emit      0xE0
POP        EAX
}

4、执行VMXON指令
__asm
{
PUSH     DWORD PTR PhysicalVMXONRegionPtr.HighPart
PUSH     DWORD PTR PhysicalVMXONRegionPtr.LowPart
_emit      0xF3       // VMXON [ESP]
_emit      0x0F
_emit      0xC7
_emit      0x34
_emit      0x24
PUSHFD
POP        eFlags
ADD              ESP, 8
}
if( eFlags.CF == 1 )
{
Log( "ERROR : VMXON operation failed." , 0 );
return 0;
}
//到这里说明已经进入了VMX模式,并且工作在ROOT下了

5、初始化VMCS region
//这是个4K大小的内存块
ULONG *pVMCSRegion = MmAllocateNonCachedMemory( 4096 );
RtlZeroMemory( pVMCSRegion, 4096 );
PHYSICAL_ADDRESS  PhysicalVMCSRegionPtr = MmGetPhysicalAddress( pVMCSRegion );
*(pVMCSRegion) = vmxBasicMsr.RevId;
__asm
{
PUSH     DWORD PTR PhysicalVMCSRegionPtr.HighPart
PUSH     DWORD PTR PhysicalVMCSRegionPtr.LowPart
_emit      0x66       // VMCLEAR [ESP]
_emit      0x0F
_emit      0xc7
_emit      0x34
_emit      0x24
ADD       ESP, 8
PUSHFD
POP        eFlags
}
if( eFlags.CF != 0 || eFlags.ZF != 0 )
{
Log( "ERROR : VMCLEAR operation failed." , 0 );
return 0;
}
//到这里,说明VMCS region初始化完成了

6、装载VMCS region
__asm
{
PUSH     DWORD PTR PhysicalVMCSRegionPtr.HighPart
PUSH     DWORD PTR PhysicalVMCSRegionPtr.LowPart
_emit      0x0F       // VMPTRLD [ESP]
_emit      0xC7
_emit      0x34
_emit      0x24
ADD       ESP, 8
}

7、设置VMCS region中的相关域
这些域包括:
A、Guest的各个段寄存器的selector,base,limit,access right
B、Host的各个段寄存器的selector,base,limit,access right
C、Guest的CR0,CR3,CR4,IDTR,GDTR,LDTR,Rflag,SYSENTER_CS,SYSENTER_EIP,SYSENTER_ESP
D、Host的CR0,CR3,CR4,IDTR,GDTR,LDTR,Rflag,SYSENTER_CS,SYSENTER_EIP,SYSENTER_ESP
如:
USHORT    seg_selector = 0;
__asm  MOV      seg_selector, ES
Log( "Setting Guest ES Selector" , seg_selector );
WriteVMCS( 0x00000800, seg_selector );
//Guest CS selector                                                             00000802H
__asm  MOV      seg_selector, CS
Log( "Setting Guest CS Selector" , seg_selector );
WriteVMCS( 0x00000802, seg_selector );

E、Exception bitmap
作为调试器,我们需要拦截INT1和INT3中断,因此,Exception bitmap起码要这样设置:
ULONG        temp32 = 0x00000000;
SetBit( &temp32, 1 );                                              // Single Step (INT 1) int1
SetBit( &temp32, 3 );                                              // Software Interrupt (INT 3)
WriteVMCS( 0x00004004, temp32 );

F、VMX Abort Error Code域
这个域需要清成0
RtlZeroMemory( (pVMCSRegion + 4), 4 );

G、Guest的ESP和EIP
WriteVMCS( 0x0000681C, (ULONG)GuestStack );
WriteVMCS( 0x0000681E, (ULONG)GuestReturn );

H、Host的ESP和EIP
PVOID   HostStack = ExAllocatePoolWithTag( NonPagedPool , 0x8000, 'kSkF' );
If(HostStack == NULL)
{
//…出错…
}
WriteVMCS( 0x00006C14, ((ULONG)HostStack + 0x7FFF) );
WriteVMCS( 0x00006C16, (ULONG)VMExitProc );// VMExitProc就是VMM的程序入口

8、执行VMLAUNCH
__asm
{
_emit      0x0F       // VMLAUNCH
_emit      0x01
_emit      0xC2
}

// 如果成功,就不会到这里了!
__asm
{
PUSHFD
POP        eFlags
}
Log( "VMLAUNCH Failure" , 0xDEADDEAD );
if( eFlags.CF != 0 || eFlags.ZF != 0 || TRUE )
{
ULONG  ErrorCode= VMRead_ULONG(0x00004400);
Log( "VM Instruction Error" , ErrorCode );
}

VMMExitProc
extern "C"
__declspec( naked ) VOID VMMExitProc( )
{
__asm CLI
__asm PUSHAD

  //保存通用寄存器
__asm MOV GuestEAX, EAX
__asm MOV GuestEBX, EBX
__asm MOV GuestECX, ECX
__asm MOV GuestEDX, EDX
__asm MOV GuestEDI, EDI
__asm MOV GuestESI, ESI
__asm MOV GuestEBP, EBP

  //保存调试寄存器
__asm
{
push eax
mov eax,dr0
mov GuestDr0,eax
mov eax,dr1
mov GuestDr1,eax
mov eax,dr2
mov GuestDr2,eax
mov eax,dr3
mov GuestDr3,eax
mov eax,dr6
mov GuestDr6,eax
pop eax
}

GuestDr7 = VMRead_ULONG(VMX_VMCS_GUEST_DR7);//0x681A
GuestEIP = VMRead_ULONG(VMX_VMCS_GUEST_RIP);//0x681E
GuestEFlags = VMRead_ULONG(VMX_VMCS_GUEST_RFLAGS);//0x6820

//获取本次Exit的详细信息
ULONG ExitReason = VMRead_ULONG(VMX_VMCS_RO_EXIT_REASON);//0x4402
ULONG ExitInterruptionInformation = VMRead_ULONG(VMX_VMCS_RO_EXIT_INTERRUPTION_INFO);//0x4404
ULONG ExitInstructionLength = VMRead_ULONG(VMX_VMCS_RO_EXIT_INSTR_LENGTH);//0x440C
ULONG ExitQualification = VMRead_ULONG(VMX_VMCS_RO_EXIT_QUALIFICATION);//0x6400

  if(ExitReason==0)//是个Exception
{
int IntrNo = ExitInterruptionInformation & 0xFF;
if(IntrNo==1 || IntrNo==3)//是INT1或者INT3
{
if(IsMyBreakPoint())
{//是我们自己设置的断点
DoSomeThing();
}
else
{//我们该向Guest注入一个异常,让Guest的中断处理程序能够继续处理,仿佛一切都没发生
ULONG InjectIrqInfo = 0x80000300 | IntrNo;
// 设置 VM-Entry Exception域
WriteVMCS( VMX_VMCS_CTRL_ENTRY_INSTR_LENGTH, ExitInstructionLength);
WriteVMCS( VMX_VMCS_CTRL_ENTRY_IRQ_INFO, InjectIrqInfo);
}
}
}
if(ExitReason==0x12)//VMMCALL
{//我们用一个VMMCALL指令来通知VMM结束VMX
if(GuestEAX == 0x12345678)//我们自己约定的规则
{
GuestEIP += ExitInstructionLength;
goto Exit;
}
}
goto Resume;
Exit:
//  关闭VMX.
DbgPrint("Terminating VMX Mode.");
__asm
{
_emit 0x0F  // VMXOFF
_emit 0x01
_emit 0xC4
POPAD
MOV   ESP, GuestESP
STI
JMP   GuestEIP
}

  Resume:   
//  Need to execute the VMRESUME without having changed
//  the state of the GPR and ESP et cetera.
__asm
{
push      eax
mov       eax,GuestDr0
mov       DR0,eax
mov       eax,GuestDr1
mov       DR1,eax
mov       eax,GuestDr2
mov       DR2,eax
mov       eax,GuestDr3
mov       DR3,eax
mov       eax,GuestDr6
mov       DR6,eax
pop       eax
POPAD
MOV   EAX, GuestEAX
MOV   EBX, GuestEBX
MOV   ECX, GuestECX
MOV   EDX, GuestEDX
MOV   ESI, GuestESI
MOV   EDI, GuestEDI
MOV   EBP, GuestEBP
STI
_emit 0x0F  // VMRESUME
_emit 0x01
_emit 0xC3

//永远不会到这里
}
您需要登录后才可以回帖 登录 | 点击注册

本版积分规则

魔鬼作坊|易语言教程|易语言源码|易语言论坛|易语言视频教程| 论坛导航|免责申明|手机版||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表魔鬼作坊立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2019 All Right Reserved.
快速回复 返回顶部 返回列表