抱歉,因為工作比較忙,有三個月沒有更新了。估計後面都會比較忙,我盡量抽空更新。
一、安裝
之是以先說安裝是因為編譯和安裝方式有關系。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
這次就到這裡,待續。。。。。。。