所以。很抱歉要求提供源代码,但是在尝试进行一段时间后,我迷失了想法,并要求在世界上如何从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);
}
}
}
答案 0 :(得分:0)
DLL弹出有很多警告。如果安装了钩子或代码正在执行,则将导致问题。如果DLL只坐在那儿什么也不做,那么您就不会有任何问题。
此代码可能并不完美,但是应该有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 _);