在C#中从外部进程弹出DLL

时间:2018-11-08 19:32:53

标签: c# dll-injection

所以。很抱歉要求提供源代码,但是在尝试进行一段时间后,我迷失了想法,并要求在世界上如何从c#的外部进程中弹出dll。因此,任何帮助将不胜感激。我尝试过的一些方法是远程线程,使用了整个地址。 顺便问一下,这是我的注入代码(如果有帮助的话)。

public static void Eject(string moduleName)
{
    Process[] ProcessList = System.Diagnostics.Process.GetProcessesByName(gamename);
    if (ProcessList.Length > 0)
    {
        Process MYPROCESS = ProcessList[0];
        IntPtr BaseAddress = IntPtr.Zero;
        foreach (System.Diagnostics.ProcessModule Module in MYPROCESS.Modules)
        {
            if (Module.ModuleName.Contains(moduleName))
                BaseAddress = Module.BaseAddress;
        }
        if (BaseAddress != IntPtr.Zero)
        {
            IntPtr libaddy = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
            CreateRemoteThread(procHandle, IntPtr.Zero, 0, libaddy, BaseAddress, 0, IntPtr.Zero);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

DLL弹出有很多警告。如果安装了钩子或代码正在执行,则将导致问题。如果DLL只坐在那儿什么也不做,那么您就不会有任何问题。

  1. 获取模块基地址,它将用作句柄
  2. VirtuaAllocEx获取用于在其中写入模块句柄的内存
  3. GetProcAddress获取FreeLibrary的地址
  4. CreateRemoteThread调用FreeLibrary,将句柄的地址作为参数传递

此代码可能并不完美,但是应该有99%的优势:

public static IntPtr GetModuleBaseAddress(Process proc, string modName)
{
    IntPtr addr = IntPtr.Zero;

    foreach (ProcessModule m in proc.Modules)
    {
        if (m.ModuleName == modName)
        {
            addr = m.BaseAddress;
            break;
        }
    }
    return addr;
}

IntPtr moduleAddress = GetModuleBaseAddress(proc, "modname");

IntPtr loc = VirtualAllocEx(proc.Handle, IntPtr.Zero, 4, AllocationType.Commit | AllocationType.Reserve, MemoryProtection.ReadWrite);

IntPtr bytesRead = IntPtr.Zero;

bool result = WriteProcessMemory(proc.Handle, loc, moduleAddress.ToInt32(), 4, out bytesRead);

if (!result || bytesRead.Equals(0))
{
    return false;
}

IntPtr freelibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "FreeLibrary");

IntPtr hThread = CreateRemoteThread(proc.Handle, IntPtr.Zero, 0, freelibraryAddr, loc, 0, out _);