最强黑客库Blackbone使用教程
文章目錄
- 環境搭建
- 項目地址
- 項目介紹
- 項目編譯
- 項目集成
- 項目使用
- 進程交互
- 根據進程名枚舉所有進程ID
- 根據進程ID或進程名枚舉進程信息
- 枚舉所有進程
- 附加一個進程(打開進程),并獲取相關信息
- 啟動并附加進程
- 進程模塊管理
- 進程內存管理
- 進程線程管理
- JIT匯編
- 遠程代碼執行
- 內存搜索匹配
- 遠程函數調用
- 系統調用 只適用于x64
- dll隱藏注入
- 總結
環境搭建
項目地址
https://github.com/DarthTon/Blackbone
項目介紹
作為Windows開發人員,經常遇到枚舉進程、枚舉模塊、讀寫進程內存的操作;Windows安全開發人員更是會涉及注入、hook、操作PE文件、編寫驅動。每次都要翻各種資料制造輪子,那么有沒有好的開源庫解決這個問題呢,目前知道的就Blackbone了,而且它的代碼寫的很好,完全可以作為教科書來用。
網上對于各種類型的封裝庫百分之99都是copy的這個項目,并且看雪很多大佬的項目都引用了其中的代碼。由此可見,這個項目的重要性和牛逼程度就不言而喻了。
庫內容包含
Process interaction(進程交互)操作PEB32/PEB64通過WOW64 barrier管理進程 Process Memory(進程內存)分配和釋放虛擬內存改變內存保護屬性讀寫虛擬內存 Process modules(進程模塊)枚舉所有進程加載的模塊 (32/64 bit)獲得導出函數地址獲得主模塊從模塊列表中去除模塊信息注入、卸載模塊(支持 pure IL images)在WOW64進程中注入64位模塊操作PE Threads(線程)枚舉線程創建和關閉線程獲得線程退出碼獲得主線程管理 TEB32/TEB64join線程(等待線程退出)暫停、恢復線程設置、清除硬件斷點 Pattern search特征碼匹配(支持本進程和其他進程) Remote code execution在遠程進程中執行函數組裝自己的代碼并遠程執行(shellcode注入)支持各種調用方式: cdecl/stdcall/thiscall/fastcall支持各種參數類型支持FPU支持在新線程或已經存在的線程中執行shellcode Remote hooking通過軟硬斷點,在遠程進程中hook函數Hook functions upon return(通過return掛鉤函數) Manual map features隱藏注入,支持x86和x64,注入任意未保護的進程,支持導入表和延遲導入等等特性,不一一列舉了。 Driver features分配、釋放、保護內存讀寫用戶層、驅動層內存對于WOW64進程,禁用DEP修改進程保護標記修改句柄訪問權限操作進程內存(如:將目標進程map到本進程等)隱藏已分配用戶模式內存用戶模式dll注入;手動mapping(手動加載模塊)手動加載驅動項目編譯
需要安裝下面幾個組件
我用VS2017編譯會報一個引用已刪除函數的錯誤,找不到解決方案,就直接找人幫我編譯了一份。
據說是最新版本只支持VS2019,如果要使用VS2017,需要選擇其他分支代碼。
項目集成
新建一個空項目
然后在項目目錄下新建一個include文件夾
把src目錄下的三個文件夾復制到include文件夾
上面三個文件夾的在引用頭文件的時候需要用到,build里面存放的是已經編譯好的lib庫
接著包含lib庫和頭文件
#include <iostream> #include "../include/BlackBone/Config.h" #include "../include/BlackBone/Process/Process.h" #include "../include/BlackBone/Process/MultPtr.hpp" #include "../include/BlackBone/Process/RPC/RemoteFunction.hpp" #include "../include/BlackBone/PE/PEImage.h" #include "../include/BlackBone/Misc/Utils.h" #include "../include/BlackBone/Misc/DynImport.h" #include "../include/BlackBone/Syscalls/Syscall.h" #include "../include/BlackBone/Patterns/PatternSearch.h" #include "../include/BlackBone/Asm/LDasm.h" #include "../include/BlackBone/localHook/VTableHook.hpp" #include "../include/BlackBone/DriverControl/DriverControl.h"#ifdef _DEBUG #pragma comment(lib, "..\\include\\build\\Win32\\Debug\\BlackBone.lib") #else #pragma comment(lib, "..\\include\\build\\Win32\\Release\\BlackBone.lib") #endif使用命名空間
using namespace blackbone;隨意調用一個函數,即可編譯通過。編譯通過說明集成成功。
接著需要把build生成的三個文件拷貝到項目目錄下,否則會報下面的錯誤
項目使用
下面講解每一個模塊的代碼功能使用。
進程交互
根據進程名枚舉所有進程ID
auto pids = Process::EnumByName(L"explorer.exe");根據進程ID或進程名枚舉進程信息
auto procInfo = Process::EnumByNameOrPID(4596, L"");for (auto info : procInfo.result()){wcout << info.imageName << info.pid << info.threads.size();}枚舉所有進程
auto all = Process::EnumByNameOrPID(0, L"");for (auto info : all.result()){wcout << info.imageName << "\t" << info.pid << info.threads.size() << endl;}附加一個進程(打開進程),并獲取相關信息
Process process;vector<DWORD> vecPid = Process::EnumByName(L"QQ.exe");//附加一個進程if (!vecPid.empty()&&NT_SUCCESS(process.Attach(vecPid.front()))){//ProcessCore類ProcessCore& processCore = process.core();//進程WOW64信息Wow64Barrier barrier = process.barrier();//獲取進程ID和進程句柄DWORD dwPid = processCore.pid();HANDLE hProcess = processCore.handle();//獲取進程PEBPEB_T peb = {};ptr_t ptrPEB = processCore.peb(&peb);//獲取進程的所有句柄for (HandleInfo handleInfo:process.EnumHandles().result()){wcout << handleInfo.name << handleInfo.handle << handleInfo.typeName << endl;}啟動并附加進程
//啟動并附加進程Process process;process.CreateAndAttach(L"D:\\InjectTool.exe", true);{//恢復進程process.Resume();//延遲100毫秒std::this_thread::sleep_for(std::chrono::milliseconds(100));}進程模塊管理
//進程模塊管理Process process;if (NT_SUCCESS(process.Attach(L"WeChat.exe"))){//模塊管理ProcessModules& proModules = process.modules();//獲取所有模塊 包括x86跟x64模塊auto mapModule = proModules.GetAllModules();//獲取主模塊ModuleDataPtr mainModule = proModules.GetMainModule();//主模塊基地址module_t baseAddress = mainModule->baseAddress;//獲取導出函數地址call_result_t<exportData> exportFunAddr = proModules.GetExport(L"kernel32.dll", "LoadLibraryW");if (exportFunAddr.success()){cout << "LoadLibraryW" << exportFunAddr->procAddress << endl;}//模塊斷鏈proModules.Unlink(mainModule);auto mapModule2 = proModules.GetAllModules();//注入模塊call_result_t<ModuleDataPtr> ptr= proModules.Inject(L"E:\\Dll1.dll");//卸載模塊proModules.Unload(ptr);}里面有一個很牛逼的功能,模塊斷鏈,實測可行~
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oc7z6bW0-1642037164410)(Blackbone黑客庫的使用.assets/image-20220112125146182.png)]
進程內存管理
Process process;if (NT_SUCCESS(process.Attach(L"QQ.exe"))){//操作內存類ProcessMemory& memory = process.memory();//主模塊ModuleDataPtr mainModoulePtr = process.modules().GetMainModule();//PE頭信息IMAGE_DOS_HEADER dosHeader = {};//讀取內存 模塊的開始信息是PE頭信息//第一種方法memory.Read(mainModoulePtr->baseAddress, dosHeader);//第二種方法memory.Read(mainModoulePtr->baseAddress, sizeof(dosHeader),&dosHeader);//第三種方法call_result_t<IMAGE_DOS_HEADER> dosHeaderResult = memory.Read<IMAGE_DOS_HEADER>(mainModoulePtr->baseAddress);//改變內存讀寫屬性if (NT_SUCCESS(memory.Protect(mainModoulePtr->baseAddress,sizeof(dosHeader), PAGE_READWRITE))){//寫內存第一種方法memory.Write(mainModoulePtr->baseAddress, dosHeader);//寫內存第二種方法memory.Write(mainModoulePtr->baseAddress, sizeof(dosHeader),&dosHeader);}//分配內存call_result_t<MemBlock> memBlockResult = memory.Allocate(0x1000, PAGE_READWRITE);if (memBlockResult.success()){//寫內存memBlockResult->Write(0x10, 12.0);//讀內存memBlockResult->Read<double>(0x10, 0.0);}//枚舉所有有效內存區域vector<MEMORY_BASIC_INFORMATION64> region = memory.EnumRegions();}進程線程管理
Process process;if (NT_SUCCESS(process.Attach(L"QQ.exe"))){//枚舉所有線程vector<ThreadPtr> vecTheadPtr = process.threads().getAll();//獲取主線程ThreadPtr mainThread = process.threads().getMain();//根據線程ID獲取線程信息ThreadPtr threadPtr = process.threads().get(mainThread->id());//獲取線程上下文CONTEXT_T ctx = {};if (threadPtr->GetContext(ctx, CONTEXT_FLOATING_POINT)){//這里設置Dr寄存器就可以清除硬件斷點//......//設置線程上下文threadPtr->SetContext(ctx);}//等待線程退出threadPtr->Join(100);}JIT匯編
AsmHelper32 asmPtr = AsmFactory::GetAssembler();IAsmHelper& a = *asmPtr;//生成函數代碼a->GenPrologue();a->add(a->zcx, a->zdx);a->mov(a->zax, a->zdx);a.GenEpilogue();auto func = reinterpret_cast<uintptr_t(__fastcall*)(uintptr_t, uintptr_t)>(a->make());uintptr_t r = func(10, 5);遠程代碼執行
Process process;if (NT_SUCCESS(process.Attach(L"QQ.exe"))){//遠程執行類RemoteExec& remoteExe = process.remote();//創建遠程執行環境remoteExe.CreateRPCEnvironment(Worker_None, true);//獲取導出函數地址call_result_t<exportData> GetModuleHandleWPtr = process.modules().GetExport(L"kernel32.dll", "GetModuleHandleW");if (GetModuleHandleWPtr.success()){//使用指定的入口點和參數創建新線程DWORD mod = remoteExe.ExecDirect(GetModuleHandleWPtr->procAddress, 0);AsmHelperPtr asmPtr = AsmFactory::GetAssembler();if (asmPtr){blackbone::IAsmHelper& asmHelper = *asmPtr;asmHelper.GenPrologue();asmHelper.GenCall(static_cast<uintptr_t>(GetModuleHandleWPtr->procAddress), { nullptr }, blackbone::cc_stdcall);asmHelper.GenEpilogue();uint64_t result = 0;//創建新線程并在其中執行代碼。 等待執行結束remoteExe.ExecInNewThread(asmHelper->make(), asmHelper->getCodeSize(), result);}//在主線程執行blackbone::ThreadPtr mainThreadPtr = process.threads().getMain();blackbone::AsmHelperPtr asmHelperPtr = blackbone::AsmFactory::GetAssembler();if (asmHelperPtr){blackbone::IAsmHelper& asmHelper = *asmHelperPtr;asmHelper.GenPrologue();asmHelper.GenCall(static_cast<uintptr_t>(GetModuleHandleWPtr->procAddress), { nullptr }, blackbone::cc_stdcall);asmHelper.GenEpilogue();uint64_t result = 0;remoteExe.ExecInAnyThread(asmHelper->make(), asmHelper->getCodeSize(), result, mainThreadPtr);}}}內存搜索匹配
Process process;if (NT_SUCCESS(process.Attach(L"QQ.exe"))){//匹配模版PatternSearch ps{ 1,2,3,4,5,6,7,8,9 };//搜索結果vector<ptr_t> results;//內存搜索ps.SearchRemote(process, false, 0, results);}上面的SearchRemote函數是遠程搜索
BLACKBONE_API size_t Search( uint8_t wildcard, void* scanStart, size_t scanSize, std::vector<ptr_t>& out, ptr_t value_offset = 0,size_t maxMatches = SIZE_MAX) const;另外還提供了一個Search函數支持本進程搜索嗎,而且還支持通配符
遠程函數調用
Process process;if (NT_SUCCESS(process.Attach(L"QQ.exe"))){//1.簡單直接調用//獲取遠程函數對象RemoteFunction<decltype(&MessageBoxW)> pMessageBoxW = MakeRemoteFunction<decltype(&MessageBoxW)>(process, L"user32.dll", "MessageBoxW");if (pMessageBoxW.valid()){//遠程調用auto result = pMessageBoxW(HWND_DESKTOP, L"HelloWorld", L"Title", MB_OK);}//2.使用特定線程調用auto mainThread = process.threads().getMain();if (auto pIsGuiThread= MakeRemoteFunction<decltype(&IsGUIThread)>(process, L"user32.dll", "IsGUIThread"); pIsGuiThread && mainThread){auto result = pIsGuiThread.Call({ FALSE }, mainThread);if (*result){}}//3.給定參數調用if (auto pMultiByteToWideChar = blackbone::MakeRemoteFunction<decltype(&MultiByteToWideChar)>(process, L"kernel32.dll", "MultiByteToWideChar")){auto args = pMultiByteToWideChar.MakeArguments({ CP_ACP, 0, "Sample text", -1, nullptr, 0 });std::wstring converted(32, L'\0');// Set buffer pointer and size manuallyargs.set(4, blackbone::AsmVariant(converted.data(), converted.size() * sizeof(wchar_t)));args.set(5, converted.size());auto length = pMultiByteToWideChar.Call(args);if (length)converted.resize(*length - 1);}}系統調用 只適用于x64
{uint8_t buf[32] = { };uintptr_t bytes = 0;NTSTATUS status = syscall::nt_syscall(syscall::get_index( "NtReadVirtualMemory" ),GetCurrentProcess(),GetModuleHandle( nullptr ),buf,sizeof(buf),&bytes);if (NT_SUCCESS( status )){}}dll隱藏注入
//隱藏注入dll 進程名 dll路徑 適配32位和64位 void HideInject(const std::wstring& processName, const std::wstring& dllPath) {vector<DWORD> vecPid = Process::EnumByName(processName);if (vecPid.empty()){MessageBoxA(0, "不存在目標進程", "提示", 0);return;}//首先要拿到目標進程的信息Process proc;proc.Attach(vecPid.front());//確保LdrInitializeProcess被調用proc.EnsureInit();//將PE文件映射到目標進程 1.PE文件路徑 flags(手動映射導入函數) 回調函數auto image = proc.mmap().MapImage(dllPath, ManualImports, &MapCallback2);//獲取導出函數地址auto g_loadDataPtr = proc.modules().GetExport(image.result(), "g_LoadData");//調用導出函數auto g_loadData = proc.memory().Read<DllLoadData>(g_loadDataPtr->procAddress); }ManualMap模塊的代碼利用反射型dll注入的原理,將PE文件不借助LoadLibrary在目標進程中展開,從而實現隱藏注入。
https://github.com/DarthTon/Xenos另外這個作者還有一個非常強大的注入工具,支持三種零環的注入方式和兩種三環的注入。不過這個工具基本都已經被國外的各大游戲檢測的死死的。
總結
這個項目功能看似很強大,包含有各個模塊的封裝。但實際使用的時候往往只會用到其中一兩個模塊的功能。我只需要里面的特征碼搜索和dll隱藏注入這兩個功能,然后順便學習了一下其他模塊。
沒想到最后集成的時候,頭文件之間互相包含依賴,而且數據類型都是作者自定義的。如果想拿出其中的一個模塊,最后會因為頭文件包含的問題,從而把整個工程代碼都包含進來。
為了一個功能而把剩下幾個不需要的模塊代碼也加進來實在是有點雞肋??偟膩碚f,學習價值拉滿,實用性就不得而知了。
總結
以上是生活随笔為你收集整理的最强黑客库Blackbone使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android之Xposed框架完全使用
- 下一篇: 001 环境准备