【干货】如何使用CE进行游戏逆向?12:调用游戏call

文摘   社会   2025-01-05 00:00   广西  
我们来谈一下什么是"call"以及为什么在编程中调用游戏 "call" 很重要。
你可能之前在各种论坛或者教程中经常听到一个概念,叫做 "找call",或者说关键 "call" 功能、"移动call" 等等各种 "call"。那到底什么叫 "call" 呢?"call" 实际上来自于英文单词 "call",它的意思是呼叫。
但在编程领域,我们一般把它称为函数调用,或者叫做调用函数。由于这套教程是完全面向初学者的,我假设大家没有什么编程经验,或者几乎没有编程经验,那么我们再来说一下什么叫做函数。
我写了一个简单的例子来说明,就是这个 "Add" 函数。它仅仅是把参数 A 和 B 进行相加,然后返回结果。简单来说,这就是一个加法函数。然后我们传递了参数 3 和 5 进去,大家都知道 3 + 5 = 8,对吧?所以这个函数的结果,也就是返回值,就是 8。当然,这个函数的返回值取决于你传递了什么样的参数进去。如果你传递了 4 和 5,那肯定就是 9;3 和 5 就是 8,对吧?
然后我们用一个变量 R 来接收这个函数的返回值。这样的话,当这一整行执行完毕以后,R 的值就是 8,然后我们把它输出出来,那肯定会打印出来一个 8。最后程序就结束了。
我们来看一下结果是不是如我们所想的一样?看到了吧,这里已经成功的输出了一个 8。好,刚才我们从简单的逻辑上看了一下什么叫做函数。实际上,函数就是帮我们做了一些事情,然后返回一个结果给我们,这就叫一个函数。
现在我们从汇编的角度上来理解一下什么叫做函数,以及什么叫做函数调用。我现在下了一个断点,他断在了这里。你不用看懂,我会给你讲一些比较重点的东西。
我们这里提供了两个参数,一个是 3,一个是 5。你在这里也可以看到,他把 5 放到了 EDX 里,把 3 放到了 ECX 里。如果你想详细地弄明白这里每一行的话,你需要了解调用约定。
但是对于初学者来说,这些细节可能有点复杂,所以我们不纠结这些细节了。重点在于这里可以看到一个 "call"。我们接着往下看。现在我的箭头指向这里,代表着我下一行要执行的代码就是这个 "call"。但是我现在先不执行,我们来观察一下我们的程序。
刚才是在这个位置,然后我们顺着一条一条往下执行的,对吧?这是我们程序正常的一个流程。但是当我们的 "call" 执行以后,我们看一下会发生怎样的事情。它跳转到了另一个位置。这一堆符号,在程序中实际上是不存在的,只不过因为我们这个程序是 debug 模式,所以它生成了一些额外的代码。然后我们再往下走。
他现在已经不是顺着刚才的那个位置了,对吧?他现在已经来到了一个完全完全和刚才不一样的位置。我们不管在里面做了什么,总之肯定就是一个加法,因为我们这边什么也没有做,就是把它进行一个相加,然后返回。我们不管他到底做了什么事,直接往下走,让他返回。
现在我们又来到了刚才那个位置,看到了吗?又是刚才这个 "call"。我们刚才是从这进去的,对吧?然后他这个函数执行完以后,又返回到了这个位置。我们刚才从这进去的,我们刚才从这个位置进去的。
我们从这个 "call" 进去的,对吧?然后呢,我们返回的时候返回到哪里?返回到了这个位置。说明什么?我们可以得出一个简单的结论:call 指令会把我们当前程序执行的流程跳转到另一个位置,执行完毕以后再返回到它下一条指令的位置,对吧?这就是 call 指令所做的事情。
那我们简单进行一个总结啊,call 是调用函数,会把当前程序的执行流程转移到被调用函数的位置,执行完毕以后再返回到 call 指令的下一条指令。当然了,这只是我个人的对于一个方便大家理解的总结啊。如果说你们想看最专业最权威的解释,可以去看英特尔白皮书第一卷的第八章,好像是。你们有兴趣的话可以去了解一下啊。
那好了,我们已经知道 call 是什么了,那么我们看一下为什么要调用 call。因为我们说了啊,call 是调用一个函数,所以说如果我们能够拿到游戏的一个函数地址的话,我们调用它是不是就可以实现直接去执行游戏的某个函数啊?比如说,游戏里面某个函数可以让我们获得 1 万块钱,那我们去执行它的话,是不是就相当于我们自己就多了 1 万块钱。
你可能会想,那我为什么不直接修改我的钱呢?对,那这种情况下,你可以直接修改你的钱。但是有一些功能你是没办法很好的通过直接修改的方式去达到的,或者说有些游戏你需要去攻击敌人,对不对?你攻击敌人的话,你有很多种方式,比如说模拟你鼠标键盘的操作,还有一种方式就是调用 call。
那它们有什么样的优劣呢?那模拟操作嘛,大家都知道就比较笨,比较机械。但是 call 呢,它是非常高效非常精确的。
这是我自己写的一个程序。如果我们想要攻击这个敌人的话,很显然我们可以通过鼠标点击的方式进行一个攻击,那既然可以通过鼠标点击相应的,我们马上就能想到,我们可以模拟鼠标进行一个操作。但是模拟鼠标有一个根本无法解决的问题是什么呢?如果说两个敌人靠得太近,比如说我明明要打这个人,但是有一个人完全重叠啊,这个好像不重叠啊。
这种情况下他们几个人挨得非常近的话,我通过模拟鼠标点击,比如说我明明想打后面那个人,但是模拟鼠标点击的话,是不是很容易就打到前面那个人了?那这种情况下是通过模拟点击完全没办法解决的一个问题。
但是如果说我们是调用游戏的 call,调用游戏这个攻击 call 的话,可以精确地设置到底是攻击哪一个人,并且百分之百是绝对不可能出现因为被挡住或者因为什么原因就错目标这种情况下是完全不可能出现的。看到了吧?我这边是精确地在打这个中间那个人啊。还有另外一种情况就是换肤。比如说换肤,大家都知道啊,这个换肤是没办法通过简单的修改一个数值来实现的,那就更不可能通过什么模拟之类的其他手段来实现。
你要换肤,那就只能去调用这个 call。这就是调用游戏 call 实现的啊。你要是通过数值或者是通过模拟,就根本没办法实现这些功能。很多强大的功能啊,我们往往都是需要通过去调用游戏的CALL来实现。


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