天天看點

Blue Pill的編譯和安裝

抱歉,因為工作比較忙,有三個月沒有更新了。估計後面都會比較忙,我盡量抽空更新。

一、安裝

之是以先說安裝是因為編譯和安裝方式有關系。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  [email protected]:PROC ->EXTERN  [email protected]:PROC

第244行同樣修改

(244) call [email protected] ;16

(3)、i386/svm-asm.asm

第20行,也可以直接删了這一行

EXTERN [email protected]:PROC ->EXTERN [email protected]: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

這次就到這裡,待續。。。。。。。

繼續閱讀