日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dll oem证书导入工具_恶意代码分析之反射型DLL注入

發布時間:2025/4/16 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dll oem证书导入工具_恶意代码分析之反射型DLL注入 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

01

技術概要

這是一種允許攻擊者從內存而非磁盤向指定進程注入DLL的技術,該技術比常規的DLL注入更為隱蔽,因為除了不需要磁盤上的實際DLL文件之外,它也不需要任何Windows加載程序的輔助即可注入。這消除了將DLL注冊為進程已加載模塊的需求,從而可逃脫工具的監視。

首先準備好測試dll,使用VS2015先編譯生成一個測試dll文件,作用是dll被進程附加的時候會執行MessageBox彈框,切記不要選擇空項目。如下,在DLL_PROCESS_ATTACH添加一個消息框函數,直接編譯生成dll。

下面會根據源碼逐步分析整體執行流程,示例代碼是模擬內存自加載dll的過程,為了演示所以采用了比較簡單的方式,dll文件生成后放在在本地,而真實案例中惡意代碼會存在母體文件的內存中,因為需要不落地內存加載。

先聲明相應的結構體變量,采用指定位數的方式指定結構體變量實際占用的位數(根據重定位表的特性),聲明一個函數指針便于后續進行調用執行dll入口。

第一步先通過GetModuleHandleA獲取基址,避免ASLR隨機基址影響,讀取dll文件內容加載至內存中,通過PE結構獲取實際加載至內存中dll的PE頭部數據。

分配dll加載時所需的內存空間,獲取加載基址與預期基址的差值,接著復制dll頭部數據至新的內存空間。

開始模擬Windows加載器功能加載PE文件至內存,如下。

02

PE文件重定位

基址重定位表位于PE頭的IMAGE_NT_HEADERS/IMAGE_OPTION_HEADER/IMAGE_DATA_DIRECTORY[5],換句話說重定位表位于可選頭的數據目錄表下的第六項,基址重定位表中記錄硬編碼地址的位置(偏移),使用這張表就能獲得準確的硬編碼地址偏移并后續對其修正。重定位表是按照一個物理頁(4kb或1000H)進行存儲的,也就是一個重定位塊負責一個4kb內存頁,一個重定位表只管自己當前的物理頁重定位。一個重定位表的記錄偏移的大小是2個字節(1000H最多需要12bit即可0~FFFH),也就是16位,而記錄偏移的大小是由SizeofBlock決定的。

如何修正?

將指令中的操作數按照指針字節數讀取出來,然后將其減去默認加載基址(擴展頭中的字段ImageBase),再加上新的加載基址,最后把新地址存入原來的地址中。

重定位工作完成之后,進行導入表的解析。

以上工作準備完畢之后,就已經模擬內存加載完成,之后獲取dll文件入口點進行執行,利用了之前聲明的函數指針。

03

示例源碼

#include

#include

typedef struct BASE_RELOCATION_BLOCK {

???????DWORD PageAddress;

???????DWORD BlockSize;

} BASE_RELOCATION_BLOCK, *PBASE_RELOCATION_BLOCK;

typedef struct BASE_RELOCATION_ENTRY {

???????USHORT Offset : 12;

???????USHORT Type : 4;

} BASE_RELOCATION_ENTRY, *PBASE_RELOCATION_ENTRY;

using DLLEntry = BOOL(WINAPI *)(HINSTANCE dll, DWORD reason, LPVOID reserved);

int main()

{

???????//得到當前模塊的基址

???????PVOID imageBase = GetModuleHandleA(NULL);

???????//本地加載dll內容至內存中

???????HANDLE dll =??CreateFileA("C:\\Users\\onion\\Desktop\\dll\\Release\\dll.dll", GENERIC_READ,??NULL, NULL, OPEN_EXISTING, NULL, NULL);

???????DWORD64 dllSize = GetFileSize(dll, NULL);

???????LPVOID dllBytes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dllSize);

???????DWORD outSize = 0;

???????ReadFile(dll, dllBytes, dllSize, &outSize, NULL);

???????//獲取已加載至內存中的dll的頭部數據

???????PIMAGE_DOS_HEADER dosHeaders = (PIMAGE_DOS_HEADER)dllBytes;

???????PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((DWORD_PTR)dllBytes +??dosHeaders->e_lfanew);

???????SIZE_T dllImageSize = ntHeaders->OptionalHeader.SizeOfImage;

???????//分配dll加載時所需的內存空間

