将C#代码注入另一个进程并调用目标函数
我试图用代码注入来调用游戏函数.经过一番尝试后,我找到了一个能满足我想要的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. 现在我无法理解是什么意思
为什么文件路径为空? 编辑: 解决方法
为了不打开大门,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通常被称为机器代码反编译器,它至少可以正确地识别代码与数据. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |