2

我相对(阅读:愚蠢的新手)熟悉反汇编,但这有点难倒我:我有一组用 zlib 压缩的保存文件和一个加载它们的游戏。它们的结构是已知的,一旦加载,内存中的结构与它们对应的保存文件相同。问题是游戏是用一种倒退的、纯脚本语言编写的,不知何故设法不留下静态指针。完全没有。几十个人尝试过,看似静态的指针路径在同一台机器上进行微小更改后会中断。一个简单的解决方案是在进程的内存中搜索文件的内容,但这是一个非常暴力的解决方案,我宁愿避免出于教育目的。

问题:

  • 我正在尝试使用 OllyDBG。我对此很糟糕,但仍然设法制作了一些实际有效的微不足道的codecave。我是在使用正确的工具来完成这项工作还是我是一个愚蠢的新手?现代反向器的工具包中有哪些工具?
  • 在相关的说明中,我不得不求助于使用作弊引擎(或其表亲 MHS)进行内存搜索。这似乎有点违反直觉。OllyDBG 是否真的让您无法搜索值和优化结果,或者我错过了什么?
  • 如何在 WINAPI 上设置断点?见鬼,WINAPI 在汇编级别是什么样子的?这是我没有设法找到任何像样的信息的东西,我很确定谷歌有足够的信息,但我似乎无法输入正确的单词。
  • 扩展上述内容,如何设置动态断点?如果我对特定的、经常调用的函数感兴趣,但前提是此时 EAX 等于特定值,我将如何让 Olly(或其他任何东西)在这种情况下中断?
  • 任何关于反汇编或以破坏事物为导向的低级编程的一般书籍/建议/资源。

免责声明:有问题的游戏是免费软件,单人游戏,作者不反对,该项目旨在扩展功能。也是第一篇文章,希望我没有摸索太严重。:(

4

1 回答 1

4

你有很多问题合二为一。我会试着回答一些。

OllyDBG 是一个很好的免费反汇编程序。专业人士可能会为 IDA-Pro 付费,但这是一款昂贵的产品。

关于搜索内存,OllyDBG 确实提供了该功能。在任何内存转储窗口(例如,CPU 窗口的内存转储窗格)中,您可以: 右键单击​​,从上下文菜单中选择“搜索”,然后选择整数或二进制字符串。与作弊引擎不同,您无法使用 OllyDBG 搜索近似值。您可能会寻找一个可以执行此操作的插件,而不是我知道的。

我认为“WINAPI”可能是指 Win32 API。您正在查看的游戏中可能有一个名为 WINAPI 的组件。为了在各种 Windows API 上设置断点,这是游戏客户端扩展器喜欢做的事情,你会想知道实际的 Windows API 在哪里,可以这么说。这些功能并非都在一个“地方”。有多种 DLL 模块可以“导出”构成 Win32 API 的函数。例如,MessageBox()从 导出,USER32.DLL但从ExitProcess()导出KERNEL32.DLL

要在 OllyDBG 中的 Windows API 调用上设置断点,您可以: 查看菜单、可执行模块以查看内存中的所有模块。右键单击 USER32.DLL 模块并从上下文菜单中选择“查看名称”。在那里您将看到从 USER32 导出的所有函数。

如果游戏客户端是用 C 语言编写的,那么在所谓的“导入表”中就会有一个 API 函数列表。这可以在内存中加载的 .EXE 模块中找到,或者也可以在磁盘上的 EXE 文件中使用link /dump /imports.

在脚本语言的情况下,通常没有导入表,或者如果有导入表,它会导入大量可通过脚本引擎访问的功能。

不幸的是,我不认为 OllyDBG 支持条件断点。

Regarding where to begin learning disassembly, surely the best instruction is to utilize quite a bit of assembly on your own code. Even writing a Windows application which displays only a Message Box bearing "Hello World" will require you to learn about import tables in order to access the MessageBox() API. In fact, writing such an application in C could also be informative to you. However, I recommend you compile the code using only the command-line tools and not the GUI environment. The GUI will hide too much information from you and interfere with the learning. In order to access the USER32.DLL API, you will need to inform the linker that you wish to use the USER32.LIB 'import library' so your C code can transparently call MessageBox().

于 2009-10-13T21:28:34.593 回答