染成茜色的坂道破解技术内幕之内功提高篇,成为真正的程序员
使用OllyICE打开染红
我的版本是染红1.00 版
先认识我们这个武器
OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。
我使用的是OllyICE 是爱好者继续开发的,可以在Vista下使用,都有汉化版,迅雷可以下载
本文说明:
OllyICE 中除了主菜单以外的所有菜单都是用鼠标右键调出,没有写主菜单的菜单都是右键菜单,每个窗口所调出右键菜单是不一样的,一般默认就是所讲的那个窗口,反正就那么几个窗口。。。。
软件中文帮助 http://bbs.pediy.com/showthread.php?s=&threadid=8899
上篇文章说我们要修改API函数,可以用断点方式
问题是一个软件调用API函数可能有N处地方,而在反汇编中,无法进行字符串查找的
怎么办?
如果 Windows API 函数使用了参考资源串,OllyDbg 可以显示它。
打开akane.exe,可以看到CPU 窗口,最大化以后可以看到有4个部分(注意哦,很多时候只有最大化窗口才可以看到4个部分,CPU 窗口通过主菜单查看,点击工具栏 上的 C 开启)
左上方 是反汇编窗口,右上方可以查看寄存器
左下方是堆 右下方是栈
学过编程都应该知道:
一般函数参数放在栈中,数据一般放堆中
先 选择主菜单 查看-〉可执行模块或者点击工具栏 上的 E (executable modules)
一个软件有很多模块,有些是系统自己的
我们看到有这么几个模块:
C:/Windows/system32/msvcrt.dll
可以认定,这个软件用VC++搞得 7.0 说明是2003 版
在可执行模块窗口中 要选择 akane.exe (鼠标双击)
这样可以保证等候我们开工的是染红而不是其他东西
虽然可以查看其它模块内容,对于染红汉化没有必要兴师动众
菜单选择如图所示内容
然后 菜单 选择排序 按地址
找到 名称为GDI32.CreateFontIndirectA函数
选择如图菜单
然后可以开始运行程序(主菜单 调试-〉运行)
程序在我们希望的地方停下来
说明:不同的机器 不同的操作 地址会不一样,但方法是相同的
汇编是靠地址传入参数
如图
04E1DAF4 90 01 00 00 00 00 00 80 00 00 00 00 82 6C 82 72 ?.....€....俵俽
04E1DB04 20 83 53 83 56 83 62 83 4E 00 00 僑僔僢僋......
80就是我们要修改的区位,俵俽僑僔僢僋 是种字体。用EmEditor可以转回日文编码看到这个字体叫MSゴシック
好,在80 上菜单,选择 编辑二进制,改为86
可是很糟糕,似乎每显示一个字都会改回80。。。。。
怎么回事?
修改过游戏的朋友就知道,金山游侠之类软件找出 地址可能有几个,修改其中一个地址不一定能成功,因为那个不一定是真正地址
怎么办?
这里靠大家分析了
大师发现 很多call dword ptr [<&GDI32.CreateFontInd> 上方有这么一条语句00404778 . 8D73 58 lea esi, dword ptr [ebx+58]
0040477B . 8DBC24 A80000>lea edi, dword ptr [esp+A8]
00404782 . F3:A5 rep movs dword ptr es:[edi], dword p>
00404784 . 0FAF8424 AC00>imul eax, dword ptr [esp+AC]
0040478C . 0FAF9424 A800>imul edx, dword ptr [esp+A8]
00404794 . 899424 A80000>mov dword ptr [esp+A8], edx
0040479B . 99 cdq
0040479C . 2BC2 sub eax, edx
0040479E . D1F8 sar eax, 1
004047A0 . 898424 AC0000>mov dword ptr [esp+AC], eax
004047A7 . 8D8424 A80000>lea eax, dword ptr [esp+A8]
004047AE . 50 push eax ; /pLogfont
004047AF . FF15 60604800 call dword ptr [<&GDI32.CreateFontInd>; /CreateFontIndirectA
00404782 . F3:A5 rep movs dword ptr es:[edi], dword p>
这条语句是干什么用的呢?
查查书,是用来进行字符串操作的,说白了就是 拷贝字符串的(类似语句上篇文章讲过)
可能就是 大BOSS-〉小BOSS
然后由小BOSS 负责输出
我们同时看到下面有这么一个提示:(要设置断点,不要忘记了,在那条语句上菜单断点,或者F2 键)
Ds:[esi]=[004A5AA4]
真是太方便了,大家不用学什么变址操作 就可以搞定了
马上去堆窗口,菜单 转到 004A5AA4 (回忆刚才理论,为什么要去堆?不去栈?)
哈哈哈 最终BOSS 找到了 就在
004A5AA4
XOXO 最终BOSS以后,我们发现游戏出现乱码
很明显 修改有效
初战告捷
但是初战不代表成功,为什么了呢?
我想你也不希望每次启动Debug 吧?
我们要永远 搞定染红
怎么办?
大师发现,即使你 重新启动游戏(在 主菜单-〉调试)
最终BOSS的地址不会变!
好
咱们先 主菜单-〉查看-〉断点,然后删去所有断点 ,把无关的去掉
在最终BOSS
004A5AA4 00 00 00 00 00 00 00 00 00 00 00 00 90 01 00 00 ............?..
004A5AB4 00 00 00 80 00 00 00 00 82 6C 82 72 20 83 53 83 ...€....俵俽 僑?
004A5AC4 56 83 62 83 4E 00 00 00 00 00 00 00 00 00 00 00 V僢僋...........
那个80 那里 菜单 断点-〉内存写入,这个类似金山游侠一样 只有修改内存咱就暂停,研究
而接下来这个阶段就很 很痛苦
大师是一条一条看 (调试菜单),看了好几个晚上。。。。
不要忘记选择重新启动游戏(在 主菜单-〉调试-〉重新启动)
大家用内存断点会很快的
终于找出 修改区位的家伙
00402550 . 56 push esi
00402551 . 57 push edi
00402552 . 8BF1 mov esi, ecx
00402554 . E8 77970000 call 0040BCD0
00402559 . 33C0 xor eax, eax
0040255B . B9 2C000000 mov ecx, 2C
00402560 . 8BFE mov edi, esi
00402562 . F3:AB rep stos dword ptr es:[edi]
00402564 . 8B46 5C mov eax, dword ptr [esi+5C]
00402567 . 85C0 test eax, eax
00402569 . B9 18000000 mov ecx, 18
0040256E . 894E 58 mov dword ptr [esi+58], ecx
00402571 C646 6F 80 mov byte ptr [esi+6F], 80
00402575 . C786 9C000000>mov dword ptr [esi+9C], 2
0040257F . 898E A0000000 mov dword ptr [esi+A0], ecx
00402585 . 75 02 jnz short 00402589
00402587 . 8BC1 mov eax, ecx
00402589 > 8986 A4000000 mov dword ptr [esi+A4], eax
0040258F . 5F pop edi
00402590 . 8BC6 mov eax, esi
00402592 . 5E pop esi
那么将00402571 mov byte ptr [esi+6F], 80 改为 mov byte ptr [esi+6F], 86
Byte 也是数据类型
mov byte ptr [esi+6F], 80 和上篇文章提到语句很类似,修改内存为80,只是修改大小不一样
你一定很激动,如何将我们的修改保存回染红EXE ?
很简单 复制到可执行文件-〉修改
但是这样做很危险,为什么,因为经过长时间调教(这样说未免。。。。) 很难保证我们对染红做过什么,如果发现在推凑或者优姬时候来个错误,玩家会把你推倒的
最保险的方法就是直接修改EXE
把Debug给关了
换件武器:Hex Workshop、UltraEdit 都可以
打开EXE
你肯定会这样 查找mov byte ptr [esi+6F], 80
但是你会找到吗?
为什么找不到?
因为计算机只认识机器码,mov 这些是给人们阅读的,是Debug软件生成的
其实就是 将机器码 C646 6F 80 变成C646 6F 86 (不要空格,我是为了排版)
修改完以后存盘,进入游戏
可是你会和我一样很沮丧,游戏没有乱码,这是为什么?
请看下篇文章