OllyDBG - 游戏黑客

逆向工程 调试 游戏黑客
2021-07-07 21:05:27

我正在尝试逆转名为 Assault Cube 的游戏,我将在其中进行游戏黑客攻击。虽然我对 asm 完全没有理论理解,但我使用 Ollydbg 来反转。我只是关注在线视频,只是猜测和玩耍,看看我得到了什么结果。

反正我是通过放置断点找到了 gun 功能。现在我想看看里面找到自动射击并且没有后坐力。为了找到那些我只是一一nop,看看它是如何影响的。但是我有一个问题,我还附上了一张图片供你们参考。当我没有地址并且它似乎成功地给出了我需要的结果时,例如自动射击并且没有后座力。但是当我在 Visual Studio 中编写我的 hack 并应用 nops 时,编译并运行。游戏会崩溃。这是因为我不知道如何确定函数的正确开始和结束是什么,虽然 nopp 一组地址仍然给了我我的结果,但是编译时它会崩溃。

长话短说,我怎么知道函数的确切开始和结束,即使 nopping 给出的结果让你认为你找到了它,但一旦编译,你最终会发现它是正确的位置,但不是完全正确的开始/结束。我希望你明白我的意思。请看我附上的图片。谢谢。 在此处输入图片说明

2个回答

在我看来,您的问题是 VS 中的代码,而不是您通过逆向发现的问题。根据您要执行的操作,该函数的开头似乎无关紧要。如果我错了,请纠正我,但在我看来,您认为您必须找到到达函数开头的方法,这样您才能弄清楚需要在函数中进行多远才能更改您的内容想改变。

鉴于您的经验水平,这是可以理解的思路。(如果这就是您的想法,那就是;我正在假设要基于此做出答复。)

首先,幸运的是,您想要做的很容易(相对而言),因为您要做的就是直接更改字节。鉴于此,您通常需要做的是找到对存储感兴趣的字节/指令的内存地址的直接引用。让我们分解一下这对您意味着什么。

查看您在屏幕截图中突出显示的行:

00463716 75 09 JNZ SHORT ac_clien.00463721

00463716:这是一个内存地址。这是存储您感兴趣的字节的地方。这是您希望在您的程序中找到自己的方式的地方。

75 09 JNZ SHORT ac_clien.00463721 :75 09JNZ SHORT ac_clien.00463721是一回事。字节75 09, 是十六进制的。它们是 CPU 理解的二进制序列的简明表示。为什么不直接显示二进制数而不是十六进制数?好吧,让我们来看看什么75 09的二进制为:111010100001001

现在想象在 OllyDbg 中看到该列中的所有二进制,而不是十六进制。它不仅笨拙,而且通过一些说明,这些数字会在行中占用大量的空间。此外,作为人类读者,您更容易了解byte 75 的含义,而不是 bits 1110101,后者是 CPU 最终理解的内容。

您看到的英文组装说明 ( JNZ SHORT ac_clien.00463721) 是为了让我们能够轻松阅读说明的进一步提炼。你看到了,你知道它说“如果没有设置零标志,跳转到内存地址 ac_clien.00463721 的一小段距离”。

因此,就我们在这里使用的指令而言,位1110101与十六进制相同的值75JNZ. 它们只是表示同一事物的不同方式,主要是为了我们,所以我们不必尝试读取一堆 1 和 0。

牢记这一点,您知道更改JNZJMP会为您提供自动武器开火。因此,您的程序需要找到存储该字节的内存地址(根据屏幕截图,该地址为463716,但可能会在重新启动时更改)。然后你的程序需要写一个你想要的新字节。JMP在这种情况下,您想要的字节EB.

现在您拥有编写应用程序所需的一切。这是我的帮助停止和您的外部研究开始的地方,因为现在您处于正向工程的领域(逆向工程过程已完成)。您是否正在尝试使用 C、C++、Visual C++、C# 或其他语言编写您的 hack 代码?您选择的语言将直接告知您以编程方式查找游戏进程、打开它、查找其基地址,然后将您的字节写入正确的偏移量所采用的方法。

其中“X”是您选择的编程语言,诸如“我如何在 X 中找到游戏或程序的基地址”之类的问题;《如何在X中找到游戏或程序的进程ID》;“我如何将字节写入 X 中的内存地址”等应该引导您走上正确的道路。

最后,由于您正在攻击 Assault Cube,我建议您在 Guided Hacking 论坛上注册并在那里进行查询。多年来,他们专门使用该游戏作为他们无数教程的目标,并且有很多非常有经验的程序员可以帮助您完成基础知识,包括了解您甚至不知道要问的所有事情关于现在。

希望有帮助!

重要说明:专有产品的逆向工程可能是法律问题,请确保您对此有所了解。

关于你的问题:

  1. 下载 IDA 免费 7.0 https://www.hex-rays.com/products/ida/support/download_freeware.shtml
  2. 在 IDA 中加载您尝试在 Olly 中调试的二进制文件,然后转到您在图片上看到的特定地址。[例如按G并输入0x463016]
  3. 让我们希望它没有被混淆和/或应用其他技术 - 你会发现自己在 jnz 指令附近的地址
  4. 如果尚未进入该功能[您应该会在一些白色立方体中看到说明],然后按 Space 按钮切换到图形模式。
  5. 向上滚动到函数的开头 - 这里有你的地址 [将光标放在第一条指令上并再次按 Space 切换回反汇编模式] - 这将是函数开始

  6. 有多种方法可以从屏幕截图上的位置到达函数末尾

    6.1 在图形模式下向下滚动到 ret 指令[可以有多个!] - 这将是函数的结尾[或者也可能有多个函数通过 call 或 jmp 指令退出]

    6.2 另一种了解函数结束的方法是 Olly 中的 Ctrl + F9 [如果我没记错的话] - 它会在第一次重试时中断。

    6.3 这里描述了另一个选项:跳转回调用者

如果你真的想重新学习 - 与调试器一起学习一些反汇编工具,这将帮助你理解逻辑:)

祝你好运。

DL