【干货】如何使用CE进行游戏逆向?15:CE实用功能

文摘   社会   2025-01-08 00:00   广西  

本期教程的内容相当丰富,因为这是本系列教程的最后一篇教程。我们先来谈谈断点模块注入DLL,以及分配内存和创建线程等等,可能还有其他的,我文中会提及。

首先,我们来看看什么是断点。我们打开游戏,然后我随便找了一条代码。当我们按下F5或者点击那个红色的切换按钮时,它就会在这个位置设置一个断点。这样,当代码执行到这里时就会暂停。但是要确保代码会执行到这里,否则断点就不会触发。在这个过程中,我们可以看到所有寄存器的值,包括下一条指令要执行的位置,即EIP。

通过观察EIP,我们可以确定断点是在指令执行之前暂停的,这个地址是下一条指令要执行的位置。这提供了一个很好的机会,让我们能够观察到指令执行前的状态,这对于我们寻找机制非常有帮助。接下来,我们可以尝试一下这个方法,看看是否可行。如果可行,我们就可以利用这个机会。我们可以试试上节课讲的那个例子,看看是否能够根据指令执行前的状态找到正确的机制。这样,我们就能够更好地理解为什么之前的推测会出错。

接着,我们可以尝试找一条正确的路径,看看是否能够在指令执行前找到正确的结果。如果我们仔细观察,就能够发现哪些是正确的路径,哪些是错误的。这样,我们就能够更加准确地确定指令执行前和执行后的状态,从而更好地理解程序的行为。

