通用 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

时间: 2024-10-16 20:27:18

通用 C# DLL 注入器injector(注入dll不限)的相关文章

如何创建DLL,以及注入DLL

为了防止忘记,特记下 DLL的创建,在VS2017中选择dll的创建 // dllmain.cpp : Defines the entry point for the DLL application. #include "stdafx.h" #include <Windows.h> #include <stdio.h> HMODULE thisModule; HHOOK hook; LRESULT CALLBACK LaunchListener(int nCod

远程线程注入dll

// CommonInject.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <WinUser.h> #include <WinDef.h> #include <iostream> #include <Tlhelp32.h> using namespa

创建进程时注入DLL

#include "stdafx.h" #include <Windows.h> // 函数声明 typedef BOOL (WINAPI* Proc_CreateProcessW)(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInherit

注入 - 远线程注入DLL到目标进程

// // 函数 -- void InjectDLL(LPCTSTR) // // 功能 -- 注入DLL到指定窗口 // // @param -- 要注入的DLL全路径 // // 返回值 -- 无 // void InjectDLL(LPCTSTR lpDLLFullPath) { DWORD dwPID = 0; // 目标进程PID HANDLE hGameProcess = NULL; // 目标进程句柄 LPDWORD lpdwAddr = NULL; // 远程申请的内存空间地址

SetThreadContext注入DLL

注入DLL的方式有很多 R3就有远程线程CreateRemoteThread.SetWindowsHookEx.QueueUserApc.SetThreadContext R0可以参考sudami大神的思路 关于本文32位下参考 http://bbs.pediy.com/showthread.php?t=181174&highlight=setthreadContext+dll+%E6%B3%A8%E5%85%A5 言归正传 大体思路就是 我们先打开目标进程,枚举目标线程采用的是系统快照的方式,

Windows x86/ x64 Ring3层注入Dll总结

0x01.前言 提到Dll的注入,立马能够想到的方法就有很多,比如利用远程线程.Apc等等,这里我对Ring3层的Dll注入学习做一个总结吧. 我把注入的方法分成六类,分别是:1.创建新线程.2.设置线程上下背景文,修改寄存器.3.插入Apc队列.4.修改注册表.5.挂钩窗口消息.6.远程手动实现LoadLibrary. 那么下面就开始学习之旅吧! 0x02.预备工作 在涉及到注入的程序中,提升程序的权限自然是必不可少的,这里我提供了两个封装的函数,都可以用于提权.第一个是通过权限令牌来调整权限

远程创建线程注入DLL

HANDLE WINAPI CreateRemoteThread(__in HANDLE hProcess,__in LPSECURITY_ATTRIBUTES lpThreadAttributes,__in SIZE_T dwStackSize,__in LPTHREAD_START_ROUTINE lpStartAddress,__in LPVOID lpParameter,__in DWORD dwCreationFlags,__out LPDWORD lpThreadId);hProce

【windows核心编程】使用远程线程注入DLL

前言 该技术是指通过在[目标进程]中创建一个[远程线程]来达到注入的目的. 创建的[远程线程]函数为LoadLibrary, 线程函数的参数为DLL名字, 想要做的工作在DLL中编写.  示意图如下:  相关API 1.创建远程线程 //该函数除了第一个参数为目标进程句柄外 //其他参数均和CreateThread一样 HANDLE hThread = CreateRemoteThread( __in HANDLE hProcess, //目标进程句柄 __in_opt LPSECURITY_A

N种内核注入DLL的思路及实现

内核注入,技术古老但很实用.现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中.可能有部分人会说:"都进内核了.什么不能干?".是啊,要是内核中可以做包括R3上所有能做的事,软件开发商们也没必要做应用程序了.有时,我们确实需要R3程序去干驱动做起来很困难或者没必要驱动中去做的事,进程 /  DLL是不错的选择,但进程目标太大,所以更多的同学趋向于注DLL.     若要开发安全软件.小型工具,可借鉴其思路,Anti Rootkits时,在某些极端情况下,可使用同