• 1489阅读
  • 6回复

Blue Pill的编译和安装 [复制链接]

上一主题 下一主题
离线天道酬勤
 

只看楼主 倒序阅读 使用道具 楼主  发表于: 2016-02-02
— 本帖被 天道酬勤 从 驱动保护 移动到本区(2016-05-19) —
抱歉,因为工作比较忙,有三个月没有更新了。估计后面都会比较忙,我尽量抽空更新。
一、安装
之所以先说安装是因为编译和安装方式有关系。Blue Pill有两种安装方式:
1、windows普通内核模式驱动安装方式
这种方式具体又有多种方式,需要写注册表的、使用未公开的Native API不需要写注册表的。网上找可以找到,或者看《Rootkits--Windows内核的安全防护》。
2、shell code方式
要用这种方式安装需要在newbp.h或者其它被newbp.c包含的头文件中定义宏RUN_BY_SHELLCODE。这种方式要求条件比较苛刻,你需要有一个windows内核级的溢出漏洞可以利用。因为本人对这方面还没有什么研究,也没有可以利用的漏洞,所以就没什么可说的,不过欢迎有这方面背景的一起讨论。


#ifdef RUN_BY_SHELLCODE
  _KdPrint (("NEWBLUEPILL: Image base: 0x%p, image size: 0x%x/n", DriverObject, (ULONG64) RegistryPath));
//从这里可以看出,以shell code方式,对DriverEntry的调用两个参数的含义有了变化
//DriverObject表示驱动的代码起始地址
// RegistryPath表示驱动代码的大小
  Status = MmMapGuestPages (DriverObject, (ULONG) BYTES_TO_PAGES ((ULONG64) RegistryPath));
#else
  Status = MmMapGuestPages (DriverObject->DriverStart, BYTES_TO_PAGES (DriverObject->DriverSize));
#endif


#ifndef RUN_BY_SHELLCODE
  DriverObject->DriverUnload = DriverUnload; //shell code方式没有Driver Unload
#endif

二、编译
选择是否定义宏RUN_BY_SHELLCODE。
可以编译成两种代码:64位的x64,32位的x86,又可以细分为平台:intel的vmx和AMD的svm,平台是内部判断的我们不怎么需要关心。
1、x64
这种方式很简单用ddk编译环境到svm和vmx目录进行一次build -L(编译成lib),让后到common目录下进行一次build,这时候就可以在bin/amd64目录下看到newbp.sys。这个就是目标驱动文件,不要被amd64迷惑,以为这个只能在AMD的CPU上运行,其实不是,intel的也可以,HvmInit函数内部已经有平台判断。
2、x86
这个比较麻烦,需要修改下面这些代码:
(1)、i386/common-asm.asm文件中增加
; 这个函数只在SVm用到,编译器不支持,只能硬编码,注意是AMD的x86指令
CmClflush PROC StdCall _Pointer
mov    eax, _Pointer
db 0Fh, 0AEh, 0E8h  ;lfence
db 0Fh, 0AEh, 38h  ;clflush byte ptr[eax]
ret
CmClflush ENDP


(2)、i386/Vmx-asm.asm(16)
第16行,16改成8,具体原因看第232行;HvmEventCallback(PCPU Cpu,PGUEST_REGS GuestRegs,ULONG64 Ticks1)
和这个函数的具体定义
EXTERN  HvmEventCallback@16:PROC ->EXTERN  HvmEventCallback@8:PROC

第244行同样修改
(244) call HvmEventCallback@8 ;16


(3)、i386/svm-asm.asm
第20行,也可以直接删了这一行
EXTERN HvmEventCallback@16:PROC ->EXTERN HvmEventCallback@8:PROC



(4)、i386/cpuid.asm
增加这个函数
; CpuidWithEcxEdx (PULONG32 ecx (rcx), PULONG32 edx (rdx));
CpuidWithEcxEdx PROC StdCall _ecx, _edx
mov  eax, _ecx

mov  ecx, dword ptr [eax]
mov  eax, _edx
mov  edx, dword ptr [eax]
push  ebx
cpuid
pop  ebx
mov  eax, _ecx
mov  [eax], ecx
mov  eax, _edx
mov  [eax], edx
ret
CpuidWithEcxEdx ENDP


(5)、在svm/Svm.c修改如下四处
svm/Svm.c(89)
#ifndef _X86_
  Cpu->Svm.OriginalVmcb->vintr.fields.tpr = RegGetCr8 ();
#endif


svm/Svm.c(127)
#ifndef _X86_
  RegSetCr8 (Cpu->Svm.OriginalVmcb->vintr.fields.tpr);
#endif


svm/Svm.c(1030)
#ifndef _X86_
  RegSetCr8 (0);
#endif

svm/Svmtraps.c(275)
#ifndef _X86_
      RegSetCr8 (Cpu->Svm.OriginalVmcb->vintr.fields.tpr);
#endif


编译方式同x64,也是两次的build -L和一次build。目标文件在bin/i386目录下的newbp.sys。

不过别太高兴,因为MmMapGuestKernelPages内部使用windows64位内存模型,所以上面这些是无用功,当然你也可以自己修改其它的C代码,这样你编译出来的32位代码才是有用的。
声明一下上面的目录都是在nbp-0.32-public。
因为本人的机子不支持硬件虚拟化,所以。。。。。


三、其他代码
1、bpknock
这个是一个配合程序,只要你安装了blue pill,然后用命令运行这个程序,就可以给blue pill发命令。这个还没具体看......其实就是运行一下cpuid指令,陷阱进入blue pill处理。
2、dbgclient
这也是一个驱动,用于本地调试用的。这个也没具体看,主要是在内存中传数据。
看newbp.c的下面代码。
#ifdef USE_LOCAL_DBGPRINTS
    DbgUnregisterWindow ();
#endif


这次就到这里,待续。。。。。。。

离线v2680267313

只看该作者 沙发  发表于: 2016-04-30
用户被禁言,该主题自动屏蔽!
离线along11

只看该作者 板凳  发表于: 2016-07-27
,有的人用的非常爽,而有的人看着都不爽。仁者见仁,智者见智。不管
离线along11

只看该作者 地板  发表于: 2016-07-27
,有的人用的非常爽,而有的人看着都不爽。仁者见仁,智者见智。不管怎么样,作为程序员的你,都要会的。这篇文章就是用
离线along11

只看该作者 4楼 发表于: 2016-07-27
,有的人用的非常爽,而有的人看着都不爽。
离线along11

只看该作者 5楼 发表于: 2016-07-27
,有的人用的非常爽,而有的人看着都不爽。仁者见仁,智者见智。不管怎么样,作为程序员的你,都要会的。这篇文章就是
离线along11

只看该作者 6楼 发表于: 2016-07-27
,有的人用的非常爽,而有的人看着都不爽。仁者见仁,智者见智。不管怎么样,作为
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个