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

使用C#調用系統(tǒng)API實現(xiàn)內存注入的代碼

 更新時間:2011年06月27日 21:49:40   作者:  
使用C#調用系統(tǒng)API實現(xiàn)內存注入的代碼,學習c#的朋友可以參考下。
復制代碼 代碼如下:

//首先導入命名空間
using System.Runtime.InteropServices;
/// <summary>
/// 在指定進程的虛擬地址空間中保留或開辟一段區(qū)域..除非MEM_RESET被使用,否則將該內存區(qū)域初始化為0.
/// </summary>
/// <param name="process">需要在其中分配空間的進程的句柄.這個句柄必須擁有PROCESS_VM_OPERATION訪問權限</param>
/// <param name="pAddress">想要獲取的地址區(qū)域.一般用NULL自動分配</param>
/// <param name="size">要分配的內存大小.字節(jié)單位.注意實際分 配的內存大小是頁內存大小的整數(shù)倍</param>
/// <param name="type">內存分配的類型</param>
/// <param name="protect">內存頁保護</param>
/// <returns>執(zhí)行成功就返回分配內存的首地址,失敗返回0。</returns>
[DllImport("kernel32.dll")] //聲明API函數(shù)
public static extern int VirtualAllocEx(IntPtr process, int pAddress, int size, int type, int protect);
/// <summary>
/// 寫入某一進程的內存區(qū)域。入口區(qū)必須可以訪問,否則操作將失敗
/// </summary>
/// <param name="process">進程句柄</param>
/// <param name="baseAddress">要寫的內存首地址</param>
/// <param name="buffer">指向要寫的數(shù)據(jù)的指針(數(shù)據(jù)當前存放地址)。</param>
/// <param name="nSize">要寫入的字節(jié)數(shù)。</param>
/// <param name="lpNumberOfBytesWritten">實際數(shù)據(jù)的長度</param>
/// <returns>非零表示成功,零表示失敗</returns>
[DllImport("kernel32.dll")]
public static extern int WriteProcessMemory(IntPtr process, int baseAddress, string buffer, int nSize, int lpNumberOfBytesWritten);
/// <summary>
/// 檢索指定的動態(tài)鏈接庫(DLL)中的輸出庫函數(shù)地址
/// </summary>
/// <param name="hModule"> DLL模塊句柄 包含此函數(shù)的DLL模塊的句柄。LoadLibrary或者GetModuleHandle函數(shù)可以返回此句柄。</param>
/// <param name="lpProcName">函數(shù)名 包含函數(shù)名的以NULL結尾的字符串,或者指定函數(shù)的序數(shù)值。如果此參數(shù)是一個序數(shù)值,它必須在一個字的底字節(jié),高字節(jié)必須為0。</param>
/// <returns>調用成功,返回DLL中的輸出函數(shù)地址,調用失敗,返回0。得到進一步的錯誤信息,調用函數(shù)GetLastError。</returns>
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hModule, string lpProcName);
/// <summary>
/// 獲取一個應用程序或動態(tài)鏈接庫的模塊句柄
/// </summary>
/// <param name="moduleName">指定模塊名,這通常是與模塊的文件名相同的一個名字</param>
/// <returns>如執(zhí)行成功成功,則返回模塊句柄。零表示失敗</returns>
[DllImport("kernel32.dll")]
public static extern int GetModuleHandleA(string moduleName);
/// <summary>
/// 創(chuàng)建一個在其它進程地址空間中運行的線程(也稱:創(chuàng)建遠程線程).
/// </summary>
/// <param name="process">目標進程的句柄</param>
/// <param name="threadAttributes">指向線程的安全描述結構體的指針,一般設置為0,表示使用默認的安全級別</param>
/// <param name="stackSize">線程堆棧大小,一般設置為0,表示使用默認的大小,一般為1M</param>
/// <param name="startAddress">線程函數(shù)的地址</param>
/// <param name="parameter">傳給線程函數(shù)的參數(shù)</param>
/// <param name="creationFlags">線程的創(chuàng)建方式(0表示線程創(chuàng)建后立即運行 CREATE_SUSPENDED 0x00000004以掛起方式創(chuàng)建 創(chuàng)建不會運行,直到調用 ResumeThread函數(shù))</param>
/// <param name="threadid">指向所創(chuàng)建線程句柄的指針,如果創(chuàng)建失敗,該參數(shù)為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>
/// 根據(jù)進程名稱獲取進程
/// </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)
{
//申請內存空間,執(zhí)行成功就返回分配內存的首地址,不成功就是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("無法取得函數(shù)的入口點!");
return;
}
//創(chuàng)建遠程線程。
result = CreateRemoteThread(processName.Handle, 0, 0, 0, baseaddress, 0, 0);
if (result == 0)
{
MessageBox.Show("創(chuàng)建遠程線程失??!");
return;
}
else
MessageBox.Show("已成功注入dll!");
}
}