接着我们来看下一个,推荐我们去找的地址是15bf1AE八。根据我们的分析,这个ex是我们需要关注的。在设置断点后,我们可以观察到计算器显示的ex值是161421B0。这和我们下面的正确推测一模一样,这说明了什么?说明断点可以帮助我们解决这种前后计算器一样的情况,我们可以利用这一点来找到机制。如果你对这一部分不理解,一定要结合上节课一起听,因为这节课我只是简单带过了。如果你还是不相信,我们可以尝试搜索一下这个值。看到了吧,我们已经找到了这个机制。而如果你直接使用他推测的结果去搜索的话,是找不到的。所以说,这个问题我们就解决了。算是一个上期教程的补充,因为上节课我录的时候忘了讲怎么解决这个问题了。
接下来,我们再来看看断点还有什么用处。比如说,你可以用它来分析程序的流程,想知道这一段代码都做了些什么事情?你光看寄存器的值是看不出来的。你需要看看它给寄存器传了什么样的值。比如说,在设置了断点后,你就可以看到,在这条指令执行之前,我的计算器是多少。然后这个异或操作之后,E3肯定是零,对吧?看到了吧?然后你可以继续分析,看看跳转是否发生,一步步地跟踪程序的执行流程。
当然,这部分可能对你来说比较费解,但这对于理解程序的运行过程是非常有用的。或者说,你想找一个call指令,我之前也说过找call是有什么用的。假设这个指令就是一个call,那么接下来你就可以观察当前ESP的值,看看堆栈里面的内容,了解这个call是传递了什么参数。这样,你就可以分析,在调用这个call的时候,应该传递什么样的参数。
第二个功能是枚举模块。这个功能的作用是让你在视图中找到一个枚举DL和符号的选项,点击后,会将进程中的所有模块,包括DL、EX等全部列出来,甚至还包括一些乱七八糟的SYS模块。那么这个有什么用呢?比如说,我们的游戏可能是基于open gl图形引擎的,你可以在这里看到open gl,说明游戏是基于这个引擎的。模块地址就是显示在这里,代表每个模块加载到进程中的位置。例如,AC client.exe加载到了地址40000004,后面跟着五个零。虽然AC client.exe的地址是518ucf,但实际上模块加载的地址是40000004。
关于模块加载的地址,需要注意的是,并不是所有的进程和模块都会加载到固定的地址上,这个涉及到的东西比较多,就不详细展开了,但要记住这一点,它真的不一定总是加载在固定的地址上。
接下来是注入DLL的功能。这个功能可以在C里面找到,它可以将一个DLL注入到进程中。比如说,你可以将一个自己写的DLL注入到进程中,就像C1中的启动加速器一样。虽然功能可能没有那么强大,但它确实可以用来注入DLL,你可以当做一个注入器使用。在进入游戏后,你会发现游戏变得飞快,这个是如何实现的,我打算写一期教程来详细讲解,不过不会放在这个CE系列教程里,感兴趣的话可以关注一下。
最后是分配内存和创建线程的功能。比如说,你找到了一个call,想测试一下参数是否分析正确,或者测试一下这个call是否正确,你就可以点击分配内存,分配一个默认大小的内存。
然后呢,他问你要不要去,你去了以后,就会得到一个新分配的内存,可读、可写、可执行的。在这个新分配的内存中,比方说,我给大家展示一下。我们把这个地址显示在下面,然后编辑器选择这个文本,我就选择"hello"。好了,现在我已经拿到了一个字符串的地址,是这个A80028。然后,我在这块内存中push了40,代表图标,然后push了0,这个是标题。
我们不需要标题,然后再push了一个A80028,再push了一个零,这个是窗口句柄。如果你听不懂没关系,我只是告诉你这个功能。然后调用call。好了,这块我们就写好了。这到底是在做什么呢?其实就是传递参数,对吧?传递了四个参数,然后调用了那个函数,调用完以后再进行一个返回。实际上,我们调用游戏call的时候,也是做几乎一模一样的事情,就是传递参数、调用call,然后返回。如果大家想学的话,我后面可能会出一些关于调用约定、堆栈等的教程,讲解更多的东西。
如果你不理解,可以先放一放,就看看效果。然后点击这个创建线程。好了,确定,这个时候可以看到,已经弹出了一个信息框,是来自我们游戏进程的,对吧?你可以看到,而且显示的正是我们写入的"hello",同时也弹出了我们预期的图标。最后一点是关于这个DBVM。
DBVM是个什么东西?它是一个为了解释更加准确的虚拟机,把你的操作系统跑在这个虚拟机上面,扩展了指令集,允许你在用户态去访问内核模式的一些东西,允许你重定向系统的一些事件,甚至接管中断,但是不用去修改IDT表。如果听不懂没关系,后面有更通俗易懂的解释。总的来说,DBVM让你调试游戏、修改游戏更加简单,就是这么一句话。
具体的体现就在于,你可以绕过很多游戏反作弊引擎的那种反调试手段。但是,并不意味着你开了这个DBVM,你就可以所向披靡了哈。因为就这么说吧,你作为一个小白,给你讲了以后,你也知道这件事情了,那你说那些反作弊的那些开发者,他们能不知道吗?就说一点啊,就你这个DBVM本身,他就已经被加到黑名单里了。
所以说,你如果说直接开DBVM,就开了DBVM,你就想简单的去绕过那些反作弊引擎,那你有点天真了哈。但是,他确实是出于这个目的设计的。那怎么开呢?在你的CE这里边有一个帮助帮助,这里边有一个关于这里边左下角,这里有一个我这啊,他写着你的系统支持DBVM。这就代表着你有可能能够成功开启,并不代表一定啊。
你在开之前你点一下这个,它会提醒你这个东西,你在开之前一定要保证你的电脑上,就是你现在运行着的,比方说你没写完的论文,你没剪完的视频,你没写完的程序,你没打完的游戏等等,你赶紧都存一下。我说的这个存,并不是说把你电脑上所有文件都保存一份啊,那个没必要,他不会说把你硬盘里的数据弄没,它顶多是让你蓝屏。
所以说你要把你运行在内存中的重要的东西赶紧保存一下,然后你OK然后点确定就OK了。如果说你运气好的话,就可以成功加载,然后我这边就不演示了哈。如果说你这显示一行红字,就说明你的电脑不支持。至于具体什么原因,那就再说吧。
总之,绿色有可能能够成功加载,然后红色是一定不可能成功加载的。那这节课就说这么多哈。重要的东西我已经就我个人感觉哈全部说完了。如果说有哪些还没讲呢,比较重要的我后续想起来了会补充。那么我们本系列CE入门教程就算到此为止了。


暮色的狐
这是一只高强度上网冲浪、高质量输出内容的狐狸。主打ACGN杂谈、技术干货分享、第九艺术鉴赏、网梗百科解析、情感树洞鸡汤、正能量价值观~
 最新文章