本帖最后由 spcspcspcspcspc 于 2021-3-1 16:37 编辑
修改的游戏:单机版保皇游戏 V1.00.0041 下载地址 https://www.8xia.com/soft/41074.htm (有没有问题自己判断!楼主不负责哦)
工具:PEID、OD、VBExplorer 1.1版、VB Decompiler Pro V11.1(破解版)
成品下载(含文中提到的各种版本):https://wwx.lanzoui.com/inkTHmbofpc
朋友最近玩一个保皇的小游戏(公司电脑不联网,垃圾配置估计也就玩玩这种小游戏了),每次游戏窗口太大,且不可调整,希望能缩小一点。
我自己玩了一下,发现可以改进的地方不少。
需要的优化的地方简单列一下:
1.去掉登录窗口。
2.准备界面边框可调。分辨率默认四分之一屏幕。
3.打牌界面调整后不重置。分辨率默认四分之一屏幕。
4.准备界面机器人入座加速。
5.打牌界面机器人出牌加速。
第一步 脱壳
PEID载入,ASPack 2.12的壳,没难度,OD直接脱掉:
OD载入,右击-运行脚本-打开-ASPack 2.12 OEP Finder _7。完成后弹出提示。
右击-用OllyDump脱壳调试进程-点脱壳-保存为 脱壳.exe。
再查壳发现是VB写的程序,打开运行也没有问题。
第二步 免登录
既然是VB的程序少不了 VB Decompiler 和 VBExplorer了。VB Decompiler打开程序,左侧是窗口和代码区域,中间是VB的属性区域,右侧是程序资源的展开。
可以看到游戏有6个窗口,根据名称和预览就能知道FrmLogn就是登录窗口。ZW是准备,PLAY是打牌界面。
免登录的思路就是窗口载入后自动执行登录按钮的代码。
我们先来看看登录窗口,属性中事件(Event)有两个,Load和Unload,双击Load进入载入后的界面。
有反编译、反汇编和十六进制三个标签,有反编译翻译成类似VB的代码,可读性最强。反汇编是我们熟悉的汇编语言。
反汇编标签下复制最后一行 loc_004C2E21: retn 0004h,这就是登录窗口载入后返回的代码。我们就是要在他返回前执行登录按钮的代码。
回到登录窗口,1处下拉,选择按钮1,双击2处事件。
复制汇编代码第一行 loc_004C1370: push ebp。
OD载入脱壳.exe ,Ctrl+G调整到004C2E21处,改为jmp 004C1370。就是返回指令直接改为跳转到登录按钮的指令。
运行一下,没有问题,右键-复制到可执行文件-所有修改-全部复制,右键-保存文件-免登录.exe
此处有几个小问题解答下:
1.强行修改代码会覆盖掉后面的代码,运行可能出错,但是这个游戏没有问题,只是说明后面的代码恰好是没用的代码,直接覆盖且没有补足返回指令是不规范的,将修改好的游戏再用OD载入,跳到此处是没法解析的,显示未知指令。但是Who cares!(care一定要加s,不信你去百度!)只要游戏没出错就行了!
2.显示用户名不存在或者密码错误的,要先用原本程序注册一个用户名且勾选记住密码方框,成功登录一次后就OK了。(去密码认证是004C15CD处je代码NOP掉就行,想改的可以去掉)
第三步 准备界面窗口可调
‘免登录.exe’复制一份改为‘可调.exe’。VBExplorer打开‘可调.exe’,选中FrmZW窗体,边框选择2-Sizable,保存退出,完成。是不是很简单,VBExplorer真是修改属性的神器啊。
第四步 准备界面机器人入座加速
VBExplorer打开‘可调.exe’,选中FrmZW窗体,属性中下拉选中时钟Timer1,Interval 3000改为1000,就是把机器人入座时钟3秒改为1秒。保存退出,完成。
第五步 修改默认分辨率
程序六个窗口中有登录界面、注册界面、修改属性、准备界面、打牌界面而另一个test的窗口不知道干什么的,点开发现窗口没有事件,只有一个时钟,时钟周期1毫秒,进时钟代码看看。
[Bash shell] 纯文本查看 复制代码 loc_00499BE5: global_004C802C = var_28.Width
loc_00499C19: global_004C8030 = var_28.Height 可以看到是获取窗口的宽度和高度等信息,而且是固定地址。
以宽度为例,OD载入,数据窗口跳转到004C802C处,下写入断点。运行,断在
00499BE5 mov dword ptr ds:[0x4C802C],edx
F8运行一步,数据从0变成23280.00(切换数据类型为浮点数,23280=1552*15,1552为窗体的宽度像素,15缇每像素为显示器属性。感兴趣的可以百度‘缇’或者‘Twips’去了解)
右键修改,改为11640,F9运行。游戏果然变为一半宽度,而且准备界面和打牌界面都改变了。
OD载入,修改如下:
[Bash shell] 纯文本查看 复制代码
00499BE5 >jmp 004C7BD7 //跳转到空白代码
004C7BD7 >mov dword ptr ds:[0x4C802C],edx //补足被占用代码
004C7BDD >mov dword ptr ss:[0x4C8020],0x40000000 //4C8020处改为2.0用作除数
004C7BE8 >fld dword ptr ss:[0x4C802C] //提出被除数
004C7BEF >fdiv dword ptr ss:[0x4C8020] //除以2.0
004C7BF6 >fstp dword ptr ss:[0x4C802C] //结果送回
004C7BFD >jmp 00499BEB //跳回原代码下一行
此处说明两点:
1.为何是4C8020处?观察发现此处始终为0,我们大胆猜测此处没有使用,如果修改后程序出错,那就再找别的数据地址。
2.除数是2.0,为何代码是0x40000000?因为浮点数的2.0转换为16进制就是0x40000000。
同样高度的修改如下:
[Bash shell] 纯文本查看 复制代码 00499C19 >jmp 004C7C07
004C7C07 >mov dword ptr ds:[0x4C8030],edx
004C7C0D >mov dword ptr ss:[0x4C8020],0x40000000
004C7C18 >fld dword ptr ss:[0x4C8030]
004C7C1F >fdiv dword ptr ss:[0x4C8020]
004C7C26 >fstp dword ptr ss:[0x4C8030]
004C7C2D >jmp 00499C1F 右键-复制到可执行文件-所有修改-全部复制,右键-保存文件-可调半屏.exe
第六步 去除打牌界面调整限制
打牌界面一调整窗口就会还原到左上角且还原大小。
我们回到VB Decompiler,打开FrmPlay窗口,事件2 Resize 双击,
[Visual Basic] 纯文本查看 复制代码 Private Sub Form_Resize() '4A65B0
loc_004A65B0: push ebp OD打开,定位到004A65B0,向下翻看 找到第一个跳转
004A6614 . /0F85 C4000000 jnz 可调半屏.004A66DE
直接jnz改为jmp。完成。
说明:第一反应是004A65B0直接改为retn,但是图标位置会错乱,所以从里面的跳转一个个试,先改jmp,不行改nop,就试验出来了。
第七步 机器人出牌加速
机器人出牌有个2到3秒的等待,实在太慢,让他加速一下。
这种倒计时应该还是时钟控制的,FrmPlay页面有两个时钟,Timer1和TimerWait,TimerWait的周期还是0,而且代码的第一句是
FrmPlay.TimerWait.Enabled = False
就是关闭时钟,基本可以判断就是TimerWait来控制倒计时,还有别的代码来改变和开启TimerWait。
回到VB Decompiler,文件-保存反编译的项目,用VB打开刚才保存的Project.vbp,找到FrmPlay界面的代码,搜索‘TimerWait’或者‘rnd’(随机数的函数)可以找到下面的代码
[Visual Basic] 纯文本查看 复制代码 loc_004B4CC0: var_8004 = CInt((Int((Rnd(10) + Rnd(10))) + 2))
loc_004B4CFC: FrmPlay.TimerWait.Interval = var_8004 * 03E8h
loc_004B4D3A: FrmPlay.TimerWait.Enabled = True 第一行:取随机数,范围是整数的2到3。
第二行:03E8h就是16进制的1000,TimerWait周期改为2000或者3000。
第三行:启用TimerWait时钟。
OD载入,跳转004B4CFC,向上找到 004B4CE8 imul si,si,0x3E8,改为 004B4CE8 imul si,si,0x64
就是把1000改为100,机器人等待时间从2-3秒变成0.2-0.3秒。
右键-复制到可执行文件-所有修改-全部复制,右键-保存文件-可调半屏加速.exe
至此游戏修改完成了,朋友也非常满意,就是机器人出牌太快,不太习惯。。。
360老是报毒,就在最后成品加了个壳,还是ASPack 2.12的壳,然后就不报毒了。。。老铁们还是自己判断吧。
自己破解用了半天,写帖子前后用了5天,详细记录了破解的过程和思路,总怕写的出错或逻辑不通给别人造成困扰。破解有时候就是瞎蒙出来的,再回头分析为什么的时候反而更加麻烦,但对自己也是一种锻炼吧,比如分辨率23280的地方,我也是百度学习半天才搞明白怎么回事,再比如最后一步机器人加速,就是在OD中跟踪着,随手修改着,突然就加速了,再回头分析代码才知道为什么加速了。
本文还是很适合新人和小白练手的,主要在于各种工具的配合使用。文中的一个说明或者一句话可能就是楼主折腾半天才跳出的坑,大家有时间还是动手亲自练习练习,说不定有意外收获哦。
大家多多交流,楼主有问必答!
|