通用 C# DLL 注入器injector(注入dll不限)

  为了方便那些不懂或者不想用C++的同志,我把C++的dll注入器源码转换成了C#的,这是一个很简单实用的注入器,用到了CreateRemoteThread,WriteProcessMemory ,VirtualAllocEx这几个Api

 

  1 using System;
  2 using System.Diagnostics;
  3 using System.IO;
  4 using System.Runtime.InteropServices;
  5 using System.Text;
  6 
  7 namespace GijSoft.DllInjection
  8 {
  9     public enum DllInjectionResult
 10     {
 11         DllNotFound,
 12         GameProcessNotFound,
 13         InjectionFailed,
 14         Success
 15     }
 16 
 17     public sealed class DllInjector
 18     {
 19         static readonly IntPtr INTPTR_ZERO = (IntPtr)0;
 20 
 21         [DllImport("kernel32.dll", SetLastError = true)]
 22         static extern IntPtr OpenProcess(uint dwDesiredAccess, int bInheritHandle, uint dwProcessId);
 23 
 24         [DllImport("kernel32.dll", SetLastError = true)]
 25         static extern int CloseHandle(IntPtr hObject);
 26 
 27         [DllImport("kernel32.dll", SetLastError = true)]
 28         static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
 29 
 30         [DllImport("kernel32.dll", SetLastError = true)]
 31         static extern IntPtr GetModuleHandle(string lpModuleName);
 32 
 33         [DllImport("kernel32.dll", SetLastError = true)]
 34         static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, IntPtr dwSize, uint flAllocationType, uint flProtect);
 35 
 36         [DllImport("kernel32.dll", SetLastError = true)]
 37         static extern int WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] buffer, uint size, int lpNumberOfBytesWritten);
 38 
 39         [DllImport("kernel32.dll", SetLastError = true)]
 40         static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttribute, IntPtr dwStackSize, IntPtr lpStartAddress,
 41             IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
 42 
 43         static DllInjector _instance;
 44 
 45         public static DllInjector GetInstance
 46         {
 47             get
 48             {
 49                 if (_instance == null)
 50                 {
 51                     _instance = new DllInjector();
 52                 }
 53                 return _instance;
 54             }
 55         }
 56 
 57         DllInjector() { }
 58 
 59         public DllInjectionResult Inject(string sProcName, string sDllPath)
 60         {
 61             if (!File.Exists(sDllPath))
 62             {
 63                 return DllInjectionResult.DllNotFound;
 64             }
 65 
 66             uint _procId = 0;
 67 
 68             Process[] _procs = Process.GetProcesses();
 69             for (int i = 0; i < _procs.Length; i++)
 70             {
 71                 if (_procs[i].ProcessName == sProcName)
 72                 {
 73                     _procId = (uint)_procs[i].Id;
 74                     break;
 75                 }
 76             }
 77 
 78             if (_procId == 0)
 79             {
 80                 return DllInjectionResult.GameProcessNotFound;
 81             }
 82 
 83             if (!bInject(_procId, sDllPath))
 84             {
 85                 return DllInjectionResult.InjectionFailed;
 86             }
 87 
 88             return DllInjectionResult.Success;
 89         }
 90 
 91         bool bInject(uint pToBeInjected, string sDllPath)
 92         {
 93             IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 1, pToBeInjected);
 94 
 95             if (hndProc == INTPTR_ZERO)
 96             {
 97                 return false;
 98             }
 99 
100             IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
101 
102             if (lpLLAddress == INTPTR_ZERO)
103             {
104                 return false;
105             }
106 
107             IntPtr lpAddress = VirtualAllocEx(hndProc, (IntPtr)null, (IntPtr)sDllPath.Length, (0x1000 | 0x2000), 0X40);
108 
109             if (lpAddress == INTPTR_ZERO)
110             {
111                 return false;
112             }
113 
114             byte[] bytes = Encoding.ASCII.GetBytes(sDllPath);
115 
116             if (WriteProcessMemory(hndProc, lpAddress, bytes, (uint)bytes.Length, 0) == 0)
117             {
118                 return false;
119             }
120 
121             if (CreateRemoteThread(hndProc, (IntPtr)null, INTPTR_ZERO, lpLLAddress, lpAddress, 0, (IntPtr)null) == INTPTR_ZERO)
122             {
123                 return false;
124             }
125 
126             CloseHandle(hndProc);
127 
128             return true;
129         }
130     }
131 }

注意:使用时必须安装.netFramework

posted @ 2014-10-07 13:32  royalwong_real  阅读(7180)  评论(2编辑  收藏  举报