Posted on 2012-05-31 21:53
小明 阅读(2280)
评论(2) 编辑 收藏 引用 所属分类:
C/C++ 、
Debug
闲来无事,搞搞逆向工程分析一下三国群英2,今天的目标是去掉光盘提示,并让游戏正常进行。因为我玩的是原版,所以每当直接运行sango2.exe会弹出如下对话框:
我使用的工具是大名鼎鼎的OllyDBG。
首先,打开OD,打开sango2.exe, 运行程序,当出现对话框时暂时程序,发现停在此处:
仔细看以下几行代码,可以看出在40B207处有一个判断,如果EAX=0,则不显示对话框,并跳转到40B21F,那如果我们把B207的“JE SHORT 0040B21F”改为“JNE SHORT 0040B21F”,是否就可以不显示对话框呢?经测试,确实不显示了,但是游戏也直接退出了,并没有达到我们要的效果。看来这个地方只是出错后的程序处理,我们要找到更深的源头,才能解决这个问题。
上断点!我们要结合单步调试来理解程序的运行逻辑才能发现真正的解决方案。
观察对话框出现的时候,程序的堆栈如下:
发现这个函数的入口在40B00A,我们在此设置断点开始单步调试,会发现在调用4300F0出现对话框,跟踪进去。
用这样的方法跟踪进去,保持耐心和清醒的头脑,最终会发现4302C8会进行错误处理,导致对话框的出现,只要跳过即可。我们修改4302C1的代码为"JZ short 004302D1",即可跳过对话框,直接进行游戏。
最后一步,出补丁。使用右键功能【copy to executable】,然后另存为可执行文件就可以了。运行修改过后的sango2.exe,就会发现已经破解成功了。