【问题标题】:Call a function from a running process in C#在 C# 中从正在运行的进程调用函数
【发布时间】:2018-06-21 09:54:11
【问题描述】:
  1. 我有一个 C++ 程序在计算机上运行,​​无法更改 代码(但我可以看到源代码)。
  2. 现在,我想使用我的 C# 项目从这个正在运行的程序/进程中调用一些方法。
  3. C++ 程序在运行时更改其对象。所以导入dll是 在这种情况下没有帮助。

最佳做法是什么?是否有可能获得该进程(通过 Process.GetProcessesByName)并以某种方式在我的 c# 项目中调用它的函数?

【问题讨论】:

  • 我什至不知道这是否可能,但请注意,您很可能会通过在不知情的情况下乱序调用可执行文件的某些代码来破坏软件的内部状态- 定义的接口。
  • 是的,可以将自己注入另一个进程...您可以在进程空间中注入一个 dll,在该进程中创建一个远程线程并使该 dll 运行。然后 dll 可以“单独”运行,也可以从您的程序“直接”运行(通过进程间通信方法与其通信)。用 .NET 写这个 dll 是一件坏事,因为你必须在目标进程中带上所有的 .NET 运行时。
  • here 了解一些理论。
  • 如果你四处寻找“注入 c# 其他进程”,你会发现很多理论,很少实践。

标签: c# process dll-injection


【解决方案1】:

如果函数有 1 个参数,您可以使用 CreateRemoteThread() 并在 lpParameter 参数中传递单个参数来调用该函数。在 lpStartAddress 中传递函数的地址。

如果函数接受多个参数,则不能使用 CreateRemoteThread() 从外部调用它。

要获取函数的地址,您可以使用需要 pinvoke 的 GetProcAddress(),但这仅在函数被导出时才有效。

如果没有导出,可以硬编码逆向工程找到的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2011-02-03
    • 2013-03-10
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多