染成茜色的坂道破解技术内幕之实战篇

本文通过具体实例,详细介绍了使用OllyDbg调试器进行游戏程序破解的技术细节,包括如何定位并修改特定API函数调用,以及如何永久性地将修改保存到EXE文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

染成茜色的坂道破解技术内幕之内功提高篇,成为真正的程序员

使用OllyICE打开染红
我的版本是染红1.00版<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

先认识我们这个武器
OllyDbg是一种具有可视化界面的32位汇编-分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。
我使用的是OllyICE是爱好者继续开发的,可以在Vista下使用,都有汉化版,迅雷可以下载

本文说明:
  OllyICE中除了主菜单以外的所有菜单都是用鼠标右键调出,没有写主菜单的菜单都是右键菜单,每个窗口所调出右键菜单是不一样的,一般默认就是所讲的那个窗口,反正就那么几个窗口。。。。

软件中文帮助 http://bbs.pediy.com/showthread.php?s=&threadid=8899

上篇文章说我们要修改API函数,可以用断点方式
  问题是一个软件调用API函数可能有N处地方,而在反汇编中,无法进行字符串查找的
怎么办?

如果WindowsAPI函数使用了参考资源串,OllyDbg可以显示它。

打开akane.exe,可以看到CPU 窗口,最大化以后可以看到有4个部分(注意哦,很多时候只有最大化窗口才可以看到4个部分,CPU 窗口通过主菜单查看,点击工具栏 上的 C开启)
 左上方 是反汇编窗口,右上方可以查看寄存器
 左下方是堆 右下方是栈
学过编程都应该知道:
 一般函数参数放在栈中,数据一般放堆中

  
先 选择主菜单 查看-〉可执行模块或者点击工具栏 上的 E (executablemodules)
 一个软件有很多模块,有些是系统自己的
  我们看到有这么几个模块:
C:/Windows/system32/msvcrt.dll
可以认定,这个软件用VC++搞得7.0 说明是2003 版
 在可执行模块窗口中 要选择 akane.exe (鼠标双击)
 这样可以保证等候我们开工的是染红而不是其他东西
 虽然可以查看其它模块内容,对于染红汉化没有必要兴师动众
 

菜单选择如图所示内容

chazhao.jpg

然后 菜单 选择排序 按地址
 找到 名称为GDI32.CreateFontIndirectA函数
 选择如图菜单

duandian.jpg

然后可以开始运行程序(主菜单 调试-〉运行)
 程序在我们希望的地方停下来
说明:不同的机器不同的操作地址会不一样,但方法是相同的
汇编是靠地址传入参数
如图

04e1.jpg
04E1DAF4900100000000008000000000826C8272?.....€....俵俽
04E1DB0420835383568362834E0000僑僔僢僋......

80就是我们要修改的区位,俵俽僑僔僢僋是种字体。用EmEditor可以转回日文编码看到这个字体叫MSゴシック

好,在80上菜单,选择编辑二进制,改为86

可是很糟糕,似乎每显示一个字都会改回80。。。。。

怎么回事?
修改过游戏的朋友就知道,金山游侠之类软件找出地址可能有几个,修改其中一个地址不一定能成功,因为那个不一定是真正地址
怎么办?
这里靠大家分析了

