在C#程序中注入惡意DLL的方法詳解_第1頁
在C#程序中注入惡意DLL的方法詳解_第2頁
在C#程序中注入惡意DLL的方法詳解_第3頁
在C#程序中注入惡意DLL的方法詳解_第4頁
在C#程序中注入惡意DLL的方法詳解_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第在C#程序中注入惡意DLL的方法詳解目錄一、背景二、實現(xiàn)原理1.基本思路2.案例演示3.自定義注入三:總結(jié)

一、背景

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

二、實現(xiàn)原理

1.基本思路

WinDbg在附加進(jìn)程的時候,會注入一個線程到C#進(jìn)程中,注入成功后,會執(zhí)行一個DbgBreakPoint()函數(shù),其實就是int3,這時候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命令可以看到最上面是一個int3中斷,截圖如下:

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

3.自定義注入

有了自定義注入的想法,接下來的實現(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)建完畢,接下來就用Win32API的CreateRemoteThread()實現(xiàn)遠(yuǎn)程注入,但注入之前需要做三件事情。

獲取C#程序的進(jìn)程句柄。在C#進(jìn)程中申請一塊內(nèi)存空間,存放加載的path路徑。調(diào)用LoadLibraryW函數(shù)在C#進(jìn)程中實現(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,

(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é)

這就是對Win

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論