加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:37:56 所属栏目:百科 来源:网络整理
导读:我试图用代码注入来调用游戏函数.经过一番尝试后,我找到了一个能满足我想要的dll. 所以我用ILSpy看到了这个DLL但却无法理解代码. class Module{[SecurityCritical,SuppressUnmanagedCodeSecurity] [DllImport("",CallingConvention = CallingConvention.This
我试图用代码注入来调用游戏函数.经过一番尝试后,我找到了一个能满足我想要的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#代码注入目标应用程序,并在目标中使用c dll和bootstrap .net.

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

[DllImport(“”,
SetLastError = true)]

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

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

解决方法

为了不打开大门,C#语言没有参与生成这个程序集.您正在看到C/C++LI项目的输出.混合模式程序集,它包含MSIL和本机代码.您将使用File>生成类似的程序集.新>项目> Visual C> CLR>班级图书馆.

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读