大师发现很多calldwordptr[<&GDI32.CreateFontInd>上方有这么一条语句00404778.8D7358leaesi,dwordptr[ebx+58]
0040477B.8DBC24A80000>leaedi,dwordptr[esp+A8]
00404782.F3:A5repmovsdwordptres:[edi],dwordp>
00404784.0FAF8424AC00>imuleax,dwordptr[esp+AC]
0040478C.0FAF9424A800>imuledx,dwordptr[esp+A8]
00404794.899424A80000>movdwordptr[esp+A8],edx
0040479B.99cdq
0040479C.2BC2subeax,edx
0040479E.D1F8sareax,1
004047A0.898424AC0000>movdwordptr[esp+AC],eax
004047A7.8D8424A80000>leaeax,dwordptr[esp+A8]
004047AE.50pusheax;/pLogfont
004047AF.FF1560604800calldwordptr[<&GDI32.CreateFontInd>;/CreateFontIndirectA

00404782.F3:A5repmovsdwordptres:[edi],dwordp>
这条语句是干什么用的呢?
查查书,是用来进行字符串操作的,说白了就是拷贝字符串的(类似语句上篇文章讲过)
可能就是大BOSS-〉小BOSS
然后由小BOSS负责输出

我们同时看到下面有这么一个提示:(要设置断点,不要忘记了,在那条语句上菜单断点,或者F2键)
Ds:[esi]=[004A5AA4]
真是太方便了,大家不用学什么变址操作就可以搞定了

马上去堆窗口,菜单转到004A5AA4(回忆刚才理论,为什么要去堆?不去栈?)
哈哈哈最终BOSS找到了就在
004A5AA4
XOXO最终BOSS以后,我们发现游戏出现乱码
很明显修改有效

初战告捷

但是初战不代表成功,为什么了呢?
我想你也不希望每次启动Debug吧?
我们要永远搞定染红

怎么办?
大师发现,即使你重新启动游戏(在主菜单-〉调试)
最终BOSS的地址不会变!

咱们先主菜单-〉查看-〉断点,然后删去所有断点,把无关的去掉
在最终BOSS
004A5AA400000000000000000000000090010000............?..
004A5AB40000008000000000826C827220835383...€....俵俽僑?
004A5AC4568362834E0000000000000000000000V僢僋...........

那个80那里菜单断点-〉内存写入,这个类似金山游侠一样只有修改内存咱就暂停,研究
而接下来这个阶段就很很痛苦
大师是一条一条看(调试菜单),看了好几个晚上。。。。
不要忘记选择重新启动游戏(在主菜单-〉调试-〉重新启动)

大家用内存断点会很快的

终于找出修改区位的家伙
00402550.56pushesi
00402551.57pushedi
00402552.8BF1movesi,ecx
00402554.E877970000call0040BCD0
00402559.33C0xoreax,eax
0040255B.B92C000000movecx,2C
00402560.8BFEmovedi,esi
00402562.F3:ABrepstosdwordptres:[edi]
00402564.8B465Cmoveax,dwordptr[esi+5C]
00402567.85C0testeax,eax
00402569.B918000000movecx,18
0040256E.894E58movdwordptr[esi+58],ecx
00402571C6466F80movbyteptr[esi+6F],80
00402575.C7869C000000>movdwordptr[esi+9C],2
0040257F.898EA0000000movdwordptr[esi+A0],ecx
00402585.7502jnzshort00402589
00402587.8BC1moveax,ecx
00402589>8986A4000000movdwordptr[esi+A4],eax
0040258F.5Fpopedi
00402590.8BC6moveax,esi
00402592.5Epopesi

那么将00402571movbyteptr[esi+6F],80改为movbyteptr[esi+6F],86
Byte也是数据类型
movbyteptr[esi+6F],80和上篇文章提到语句很类似,修改内存为80,只是修改大小不一样
你一定很激动,如何将我们的修改保存回染红EXE?
很简单复制到可执行文件-〉修改

但是这样做很危险,为什么,因为经过长时间调教(这样说未免。。。。)很难保证我们对染红做过什么,如果发现在推凑或者优姬时候来个错误,玩家会把你推倒的
最保险的方法就是直接修改EXE

把Debug给关了
换件武器:HexWorkshop、UltraEdit都可以
打开EXE
你肯定会这样查找movbyteptr[esi+6F],80
但是你会找到吗?

为什么找不到?
因为计算机只认识机器码,mov这些是给人们阅读的,是Debug软件生成的
其实就是将机器码C6466F80变成C6466F86(不要空格,我是为了排版)
修改完以后存盘,进入游戏
可是你会和我一样很沮丧,游戏没有乱码,这是为什么?
请看下篇文章

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值