日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C#dll注入方法之介紹

事實(shí)上dll注入很簡(jiǎn)單,無(wú)非就是調(diào)用virtualAllocEx,WriteProcessMemory,OpenProcess,CreateRemoteThread等API函數(shù),因?yàn)槲沂菍W(xué)c#的,所以也想看一下c# dll注入這方面的文章,但在網(wǎng)上找了半天,沒(méi)有找到一篇,也許是c#剛興起的緣故,學(xué)c#的并不多,沒(méi)辦法,只好自己移植一下,因?yàn)榉彩怯玫紸PI函數(shù),所有的編程的語(yǔ)言都是相同的,這就為我們的移植帶來(lái)了方便,學(xué)c#的一般應(yīng)該對(duì)API的調(diào)用概念很淡,因?yàn)閏#通常不會(huì)去調(diào)用API函數(shù),因?yàn)檫@些已經(jīng)被封裝了,在vb,vc++等語(yǔ)言中要結(jié)束一個(gè)進(jìn)程,首先就必須要得到這個(gè)進(jìn)程的句柄,然后才能進(jìn)行相應(yīng)的關(guān)閉進(jìn)程等操作,得到句柄要用到OpenProcess API函數(shù),結(jié)束進(jìn)程要用到TerminateProcess API函數(shù),但是在c#中你根本不需要知道這些API函數(shù)就能完成同樣的功能,所以你要是想了解一下API的相關(guān)知識(shí),學(xué)一點(diǎn)vb是一個(gè)很好的選擇。好了!下面就開(kāi)始我們的c# dll注入之旅吧!

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供霍城企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、html5、小程序制作等業(yè)務(wù)。10年已為霍城眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

首先需要加入以下API函數(shù):

 
 
 
  1. [DllImport("kernel32.dll")]
  2. public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);
  3. [DllImport("kernel32.dll")]
  4. public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );
  5. [DllImport("kernel32.dll")]
  6. public static extern int GetProcAddress(int hwnd, string lpname);
  7. [DllImport("kernel32.dll")]
  8. public static extern int GetModuleHandleA(string name);
  9. [DllImport("kernel32.dll")]
  10. public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);

C#聲明API比較復(fù)雜,因?yàn)槭钦{(diào)用非托管的dll,所以要用到DllImport來(lái)調(diào)用非托管的dll,他還有很多屬性在這就不多說(shuō)了,網(wǎng)上有很介紹,可以去查一下,不過(guò)c#調(diào)用自身的變得動(dòng)態(tài)鏈接庫(kù)是倒是很方便,直接加個(gè)引用就ok了,調(diào)用dll要用的一個(gè)引用:using System.Runtime.InteropServices;這個(gè)不要忘了加上,下面是編好的所有代碼:

 
 
 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Runtime.InteropServices;
  9. using System.Diagnostics;
  10. namespace dllinject
  11. {
  12. public partial class Form1 : Form
  13. {
  14. [DllImport("kernel32.dll")] //聲明API函數(shù)
  15. public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);
  16. [DllImport("kernel32.dll")]
  17. public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );
  18. [DllImport("kernel32.dll")]
  19. public static extern int GetProcAddress(int hwnd, string lpname);
  20. [DllImport("kernel32.dll")]
  21. public static extern int GetModuleHandleA(string name);
  22. [DllImport("kernel32.dll")]
  23. public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);
  24. public Form1()
  25. {
  26. InitializeComponent();
  27. }
  28. private void button1_Click(object sender, EventArgs e)
  29. {
  30. int ok1;
  31. //int ok2;
  32. //int hwnd;
  33. int baseaddress;
  34. int temp=0;
  35. int hack;
  36. int yan;
  37. string dllname;
  38. dllname = "c:\\dll.dll";
  39. int dlllength;
  40. dlllength = dllname.Length + 1;
  41. Process[] pname = Process.GetProcesses(); //取得所有進(jìn)程
  42. foreach (Process name in pname) //遍歷進(jìn)程
  43. {
  44. //MessageBox.Show(name.ProcessName.ToLower());
  45. if (name.ProcessName.ToLower().IndexOf("notepad") != -1) //所示記事本,那么下面開(kāi)始注入
  46. {
  47. baseaddress = VirtualAllocEx(name.Handle, 0, dlllength , 4096, 4); //申請(qǐng)內(nèi)存空間
  48. if (baseaddress == 0) //返回0則操作失敗,下面都是
  49. {
  50. MessageBox.Show("申請(qǐng)內(nèi)存空間失敗?。?);
  51. Application.Exit();
  52. }
  53. ok1 = WriteProcessMemory(name.Handle, baseaddress, dllname, dlllength, temp); //寫(xiě)內(nèi)存
  54. if (ok1 == 0)
  55. {
  56. MessageBox.Show("寫(xiě)內(nèi)存失?。?!");
  57. Application.Exit();
  58. }
  59. hack = GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA"); //取得loadlibarary在kernek32.dll地址
  60. if (hack == 0)
  61. {
  62. MessageBox.Show("無(wú)法取得函數(shù)的入口點(diǎn)??!");
  63. Application.Exit();
  64. }
  65. yan = CreateRemoteThread(name.Handle, 0, 0, hack, baseaddress, 0, temp); //創(chuàng)建遠(yuǎn)程線(xiàn)程。
  66. if (yan == 0)
  67. {
  68. MessageBox.Show("創(chuàng)建遠(yuǎn)程線(xiàn)程失?。?!");
  69. Application.Exit();
  70. }
  71. else
  72. {
  73. MessageBox.Show("已成功注入dll!!");
  74. }
  75. }
  76. }
  77. }
  78. }

至此,我們的C# DLL注入之旅就圓滿(mǎn)結(jié)束了。


本文標(biāo)題:C#dll注入方法之介紹
網(wǎng)頁(yè)URL:http://m.5511xx.com/article/coidego.html