将C#代码注入另一个进程并调用目标函数

Mam*_*d R 3 .net c# unmanaged dllimport code-injection

我试图用代码注入来调用游戏函数.经过一番尝试后,我找到了一个能满足我想要的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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

似乎dll将c#代码注入目标应用程序,目标是c ++ dll和bootstrap .net.

现在我无法理解是什么意思

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

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

编辑:我想要了解的图书馆名称是Elobuddy或许有帮助.

Han*_*ant 7

为了不打开大门,C#语言没有参与生成这个程序集.您正在看到C++/CLI项目的输出.甲混合模式组件,它包含两MSIL和本机代码.您将使用文件>新建>项目> Visual C++> CLR>类库生成类似的程序集.

作者可能赞成它来解决CLR注入问题.无法将纯托管DLL注入另一个进程,必须首先加载并初始化CLR,然后才能执行任何托管代码.需要反向pinvoke(本机代码调用托管代码)的鸡与蛋问题与[DllImport]的反义词相反.C++/CLI使这很容易,我在这个答案中描述了这个技术.非托管导出实用程序很受欢迎(谷歌DllExport),这是一个使用与C++/CLI相同的技术的程序集重写器.

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

C++/CLI编译器有点过分,为代码中的纯本机构造发出元数据.但是最好让它们尽可能地像他们管理的等价物一样.请注意它是非常不完整的,例如,您不能看到AttackableUnit C++类成员的名称.你会在程序集中发现很多其他的spw,很多CRT声明也会把它变成元数据.本机链接器没有做好隐藏它的工作.主要是因为它没有必要,这个代码很好地被隔离到内部<Module>类中.

通常不可能将GetHealth等本机函数的机器代码反编译回原始C++代码.特别是内置于编译器后端的优化器做了一个非常棒的工作,几乎无法猜出原始代码可能是什么样子.Hex-Rays通常被称为机器代码反编译器,它至少可以正确地识别代码与数据.