2017-02-23 24 views
3

我想用代码注入调用游戏函数。经过一些尝试后,我发现一个dll做了我想要的。注入C#代码到另一个进程并调用目标函数

所以我看到与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和引导程序.net目标。

现在我不明白什么是

函数[DllImport( “”,CallingConvention = CallingConvention.ThisCall, SetLastError =真)]的含义

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

编辑: 我试图理解的图书馆的名字是Elobuddy也许有帮助。

+0

chcek该dll文件丢失或不是 –

+0

它的一个字符串,我不认为空字符串是缺少DLL。我认为它必须针对注入的应用程序的DLL。 –

+0

如果你想破解健康或金钱等变量,你可以尝试[记忆黑客](http://www.cheatengine.org)或[.net反射](https://www.codeproject.com/Articles/17269/Reflection-in-C-Tutorial)如果你想调用方法。 –

回答

7

尽量不要在开放的门中踢,C#语言不参与生成此程序集。您正在看到C++/CLI项目的输出。 A 混合模式程序集,它包含MSIL和本机代码。您可以使用File> New> Project> Visual C++> CLR> Class Library生成一个类似的程序集。

作者可能倾向于解决CLR注入问题。无法将纯托管DLL注入到另一个进程中,CLR必须先加载并初始化才能执行任何托管代码。需要反向拼写(本地代码调用托管代码)的鸡与蛋问题与[DllImport]所做的相反。 C++/CLI使得这很容易,我在this answer中描述了这种技术。 Unmanaged Exports实用程序非常流行(google DllExport),它是一种使用C++/CLI使用的相同技术的程序集重写器。

但作者还希望使用本机C++代码来实现游戏破解。他使用纯原生DLL,它包含GetHealth()函数和AttackableUnit类定义。这个DLL由OS加载器隐式加载,就像DLL通常那样,[DllImport]属性的空字符串足够好。否则,编译器无法知道哪个DLL具有此本机代码,直到链接器运行并使用本机DLL的导入库才会被排序。

C++/CLI编译器在代码中的纯原生构造中有点过分发射元数据。但尽力让它们看起来尽可能地像他们的托管等价物一样。请注意它非常不完整,你不能看到AttackableUnit C++类的成员的名字。你会在程序集中发现一个lot,很多CRT声明也会将它放入元数据中。本地链接器不会做出隐藏它的出色工作。主要是因为它不需要,这个代码与内部<Module>类很好地隔离。

将原始函数(如GetHealth)的机器代码反编译回原始的C++代码通常是不可能的。尤其是内置于编译器后端的优化器做了一件非常棒的工作,使得它几乎无法猜测原始代码的样子。 Hex-Rays通常被称为机器代码反编译器,它至少可以正确识别代码和数据。