美高梅娱乐4858.com[转载]给网游写一个悬挂吧(二) – 启动外挂上

数据库:MySQL。

被网游写一个挂吧(二) – 启动外挂上 

 

面前的稿子为网游写一个挂吧 – 反反外挂驱动之让,我们曾足以拜游戏之内存之后,接下需要:

1.         找到游戏里要因素的偏移量,比如生命值的内存的职务。一般的话,大部分重型3D游戏还是为此C++编写的,游戏里的因素还是面向对象的,比如玩家是一个目标,那么生命值、魔法值之类的东西还是者目标的一个性质。按照C++的内存布局,一般的话,只要源代码里之结构体不发生变化,属性之偏移量一般的话还是平等的。

2.         找到游戏里有的要函数的地点,便于外挂程序来调用。

 

觅关键因素的偏移量和第一函数地址一般的话都是搬运工活,当然为是智力生活,需要你的逆向工程水平对,网上有些相关的课程,这里我便不再详述了。

 

这边而我们都找到游戏的偏移量了,现在的题材是安启动外挂以操控游戏,一般的话出几栽选择:

1.         要么是外悬挂,将悬挂注入到网游进程的内存空间里,这样挂就一定给网游自己的一个组件,对戏经过具有绝对的访问权,可以读写游戏之虚拟内存地址和调用游戏内置的函数。这种做法的弊端是,如果打有伪组件检测线程的话,很有或于发觉。

2.         要么是外挂,将挂作为一个独门的历程,这样挂得由此Read/WriteVirtualMemory来读写戏之内存,再经过CreateRemoteThread
API启动一个远道线程来调用游戏内置的函数。这种做法得以查看文章:代码注入的老三栽方式。

 

那么本文我们讲解第一种办法 – 内挂。并对两款游戏来说说流内挂的点子:

 

DNF – 使用输入法注入技术

输入法注入技术的原理是,写一个输入法DLL并于系统中登记,然后向游戏发送一个切换输入法的音 – 当然是切换到我们描绘的输入法,Windows会加载我们的输入法DLL,在斯DLL的DllMain函数里,我们便可成功部分内挂加载以及初始化的办事:

1.         首先写一个输入法DLL,随便从网上下载一个示范用之输入法源码即可。

2.         在输入法DLL的DllMain函数的DLL_PROCESS_ATTACH事件被,启动外挂线程。

3.         在单独的外挂进程里 – 一般的话这进程就之所以来让外挂用户操作的一个Windows
GUI程序,在适宜的地方:

a)         用imm32.dll里之ImmInstallIMEw
API函数在网里登记我们的输入法。

b)         用FindWindows
API查找到有需要注入的窗口,这里就是是赢得DNF的窗口句柄。

c)         最后用PostMessage
WM_INPUTLANGCHANGEREQUEST消息强迫Windows针对DNF窗口切换我们的输入法,从而达到加载内悬挂的目的。

 

重点代码如下 – 整个程序大部分代码都是因此C#成功,稍后介绍选用C#的原因:

 

输入法注入代码C#部分:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

public bool InjectDllToWindow(string dllPath, string windowText = "地下城与勇士",

string classText = "地下城与勇士",bool IfMonitor=true)

{

    InjectedDll = dllPath;

    WindowText = windowText;

    ClassText = classText;

 

    // 1, 注册输入法

    HKL = RegisterIME();

    if (HKL == IntPtr.Zero)

    {

        MessageBox.Show(string.Format("GetLastError: {0}", GetLastError()));

        //2,如果注册失败,检查是否已经被注册

        HKL = MImeFindByName();

    }

 

    if (HKL == IntPtr.Zero)

    {

        isRegister = false;

        return false;

    }

    isRegister = true;

 

    //3,把需要注入的dll传递给服务输入法dll中

    IMESetPubString(dllPath, 0, 0, 0, 0);

 

    //4,查找所有需要注入的窗口

    List<IntPtr> windowsToInject = FindWindows(classText, windowText);

 

    //5,注入输入法到窗口

    foreach (IntPtr window in windowsToInject)

    {

        InjectToWindow(window);

    }

 

    WindowsHaveInjected = windowsToInject;

 

    if(IfMonitor)

    {

    //6,开启监视线程,监视新的窗口,一旦开启,立刻注入

        WorkThread thread = new WorkThread(MonitorDNFWindow);

        workThreadAsyncResult = thread.BeginInvoke(null, null);

    }

    return true;

}

 

private IntPtr RegisterIME()

{

    string tempDir = Environment.CurrentDirectory;

    Environment.CurrentDirectory = Environment.SystemDirectory;//把工作目录切换到系统目录

    IntPtr hkl = ImmInstallIMEW(ImeName, ImeFriendlyName); //安装服务输入法

    Environment.CurrentDirectory=tempDir; //切换回原目录

    return hkl;

}

 

private void InjectToWindow(IntPtr hWnd)

{

    PostMessage(hWnd, WM_INPUTLANGCHANGEREQUEST, (IntPtr)0x01, HKL);

}

 

