C# 控制子进程窗口
是否可以完全控制子进程?我没有子进程的来源。我需要查看并更改它的变量。如果是,我如何通过C#/C++?进行操作?如果是内存操作-例如:读取字节数据并将其写入另一个进程的内存空间,那么是的-如果父进程以足够的权限启动,则可以执行此操作。 作为管理员 对于更复杂的事情,比如调用子进程代码,您需要执行DLL注入之类的操作。作为开发中的一种安全措施,程序被设计为完全控制自己的代码空间,而其他应用程序则不能访问或调用外部应用程序中的方法。 保存供外部应用程序使用的公开API 为了读取和写入外部应用程序中的内存位置,可以在C中执行以下操作# 使用以下命令C# 控制子进程窗口,c#,c++,windows,child-process,C#,C++,Windows,Child Process,是否可以完全控制子进程?我没有子进程的来源。我需要查看并更改它的变量。如果是,我如何通过C#/C++?进行操作?如果是内存操作-例如:读取字节数据并将其写入另一个进程的内存空间,那么是的-如果父进程以足够的权限启动,则可以执行此操作。 作为管理员 对于更复杂的事情,比如调用子进程代码,您需要执行DLL注入之类的操作。作为开发中的一种安全措施,程序被设计为完全控制自己的代码空间,而其他应用程序则不能访问或调用外部应用程序中的方法。 保存供外部应用程序使用的公开API 为了读取和写入外部应用程序中的
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace MemoryManagement
{
public class Memory : IDisposable
{
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Boolean bInheritHandle, UInt32 dwProcessId);
[DllImport("kernel32.dll")]
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
byte[] lpBuffer, UIntPtr nSize, uint lpNumberOfBytesWritten);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);
public IntPtr Handle;
public Process ProcessHeld = null;
public Memory(string sprocess)
{
Process[] Processes = Process.GetProcessesByName(sprocess);
Process nProcess = Processes[0];
Handle = OpenProcess(0x10, false, (uint)nProcess.Id);
if (Handle != IntPtr.Zero)
{
ProcessLoaded = true;
ProcessHeld = nProcess;
}
else
{
ProcessLoaded = false;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
}
// Use C# destructor syntax for finalization code.
~Memory()
{
Dispose(false);
}
//Would use this method below - for the actual writing of the Disable Patch Code
public UIntPtr WriteByteArray(IntPtr hProcess, IntPtr BaseAddress, byte[] NewVal)
{
try
{
// Return Value
bool ReturnVal;
UIntPtr BytesWritten;
// Write Memory Byte Array
ReturnVal = WriteProcessMemory(hProcess, BaseAddress, NewVal, (uint)NewVal.Length, out BytesWritten);
return BytesWritten;
}
catch (Exception e)
{
return (UIntPtr)0x0;
}
}
public bool ProcessLoaded = false;
public string ReadString(uint pointer)
{
byte[] bytes = new byte[24];
ReadProcessMemory(Handle, (IntPtr)pointer, bytes, (UIntPtr)24, 0);
return Encoding.UTF8.GetString(bytes);
}
public string ReadString(uint pointer, int length)
{
byte[] bytes = new byte[length];
ReadProcessMemory(Handle, (IntPtr)pointer, bytes, (UIntPtr)length, 0);
return Encoding.UTF8.GetString(bytes);
}
public int ReadOffset(uint pointer, uint offset)
{
byte[] bytes = new byte[24];
uint adress = (uint)ReadPointer(pointer) + offset;
ReadProcessMemory(Handle, (IntPtr)adress, bytes, (UIntPtr)sizeof(int), 0);
return BitConverter.ToInt32(bytes, 0);
}
public int ReadPointer(uint pointer)
{
byte[] bytes = new byte[24];
ReadProcessMemory(Handle, (IntPtr)pointer, bytes, (UIntPtr)sizeof(int), 0);
return BitConverter.ToInt32(bytes, 0);
}
}
}
然后你可以使用
Memory mem = new Memory(Process.GetProcessByName("proc"));
string strVal = mem.ReadString(0x04443);
注意-我使用这个类从一个名为“无冬之夜”的游戏中读取一些内存。如果可以找到指向内存位置的指针,则可以将指针与ReadPointer方法一起使用
对于更复杂的DLL注入任务,我建议查找其中一个库
白魔法、黑魔法或灰魔法
DLL注入更为复杂,因为您需要对子进程中的结构有一个大致的了解。您需要使用像IDA这样的工具来检查程序方法调用和跳转等
在另一个开发人员的帮助下,我能够使用IDA和Whitemagic创建一个DLL注入负载,允许我在子进程中的新端口上打开一个新的TCPClient。基本上允许我向子进程添加自己的“onCommand”功能
我特别想让我的游戏服务器触发游戏客户端截图,然后自动上传到游戏服务器的facebook页面。
最后它运行正常,但有点复杂。类似作弊引擎的东西?我需要“动态”替换原始路径和其他一些数据,我不知道它使用的是哪个地址。应用程序必须自动运行,无需用户输入。在文件系统中创建快捷方式不是更容易吗?