使用C#調用系統API實現記憶體注入的代碼

來源:互聯網
上載者:User

複製代碼 代碼如下://首先匯入命名空間
using System.Runtime.InteropServices;
/// <summary>
/// 在指定進程的虛擬位址空間中保留或開闢一段地區..除非MEM_RESET被使用,否則將該記憶體地區初始化為0.
/// </summary>
/// <param name="process">需要在其中分配空間的進程的控制代碼.這個控制代碼必須擁有PROCESS_VM_OPERATION存取權限</param>
/// <param name="pAddress">想要擷取的地址地區.一般用NULL自動分配</param>
/// <param name="size">要分配的記憶體大小.位元組單位.注意實際分 配的記憶體大小是頁記憶體大小的整數倍</param>
/// <param name="type">記憶體配置的類型</param>
/// <param name="protect">記憶體頁保護</param>
/// <returns>執行成功就返回分配記憶體的首地址,失敗返回0。</returns>
[DllImport("kernel32.dll")] //聲明API函數
public static extern int VirtualAllocEx(IntPtr process, int pAddress, int size, int type, int protect);
/// <summary>
/// 寫入某一進程的記憶體地區。入口區必須可以訪問,否則操作將失敗
/// </summary>
/// <param name="process">進程控制代碼</param>
/// <param name="baseAddress">要寫的記憶體首地址</param>
/// <param name="buffer">指向要寫的資料的指標(資料當前存放地址)。</param>
/// <param name="nSize">要寫入的位元組數。</param>
/// <param name="lpNumberOfBytesWritten">實際資料的長度</param>
/// <returns>非零表示成功,零表示失敗</returns>
[DllImport("kernel32.dll")]
public static extern int WriteProcessMemory(IntPtr process, int baseAddress, string buffer, int nSize, int lpNumberOfBytesWritten);
/// <summary>
/// 檢索指定的動態連結程式庫(DLL)中的輸出庫函數地址
/// </summary>
/// <param name="hModule"> DLL模組控制代碼 包含此函數的DLL模組的控制代碼。LoadLibrary或者GetModuleHandle函數可以返回此控制代碼。</param>
/// <param name="lpProcName">函數名 包含函數名的以NULL結尾的字串,或者指定函數的序數值。如果此參數是一個序數值,它必須在一個字的底位元組,高位元組必須為0。</param>
/// <returns>調用成功,返回DLL中的輸出函數地址,調用失敗,返回0。得到進一步的錯誤資訊,調用函數GetLastError。</returns>
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hModule, string lpProcName);
/// <summary>
/// 擷取一個應用程式或動態連結程式庫的模組控制代碼
/// </summary>
/// <param name="moduleName">指定模組名,這通常是與模組的檔案名稱相同的一個名字</param>
/// <returns>如執行成功成功,則返回模組控制代碼。零表示失敗</returns>
[DllImport("kernel32.dll")]
public static extern int GetModuleHandleA(string moduleName);
/// <summary>
/// 建立一個在其它進程地址空間中啟動並執行線程(也稱:建立遠程線程).
/// </summary>
/// <param name="process">目標進程的控制代碼</param>
/// <param name="threadAttributes">指向線程的安全描述結構體的指標,一般設定為0,表示使用預設的安全層級</param>
/// <param name="stackSize">線程堆棧大小,一般設定為0,表示使用預設的大小,一般為1M</param>
/// <param name="startAddress">線程函數的地址</param>
/// <param name="parameter">傳給線程函數的參數</param>
/// <param name="creationFlags">線程的建立方式(0表示線程建立後立即運行 CREATE_SUSPENDED 0x00000004以掛起方式建立 建立不會運行,直到調用 ResumeThread函數)</param>
/// <param name="threadid">指向所建立線程控制代碼的指標,如果建立失敗,該參數為0</param>
/// <returns>如果調用成功,返回新線程控制代碼,失敗返回0</returns>
[DllImport("kernel32.dll")]
public static extern int CreateRemoteThread(IntPtr process, int threadAttributes, int stackSize, int startAddress, int parameter, int creationFlags, int threadid);

複製代碼 代碼如下:/// <summary>
/// 根據進程名稱擷取進程
/// </summary>
/// <param name="ProcessName">進程名稱</param>
/// <returns></returns>
public Process GetProcessByName(string ProcessName)
{
//取得所有進程
Process[] pname = Process.GetProcesses();
//遍曆進程
foreach (Process name in pname)
{
//如果尋找到進程名稱 返回
if (name.ProcessName.ToLower().IndexOf(ProcessName) != -1)
return name;
}
return null;
}

複製代碼 代碼如下:public void killDll()
{
string dllName = "c:\\text.dll";
int dlllength = dllName.Length + 1;
//這裡以記事本為例
Process processName = GetProcessByName("notepad");
//如果尋找到記事本進程,那麼下面開始注入
if (processName != null)
{
//申請記憶體空間,執行成功就返回分配記憶體的首地址,不成功就是0。
int baseaddress = VirtualAllocEx(processName.Handle, 0, dlllength, 4096, 4);
if (baseaddress == 0)
{
MessageBox.Show("申請記憶體空間失敗!");
return;
}
//寫記憶體
int result = WriteProcessMemory(processName.Handle, baseaddress, dllName, dlllength, 0);
if (result == 0)
{
MessageBox.Show("寫記憶體失敗!");
return;
}
//取得loadlibarary在kernek32.dll地址
int procAddress = GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA");
if (procAddress == 0)
{
MessageBox.Show("無法取得函數的進入點!");
return;
}
//建立遠程線程。
result = CreateRemoteThread(processName.Handle, 0, 0, 0, baseaddress, 0, 0);
if (result == 0)
{
MessageBox.Show("建立遠程線程失敗!");
return;
}
else
MessageBox.Show("已成功注入dll!");
}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.