???????LPVOID dllBase = VirtualAlloc((LPVOID)ntHeaders->OptionalHeader.ImageBase,??dllImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

???????//得到實際分配的內存基址與預期的基址差值,便于后續進行重定向

???????DWORD_PTR deltaImageBase = (DWORD_PTR)dllBase -??(DWORD_PTR)ntHeaders->OptionalHeader.ImageBase;

???????//將dll頭部數據復制到分配的內存空間

???????std::memcpy(dllBase, dllBytes, ntHeaders->OptionalHeader.SizeOfHeaders);

???????//加載節區數據至新的內存空間

???????PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(ntHeaders);

???????for (size_t i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++)

???????{

??????????????LPVOID sectionDestination = (LPVOID)((DWORD_PTR)dllBase +??(DWORD_PTR)section->VirtualAddress);

??????????????LPVOID sectionBytes = (LPVOID)((DWORD_PTR)dllBytes +??(DWORD_PTR)section->PointerToRawData);

??????????????std::memcpy(sectionDestination, sectionBytes,??section->SizeOfRawData);

??????????????section++;

???????}

???????// 開始dll加載實現重定位

???????IMAGE_DATA_DIRECTORY relocations =??ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];

???????DWORD_PTR relocationTable = relocations.VirtualAddress +??(DWORD_PTR)dllBase;

???????DWORD relocationsProcessed = 0;

???????while (relocationsProcessed < relocations.Size)

???????{

??????????????PBASE_RELOCATION_BLOCK relocationBlock =??(PBASE_RELOCATION_BLOCK)(relocationTable + relocationsProcessed);

??????????????relocationsProcessed += sizeof(BASE_RELOCATION_BLOCK);

??????????????DWORD relocationsCount = (relocationBlock->BlockSize -??sizeof(BASE_RELOCATION_BLOCK)) / sizeof(BASE_RELOCATION_ENTRY);

??????????????PBASE_RELOCATION_ENTRY relocationEntries =??(PBASE_RELOCATION_ENTRY)(relocationTable + relocationsProcessed);

??????????????for (DWORD i = 0; i < relocationsCount; i++)

??????????????{

?????????????????????relocationsProcessed += sizeof(BASE_RELOCATION_ENTRY);

?????????????????????if (relocationEntries[i].Type == 0)

?????????????????????{

???????????????????????????continue;

?????????????????????}

?????????????????????DWORD_PTR relocationRVA = relocationBlock->PageAddress +??relocationEntries[i].Offset;

?????????????????????DWORD_PTR addressToPatch = 0;

?????????????????????ReadProcessMemory(GetCurrentProcess(),??(LPCVOID)((DWORD_PTR)dllBase + relocationRVA), &addressToPatch, sizeof(DWORD_PTR),??NULL);

?????????????????????addressToPatch += deltaImageBase;

?????????????????????std::memcpy((PVOID)((DWORD_PTR)dllBase + relocationRVA),??&addressToPatch, sizeof(DWORD_PTR));

??????????????}

???????}

???????//解析導入表

???????PIMAGE_IMPORT_DESCRIPTOR importDescriptor = NULL;

???????IMAGE_DATA_DIRECTORY importsDirectory =??ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];

???????importDescriptor =??(PIMAGE_IMPORT_DESCRIPTOR)(importsDirectory.VirtualAddress + (DWORD_PTR)dllBase);

???????LPCSTR libraryName = "";

???????HMODULE library = NULL;

???????while (importDescriptor->Name != NULL)

???????{

??????????????libraryName = (LPCSTR)importDescriptor->Name + (DWORD_PTR)dllBase;

??????????????library = LoadLibraryA(libraryName);

??????????????if (library)

??????????????{

?????????????????????PIMAGE_THUNK_DATA thunk = NULL;

?????????????????????thunk = (PIMAGE_THUNK_DATA)((DWORD_PTR)dllBase +??importDescriptor->FirstThunk);

?????????????????????while (thunk->u1.AddressOfData != NULL)

?????????????????????{

???????????????????????????if (IMAGE_SNAP_BY_ORDINAL(thunk->u1.Ordinal))

???????????????????????????{

??????????????????????????????????LPCSTR functionOrdinal =??(LPCSTR)IMAGE_ORDINAL(thunk->u1.Ordinal);

??????????????????????????????????thunk->u1.Function =??(DWORD_PTR)GetProcAddress(library, functionOrdinal);

???????????????????????????}

???????????????????????????else

???????????????????????????{

??????????????????????????????????PIMAGE_IMPORT_BY_NAME functionName =??(PIMAGE_IMPORT_BY_NAME)((DWORD_PTR)dllBase + thunk->u1.AddressOfData);

??????????????????????????????????DWORD_PTR functionAddress =??(DWORD_PTR)GetProcAddress(library, functionName->Name);

??????????????????????????????????thunk->u1.Function = functionAddress;

???????????????????????????}

???????????????????????????++thunk;

?????????????????????}

??????????????}

??????????????importDescriptor++;

???????}

???????//執行加載的dll

???????DLLEntry DllEntry = (DLLEntry)((DWORD_PTR)dllBase +??ntHeaders->OptionalHeader.AddressOfEntryPoint);

