我相对(阅读:愚蠢的新手)熟悉反汇编,但这有点难过我: 我有一组用zlib压缩的保存文件和一个加载它们的游戏。它们的结构是已知的,一旦加载,内存中的结构与其相应的保存文件相同。问题在于游戏是用一种ass向后编写的,只能编写脚本的语言,以某种方式设法不留静态指针。完全没有。几十个人尝试过,看似静态的指针路径会在同一台机器上发生微小变化后中断。一个简单的解决方案是只搜索进程的内存以查找文件的内容,但这是一个非常强大的解决方案,我宁愿避免用于教育目的。
问题:
免责声明:有问题的游戏是免费软件,单人游戏,作者不反对,项目旨在扩展功能而不是任何东西。也是第一篇文章,希望我没有弄错。 :(
答案 0 :(得分:4)
你有很多问题集于一身。我会尝试回答一些问题。
OllyDBG是一款优秀的免费反汇编程序。专业人士可能会为IDA-Pro付费,但这是一种昂贵的产品。
关于搜索内存,OllyDBG确实提供了该功能。在任何内存转储窗口(例如,CPU窗口的内存转储窗格)中,您可以:右键单击,从上下文菜单中选择“搜索”,然后选择“整数”或“二进制字符串”。与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()
。