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或许有帮助.
为了不打开大门,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通常被称为机器代码反编译器,它至少可以正确地识别代码与数据.