C#의 DLL 주입

13373 단어 dll
C# 중의 DLL 주입은 사실상 dll 주입은 매우 간단하다. 비주얼 AllocEx, Write Process Memory, Open Process,Create Remote Thread 등 API 함수를 호출하는 것이다. 나는 c#를 배웠기 때문에 c# 방면의 글을 보고 싶었지만 인터넷에서 한참 동안 찾았지만 한 편을 찾지 못했다. 아마도 c#가 유행하기 때문에 c#를 배운 것이 많지 않아서 어쩔 수 없이 스스로 이식할 수밖에 없다. 왜냐하면 API 함수를 사용하면모든 프로그래밍 언어는 똑같습니다. 이것은 우리의 이식에 편리함을 가져왔습니다. c#를 배우는 사람들은 일반적으로 API에 대한 호출 개념이 매우 희박해야 합니다. 왜냐하면 c#는 API 함수를 호출하지 않기 때문입니다. 이것은 봉인되어 있기 때문입니다. vb,vc++ 등 언어에서 하나의 프로세스를 끝내려면 먼저 이 프로세스의 핸들을 얻어야만 해당하는 프로세스를 닫는 등 조작을 할 수 있습니다. 핸들은 OpenProcess API 함수를 사용해야 합니다.프로세스를 끝내려면 Terminate Process API 함수를 사용해야 하지만 c#에서 이 API 함수들이 같은 기능을 완성할 수 있다는 것을 알 필요가 없기 때문에 API에 대한 지식을 알고 싶다면 vb를 배우는 것이 좋은 선택이다.됐다!다음은 우리의 c# dll 주입 여행을 시작하겠습니다!먼저 다음 API 함수를 포함해야 합니다.
          [DllImport("kernel32.dll")]
public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);
[DllImport("kernel32.dll")]
public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hwnd, string lpname);
[DllImport("kernel32.dll")]
public static extern int GetModuleHandleA(string name);
[DllImport("kernel32.dll")]
public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);

C#성명 API는 비교적 복잡하다. 비위탁 관리 dll을 호출하기 때문에 Dll Import를 사용하여 비위탁 관리 dll을 호출해야 한다. 그의 속성은 여기서 말할 필요가 없다. 인터넷에 소개가 많아서 찾아볼 수 있다. 그러나 c# 자신의 동적 링크 라이브러리를 호출하는 것은 매우 편리하다. 직접 인용을 추가하면 ok이다. dll을 호출할 때 사용할 인용은 using System이다.Runtime.InteropServices;이것은 덧붙이는 것을 잊지 마라. 다음은 만들어진 모든 코드이다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace dllinject
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll")] // API
public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);
[DllImport("kernel32.dll")]
public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hwnd, string lpname);
[DllImport("kernel32.dll")]
public static extern int GetModuleHandleA(string name);
[DllImport("kernel32.dll")]
public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
int ok1;
//int ok2;
//int hwnd;
int baseaddress;
int temp=0;
int hack;
int yan;
string dllname;
dllname = "c:\\dll.dll";
int dlllength;
dlllength = dllname.Length + 1;
Process[] pname = Process.GetProcesses(); //
foreach (Process name in pname) //
{
//MessageBox.Show(name.ProcessName.ToLower());
if (name.ProcessName.ToLower().IndexOf("notepad") != -1) //
{

baseaddress = VirtualAllocEx(name.Handle, 0, dlllength , 4096, 4); //
if (baseaddress == 0) // 0 ,
{
MessageBox.Show(" !!");
Application.Exit();
}
ok1 = WriteProcessMemory(name.Handle, baseaddress, dllname, dlllength, temp); //
if (ok1 == 0)
{

MessageBox.Show(" !!");
Application.Exit();
}
hack = GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA"); // loadlibarary kernek32.dll
if (hack == 0)
{
MessageBox.Show(" !!");
Application.Exit();
}
yan = CreateRemoteThread(name.Handle, 0, 0, hack, baseaddress, 0, temp); //
if (yan == 0)
{
MessageBox.Show(" !!");
Application.Exit();
}
else
{
MessageBox.Show(" dll!!");
}

}

}

}
}

좋은 웹페이지 즐겨찾기