以上头第9执行调用47 –
54实施的函数,将外挂的办事目录切换到系统目录,因为我们拿输入法放到系统目录,方便系统查找,并安装输入法。

 

第25行里,设置以输入法注入成功后,需要实行之操作,一般的话就是开行挂了。有些内挂会在流成功后,注册一个快捷键,通过快捷键呼出一个窗口,这个窗口可据此来与用户操作界面通信,执行操作界面来的一声令下。然而,在某些游戏里,呼出的窗口会及时给检查及,我们这里拿介绍在耍经过里开动.NET程序,启动一个.NET
Remoting服务的道。

 

第31 –
34推行,通过FindWindows系统调用枚举系统上的窗口,找到对象窗口,执行注入操作,具体的注入操作参见56

59实践之代码。在.NET代码里调用C/C++函数的法子,请参见文章:应用Signature
Tool自动生成P/Invoke调用Windows
API的C#函数声明。

 

输入法C++部分重中之重代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)

{

   switch(fdwReason)

    {

      case DLL_PROCESS_ATTACH:

    if (CilentDLL==NULL)

    {

          if (lstrlen(g_IMEDLLString)>0)

          {

              StartTheDotNetRuntime();

          }

    }

          break;

      case DLL_THREAD_ATTACH:

         break;

      case DLL_THREAD_DETACH:

         break;

      case DLL_PROCESS_DETACH:

        break;

      default:

        break;

    }

    return true;

}

 

DWORD CALLBACK StartTheDotNetRuntime(LPVOID lp)

{

        HRESULT hr = S_OK;

        ICLRMetaHost    *m_pMetaHost = NULL;

        ICLRRuntimeInfo *m_pRuntimeInfo = NULL;

        ICLRRuntimeHost    *pClrHost = NULL;

      

hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*) &m_pMetaHost);

if (hr != S_OK)

    return hr;

hr = m_pMetaHost->GetRuntime (L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID*) &m_pRuntimeInfo);

if (hr != S_OK)

    return hr;

hr = m_pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID*) &pClrHost );

       if (FAILED(hr)) return hr;

 

    hr = pClrHost->Start();

 

    DWORD dwRet = 0;

    hr = pClrHost->ExecuteInDefaultAppDomain(

        g_IMEDLLString,

        _T("ManagedDll.Program"), _T("Start"), _T("nothing to post"), &dwRet);

 

    hr = pClrHost->Stop();

 

    pClrHost->Release();

 

    return S_OK;

}

 

每当第10行代码,输入法注入成功后以娱乐过程里开始动.NET虚拟机,这里启动之4.0的周转库 – 参看36尽代码,虚拟机成功启动后,会回到一个ICLRRuntimeHost的COM接口,根据此接口,外挂就可以创建托管代码运行需要之应用程序域 – 参看45

47履行。在应用程序域里执行代码并不需要一个.exe底可执行文件,只待是一个托管程序的DLL文件,这个DLL文件需要在游戏之目里,因为咱们的悬挂是运行在游戏之经过里,工作目录也当成了玩的行事目录了。

 

在47实行,我们得以视,可以指定DLL内部任意一个档的静态函数作为入口点,下面是ManagedDll.Program.Start的源代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

namespace ManagedDll

{

     public class Program

    {

        static int Start(string argument)

        {

            RemotingServer.Start();

            while (true)

            {

                Thread.Sleep(1000);

            }

            return 0;

        }

    }

}

 

于第7履,我们启动了一个.NET Remoting服务(或者说是web服务,因为.NET
Web服务自就是根据Remoting的),等待任意一个地方的Remoting客户端链接……对于以非托管进程中启动托管程序的章程,详情请参见:以托管dll注入及非托管进程中。

 

统筹勘察

 

之所以选用C#的由来是:

1.         可以便捷编程,而且产生加上的类库。

2.         垃圾回收机制好增长挂的安定团结,而且为毫不考虑内存泄露的问题。

3.         有死强劲的调节工具,以我更来拘禁,暂时还尚未看比较VS更强硬的调节工具。

4.         最后,在戏过程里的内挂和外部供用户配置的GUI程序需要通信,没有比.NET
Remoting更有益的事物了!

 

 

终极使大家对调剂技术感兴趣的话,可以考虑买本人之新书: 应用程序调试技术,这套视频除了教学调试之艺外,还尽量完整地讲解了科普下的技能,这是以调试技术和好的话,需要根基功与背景知识扎实才实施。

 

未完待续……

 

付出环境单纯需要同光服务器(可以错过京东找),做CVS(好吧你可能好SVN或者别的东东别喷Agent`K)、部署测试环境、

操作系统:CentOS(Linux,免费)

还有点碎时间,说几句子手机网游服务器的软硬件配置吧,比较简略。

布置Bug管理系统等。

就这样多吧。

 

硬件服务器:机房提供购买、租赁各品牌服务器的劳动,价格好去IDC的网站查阅吧。

上述是业内服务器部署环境。

程序运行环境:Java(开发进度快,程序员相比C、C++好找,这个一般欲单独开文章讨论)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注