相關文章

  • C#學習筆記整理_變量等基礎語法(必看篇)

    C#學習筆記整理_變量等基礎語法(必看篇)

    下面小編就為大家?guī)硪黄狢#學習筆記整理_變量等基礎語法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C#使用Region對圖形區(qū)域構造和填充的方法

    C#使用Region對圖形區(qū)域構造和填充的方法

    這篇文章主要介紹了C#使用Region對圖形區(qū)域構造和填充的方法,實例分析了Region類圖形操作的相關技巧,需要的朋友可以參考下
    2015-06-06
  • AnyChat的視頻會議程序實例詳解

    AnyChat的視頻會議程序實例詳解

    AnyChat是一款跨平臺的音視頻解決方案。通過本篇文章給大家介紹AnyChat的視頻會議程序,涉及到anychat相關知識,對anychat視頻會議相關知識感興趣的朋友一起學習吧
    2016-01-01
  • C#加解密之AES算法的實現(xiàn)

    C#加解密之AES算法的實現(xiàn)

    一般我們來說呢,對于加密,我們分為可逆和不可逆。可逆加密又可分為對稱加密(AES、DES等)和非對稱加密(RSA),還有就是一些編碼加密等(BASE64);不可逆的呢,大部分又都稱為摘要算法(MD5、SHA)。本文將用C#實現(xiàn)AES算法,需要的可以參考一下
    2022-08-08
  • C#中方括號[]的語法及作用介紹

    C#中方括號[]的語法及作用介紹

    C#中方括號[]可用于數(shù)組,索引、屬性,更重要的是用于外部DLL類庫的引用。
    2013-04-04
  • 關于C#線程的全面解析

    關于C#線程的全面解析

    這篇文章主要介紹了關于C#線程的全面解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 使用C#和OpenXML讀取大型Excel文件

    使用C#和OpenXML讀取大型Excel文件

    OpenXML 是辦公文檔(Word、Excel、PowerPoint)的開放標準,允許以編程方式操作這些文檔,本文主要介紹了C#如何利用OpenXML讀取大型Excel文件,感興趣的可以了解下
    2024-11-11
  • 詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用

    詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用

    這篇文章主要介紹了詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用,需要的朋友可以參考下
    2017-06-06
  • 解決unity rotate旋轉物體 限制物體旋轉角度的大坑

    解決unity rotate旋轉物體 限制物體旋轉角度的大坑

    這篇文章主要介紹了解決unity rotate旋轉物體 限制物體旋轉角度的大坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#9.0推出的4個新特性介紹

    C#9.0推出的4個新特性介紹

    這篇文章介紹了C#9.0推出的4個新特性,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02

最新評論

凤庆县| 屯昌县| 三都| 邹城市| 甘洛县| 轮台县| 宜兰市| 中宁县| 岗巴县| 峨眉山市| 平利县| 临洮县| 隆昌县| 平舆县| 嵊州市| 岫岩| 阿拉善右旗| 怀安县| 晋城| 奇台县| 崇州市| 长岭县| 宕昌县| 万盛区| 扎兰屯市| 武功县| 汉沽区| 伊川县| 马公市| 泰顺县| 商丘市| 乐业县| 桑日县| 顺义区| 额济纳旗| 江油市| 达拉特旗| 舞阳县| 博爱县| 云安县| 喜德县|