assembly - 其中新手反汇编疑问

标签 assembly language-agnostic disassembly ollydbg

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

问题:

  • 我正在尝试使用 OllyDBG。我在这方面很糟糕,但仍然设法制作了一些实际有效的简单代码库。我是否使用了正确的工具来完成这项工作,或者我是一个愚蠢的新手?现代逆向者的工具包中有哪些工具?
  • 与此相关的是,我必须使用 Cheat Engine(或其同类 MHS)进行内存搜索。这似乎有点违反直觉。 OllyDBG 真的无法让您搜索值并优化结果吗?还是我遗漏了一些东西?
  • 如何在 WINAPI 上设置断点?天哪,WINAPI 在程序集级别看起来是什么样子?我还没有找到任何像样的信息,而且我很确定 Google 已经有足够多的信息了,但我似乎无法输入正确的单词。
  • 扩展上述内容,如何设置动态断点?如果我对一个特定的、经常被调用的函数感兴趣,但如果 EAX 在该点等于特定值,我将如何让 Olly(或其他任何东西)在该条件下中断?
  • 任何有关反汇编或面向破坏事物的低级编程的一般书籍/建议/资源。

免责声明:相关游戏是免费软件、单人游戏,作者并不反对,项目的目的是扩展功能。也是第一篇文章,希望我没有太笨拙。 :(

最佳答案

您有很多问题集中在一个问题上。我会尝试回答一些。

OllyDBG 是一个优秀的免费反汇编程序。专业人士可能会购买 IDA-Pro,但这是一种昂贵的产品。

关于搜索内存,OllyDBG 确实提供了该功能。在任何内存转储窗口(例如,CPU 窗口的内存转储 Pane )中,您可以:右键单击,从上下文菜单中选择“搜索”,然后选择“整数”或“二进制字符串”。与 Cheat Engine 不同,您无法使用 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 模块中找到,也可以使用 link /dump /imports 在磁盘上的 EXE 文件中查看。 .

对于脚本语言,通常没有导入表,或者即使有导入表,它也会导入可通过脚本引擎访问的大量功能。

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

关于从哪里开始学习反汇编,最好的指导无疑是在您自己的代码中使用大量汇编。即使编写仅显示带有“Hello World”的消息框的 Windows 应用程序,也需要您了解导入表才能访问 MessageBox() API。事实上,用 C 语言编写这样的应用程序也可以为您提供丰富的信息。但是,我建议您仅使用命令行工具而不是 GUI 环境来编译代码。 GUI 会对你隐藏太多信息并干扰学习。为了访问 USER32.DLL API,您需要通知链接器您希望使用 USER32.LIB“导入库”,以便您的 C 代码可以透明地调用 MessageBox() .

关于assembly - 其中新手反汇编疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1562918/

相关文章:

language-agnostic - 不要忽视小细节

multithreading - 为什么必须始终从 UI 线程创建/更新 UI 元素?

c - gdb调试整数打印信息

linux - 如何编译 Intel x86 汇编代码以获取十六进制转储?

C包含十六进制常量的文件

if-statement - 如果返回的话还应该省略下面的内容吗?

visual-studio - 如何理解Visual Studio的.pdb文件?

c - 为什么每次在 GDB 中构建 + 反汇编函数时都会得到相同的地址?

c++ - 为什么这个函数将 RAX 插入堆栈作为第一个操作?

assembly - 如何扩展 TASM 宏