我正在尝试使用代码注入调用游戏函数。经过一番尝试后,我发现了一个能达到我想要的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(&#34;&#34;,CallingConvention = CallingConvention.ThisCall, SetLastError = true)]
为什么文件路径为空? dll如何管理类和函数调用?我的意思是程序员使用什么技术?
编辑: 我想要了解的图书馆名称是Elobuddy可能有帮助。
答案 0 :(得分:7)
试图不打开一扇门,C#语言没有参与生成这个程序集。您正在看到C ++ / CLI项目的输出。 混合模式程序集,它包含MSIL和本机代码。您使用File&gt;生成类似的程序集新&gt;项目&gt; Visual C ++&gt; CLR&gt;班级图书馆。
作者可能赞成它来解决CLR注入问题。无法将纯托管DLL注入另一个进程,必须首先加载并初始化CLR,然后才能执行任何托管代码。需要反向pinvoke(本机代码调用托管代码)的鸡与蛋问题与[DllImport]的反义词相反。 C ++ / CLI使这很容易,我在this answer中描述了这种技术。 Unmanaged Exports实用程序很受欢迎(谷歌DllExport),这是一个使用与C ++ / CLI相同的技术的程序集重写器。
但作者还希望使用原生C ++代码来实现游戏黑客攻击。他使用的是纯本机DLL,它包含GetHealth()函数和AttackableUnit类定义。这个DLL由OS加载器隐式加载,就像DLL通常一样,这是[DllImport]属性的空字符串足够好的原因。否则,编译器无法知道哪个DLL具有此本机代码,在链接器运行并使用本机DLL的导入库之前,该代码不会被整理出来。
C ++ / CLI编译器有点过分,为代码中的纯本机构造发出元数据。但是最好让它们尽可能地像他们管理的等价物一样。请注意它是非常不完整的,例如,您不能看到AttackableUnit C ++类成员的名称。您将在程序集中找到 lot 的其他spew,许多CRT声明也会将其转换为元数据。本机链接器没有做好隐藏它的工作。主要是因为它没有必要,这段代码很好地被隔离到内部<Module>
类中。
通常不可能将GetHealth等本机函数的机器代码反编译回原始C ++代码。特别是内置于编译器后端的优化器做了一个非常棒的工作,几乎无法猜出原始代码可能是什么样子。 Hex-Rays通常被称为机器代码反编译器,它至少可以正确地识别代码与数据。