???????(*DllEntry)((HINSTANCE)dllBase, DLL_PROCESS_ATTACH, 0);

???????CloseHandle(dll);

???????HeapFree(GetProcessHeap(), 0, dllBytes);

???????return 0;

}

04

整個流程

1、讀入原始DLL文件至內存緩沖區;

2、解析DLL標頭并獲取SizeOfImage;

3、為DLL分配新的內存空間,大小為SizeOfImage;

4、將DLL標頭和PE節復制到步驟3中分配的內存空間;

5、執行重定位;

6、加載DLL導入的庫;

7、解析導入地址表(IAT);

8、調用DLL的DLL_PROCESS_ATTACH;

05

演示效果

06

真實案例

Netwalker勒索軟件dll自加載技術

惡意文件是一個混淆并加密過的PowerShell腳本,先對PowerShell腳本進行解混淆。解混淆后的內容如下,字節序列中的0x4d、0x5a明顯是一個PE文件標志頭,一旦加載執行后,這部分內容就在內存中了。

明顯的C#代碼模擬解析PE結構,如下。

執行自加載執行,如下。

更詳細的內容可去除混淆后自行查看,該勒索樣本實現的反射加載過程非常明顯。加載執行后,通過模擬加載dll并調用導出函數Do后進而實現注入目標進程,類似的技術則與開源項目PowerSploit中的反射自加載的Mimikatz腳本實現相類似。

07

參考

https://ired.team/offensive-security/code-injection-process-injection/reflective-dll-injection

https://blog.trendmicro.com/trendlabs-security-intelligence/netwalker-fileless-ransomware-injected-via-reflective-loading/

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-Mimikatz.ps1

總結

以上是生活随笔為你收集整理的dll oem证书导入工具_恶意代码分析之反射型DLL注入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产视频不卡 | 中文字幕精品视频在线观看 | 中国女人和老外的毛片 | 国产一级片一区二区 | 日皮视频免费看 | 国产精品专区在线观看 | 色婷视频 | 精品视频一区二区在线观看 | 在线网站av | 亚洲无人区小视频 | 人人爱人人 | 波多野结衣视频在线观看 | 精品麻豆av | 久久成人av | 久久韩日| 国产后入又长又硬 | 欧美爽爽爽 | 99资源站 | 久久久久一级片 | 加勒比一区二区三区 | 国产欧美一区二区三区在线老狼 | 91成人天堂久久成人 | 欧美亚洲大片 | 成人在线观看免费爱爱 | 熟妇毛片| 中文字幕无码人妻少妇免费 | 大奶一区二区 | 国产午夜精品久久久久久久 | 麻豆短视频在线观看 | 亚洲啪啪网址 | 国产精品国产一区 | 免费在线成人网 | 成片免费观看视频 | 黄色一级视频免费看 | 国产粉嫩在线观看 | 亚洲国产精品99 | 一个色综合久久 | 欧美特黄aaaaaa | 99精品国产免费 | 色无极亚洲影院 | 欧美黄色片视频 | 国产精品36p | 欧美日韩国产综合在线 | 99精品免费在线观看 | 蜜乳av网站 | 专业操老外 | 欧美国产在线看 | 91精品大片 | 黄色理论片 | 久久接色 | 久草免费看 | 日韩一级片一区二区 | 亚洲av综合色区无码另类小说 | 中文字幕乱码亚洲无线三区 | 久久精品视频一区 | 成年人网站在线 | 怒海潜沙秦岭神树 | 国产黄在线观看 | 欧美激情亚洲 | 91精品国产高潮对白 | 夜夜操av | 国产91久久精品一区二区 | 久久久免费电影 | 亚洲1页| 五月婷婷开心网 | 校园春色综合网 | 日本中文在线视频 | 国产精品6666 | 色婷婷狠狠爱 | 光明影院手机版在线观看免费 | 又粗又猛又爽又黄少妇视频网站 | www.jizzjizz.com| 成人激情在线观看 | wwyoujizzcom| 国产女主播喷水高潮网红在线 | 免费国产视频在线观看 | 特黄特色大片免费视频大全 | 日韩一二三区视频 | 欧美视频一二三 | 国产福利免费 | 韩日一区二区 | 综合色久 | 尤物在线免费观看 | 特高潮videossexhd| 精品一区二区三区四区视频 | 色很久| 欧美精品国产一区二区 | 狠狠的干狠狠的操 | 亚洲制服另类 | 极品人妻一区二区 | 亚洲精品一区在线观看 | 99精品久久99久久久久 | 国产一区二区视频在线观看免费 | 依人在线视频 | 日本中文字幕在线观看视频 | 四虎永久在线精品免费网址 | 日本精品网 | 夜夜天天干 | 国产白丝在线观看 |