【问题标题】:inject C# code to another process and call target functions将 C# 代码注入另一个进程并调用目标函数
【发布时间】:2017-04-13 18:40:58
【问题描述】:

我正在尝试通过代码注入调用游戏功能。经过一番尝试,我找到了一个可以满足我要求的 dll。

所以我看到了带有 ILSpy 的 dll,但无法理解代码。

class <Module>
{
[SecurityCritical, SuppressUnmanagedCodeSecurity]
    [DllImport("", CallingConvention = CallingConvention.ThisCall, SetLastError = true)]
    [MethodImpl(MethodImplOptions.Unmanaged)]
    internal unsafe static extern float* GetHealth(AttackableUnit*); 
}
--------------------------
namespace Native
{
    [NativeCppClass]
    [StructLayout(LayoutKind.Sequential, Size = 1)]
    internal struct AttackableUnit
    {
    }
}
---------------------
public unsafe float MaxHealth
        {
            get
            {
                Native.AttackableUnit* ptr = (Native.AttackableUnit*)base.GetPtr();
                if (ptr != null)
                {
                    return *<Module>.Native.AttackableUnit.GetMaxHealth(ptr);
                }
                return 0f;
            }
        }

似乎 dll 在目标中使用 c++ dll 和引导 .net 将 c# 代码注入目标应用程序。

现在我不明白是什么意思

[DllImport("", CallingConvention = CallingConvention.ThisCall, SetLastError = true)]

为什么文件路径是空的? dll如何管理类和函数调用?我的意思是程序员使用什么技术?

编辑: 我想了解的图书馆名称是 Elobuddy 可能会有所帮助。

【问题讨论】:

  • 检查 dll 文件是否丢失
  • 它是一个字符串,我不认为空字符串是因为缺少 dll。我认为它必须针对注入的应用程序 dll。
  • 如果您想破解健康或金钱等变量,如果您想调用方法,可以尝试a memory hacker.net reflection
  • 看起来您选择的库是 C++\cli 程序集。
  • 你能解释更多吗?

标签: c# .net code-injection dllimport unmanaged


【解决方案1】:

尽量不打开一扇敞开的门,C# 语言并未参与生成此程序集。您将看到 C++/CLI 项目的输出。 混合模式程序集,它包含 MSIL 和本机代码。您将使用 File > New > Project > Visual C++ > CLR > Class Library 生成类似的程序集。

作者可能喜欢它来解决 CLR 注入问题。不可能将纯托管 DLL 注入另一个进程,必须首先加载和初始化 CLR,然后才能执行任何托管代码。一个鸡与蛋的问题,需要与 [DllImport] 所做的相反的反向调用(本机代码调用托管代码)。 C++/CLI 使这变得非常简单,我在this answer 中描述了该技术。 Unmanaged Exports 实用程序很受欢迎(google DllExport),它是一种程序集重写器,它使用与 C++/CLI 相同的技术。

但作者也想使用原生 C++ 代码来实现游戏破解。他使用的是纯原生 DLL,它包含 GetHealth() 函数和 AttackableUnit 类定义。此 DLL 由 OS 加载程序隐式加载,就像 DLL 通常是一样,[DllImport] 属性的空字符串就足够了的原因。否则,编译器无法知道哪个 DLL 具有此本机代码,直到链接器运行并使用本机 DLL 的导入库时才会对其进行排序。

C++/CLI 编译器为代码中的纯本机构造发出元数据有点过火。但尽最大努力使它们看起来尽可能像托管的等效项。请注意它非常不完整,例如,您无法看到 AttackableUnit C++ 类的成员的名称。您会在程序集中发现 很多 的其他内容,许多 CRT 声明也将其放入元数据中。本机链接器在隐藏它方面做得并不好。主要是因为它不是必须的,所以这段代码很好地隔离在内部 &lt;Module&gt; 类中。

通常不可能将 GetHealth 等本机函数的机器代码反编译回原始 C++ 代码。尤其是编译器后端内置的优化器做得非常好,几乎不可能猜测原始代码的样子。 Hex-Rays 通常被称为机器代码反编译器,它至少可以正确识别代码与数据。

【讨论】:

    猜你喜欢
    • 2012-01-01
    • 2013-03-23
    • 2013-02-25
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多