吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9384|回复: 34
收起左侧

[原创] 单机保皇游戏优化修改(VB程序破解)新手教程

[复制链接]
spcspcspcspcspc 发表于 2021-3-1 14:16
本帖最后由 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.打牌界面机器人出牌加速。

b (1).png b (2).png b (3).png


第一步 脱壳
b (4).png
PEID载入,ASPack 2.12的壳,没难度,OD直接脱掉:
OD载入,右击-运行脚本-打开-ASPack 2.12 OEP Finder _7。完成后弹出提示。

b (5).png
右击-用OllyDump脱壳调试进程-点脱壳-保存为 脱壳.exe。

b (6).png
再查壳发现是VB写的程序,打开运行也没有问题。

第二步 免登录
既然是VB的程序少不了 VB Decompiler 和 VBExplorer了。VB Decompiler打开程序,左侧是窗口和代码区域,中间是VB的属性区域,右侧是程序资源的展开。
b (7).png
可以看到游戏有6个窗口,根据名称和预览就能知道FrmLogn就是登录窗口。ZW是准备,PLAY是打牌界面。
免登录的思路就是窗口载入后自动执行登录按钮的代码。

b (9).png
我们先来看看登录窗口,属性中事件(Event)有两个,Load和Unload,双击Load进入载入后的界面。

b (10).png
有反编译、反汇编和十六进制三个标签,有反编译翻译成类似VB的代码,可读性最强。反汇编是我们熟悉的汇编语言。
反汇编标签下复制最后一行 loc_004C2E21: retn 0004h,这就是登录窗口载入后返回的代码。我们就是要在他返回前执行登录按钮的代码。
回到登录窗口,1处下拉,选择按钮1,双击2处事件。

b (8).png
复制汇编代码第一行 loc_004C1370: push ebp。
OD载入脱壳.exe ,Ctrl+G调整到004C2E21处,改为jmp 004C1370。就是返回指令直接改为跳转到登录按钮的指令。

b (11).png
运行一下,没有问题,右键-复制到可执行文件-所有修改-全部复制,右键-保存文件-免登录.exe
此处有几个小问题解答下:
1.强行修改代码会覆盖掉后面的代码,运行可能出错,但是这个游戏没有问题,只是说明后面的代码恰好是没用的代码,直接覆盖且没有补足返回指令是不规范的,将修改好的游戏再用OD载入,跳到此处是没法解析的,显示未知指令。但是Who cares!(care一定要加s,不信你去百度!)只要游戏没出错就行了!
2.显示用户名不存在或者密码错误的,要先用原本程序注册一个用户名且勾选记住密码方框,成功登录一次后就OK了。(去密码认证是004C15CD处je代码NOP掉就行,想改的可以去掉)

第三步 准备界面窗口可调
‘免登录.exe’复制一份改为‘可调.exe’。VBExplorer打开‘可调.exe’,选中FrmZW窗体,边框选择2-Sizable,保存退出,完成。是不是很简单,VBExplorer真是修改属性的神器啊。

b (12).png

第四步 准备界面机器人入座加速
VBExplorer打开‘可调.exe’,选中FrmZW窗体,属性中下拉选中时钟Timer1,Interval 3000改为1000,就是把机器人入座时钟3秒改为1秒。保存退出,完成。

b (13).png

第五步 修改默认分辨率
程序六个窗口中有登录界面、注册界面、修改属性、准备界面、打牌界面而另一个test的窗口不知道干什么的,点开发现窗口没有事件,只有一个时钟,时钟周期1毫秒,进时钟代码看看。  

b (14).png
[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

b (15).png
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                                                    //跳回原代码下一行
b (16).png b (17).png
此处说明两点:
1.为何是4C8020处?观察发现此处始终为0,我们大胆猜测此处没有使用,如果修改后程序出错,那就再找别的数据地址。
2.除数是2.0,为何代码是0x40000000?因为浮点数的2.0转换为16进制就是0x40000000。
b (18).png
同样高度的修改如下:
[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 双击,

b (19).png
[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,而且代码的第一句是

b (20).png
FrmPlay.TimerWait.Enabled = False
就是关闭时钟,基本可以判断就是TimerWait来控制倒计时,还有别的代码来改变和开启TimerWait。
回到VB Decompiler,文件-保存反编译的项目,用VB打开刚才保存的Project.vbp,找到FrmPlay界面的代码,搜索‘TimerWait’或者‘rnd’(随机数的函数)可以找到下面的代码

b (21).png
[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的壳,然后就不报毒了。。。老铁们还是自己判断吧。
b (22).png b (23).png
自己破解用了半天,写帖子前后用了5天,详细记录了破解的过程和思路,总怕写的出错或逻辑不通给别人造成困扰。破解有时候就是瞎蒙出来的,再回头分析为什么的时候反而更加麻烦,但对自己也是一种锻炼吧,比如分辨率23280的地方,我也是百度学习半天才搞明白怎么回事,再比如最后一步机器人加速,就是在OD中跟踪着,随手修改着,突然就加速了,再回头分析代码才知道为什么加速了。
本文还是很适合新人和小白练手的,主要在于各种工具的配合使用。文中的一个说明或者一句话可能就是楼主折腾半天才跳出的坑,大家有时间还是动手亲自练习练习,说不定有意外收获哦。

大家多多交流,楼主有问必答!

免费评分

参与人数 4威望 +1 吾爱币 +23 热心值 +4 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wuxinwudi + 1 + 1 热心回复!
zhanglei1371 + 1 + 1 热心回复!
明明欣雨 + 1 + 1 谢谢,学习了

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| spcspcspcspcspc 发表于 2021-3-1 16:35
执骨哟 发表于 2021-3-1 15:23
感谢楼主的细心分享,希望能上传一份未破解的程序,好让我们跟着步骤走一走,谢谢spcspcspcspcspc大佬

成品链接中有文中提到的所有版本,可以练习下哦
x37224197 发表于 2021-9-24 14:36
spcspcspcspcspc 发表于 2021-9-17 08:11
https://wwx.lanzoui.com/i8X71eu6nsb

谢谢,我记得我以前弄过,好像不行,前几天看到一个帖子好像用到这个的,又来试试
17601243856 发表于 2021-3-1 14:33
感谢楼主热心分享,对我们这种小白太有友好了
神马最给力ing 发表于 2021-3-1 14:59
优秀 学习了
cnmcwma 发表于 2021-3-1 15:04
非常棒,学习学习,谢谢楼主分享教程
andrewp 发表于 2021-3-1 15:15
学习一下,共同成长
aasdia 发表于 2021-3-1 15:16
学习到了,真怀念以前QQ游戏那时候的斗地主
执骨哟 发表于 2021-3-1 15:23
感谢楼主的细心分享,希望能上传一份未破解的程序,好让我们跟着步骤走一走,谢谢spcspcspcspcspc大佬
学习创新 发表于 2021-3-1 15:35
这个厉害   
Anff 发表于 2021-3-1 15:37
谢谢楼主分享教程,小白正好练手
liuzqm 发表于 2021-3-1 15:44
每天学习一点,每天进步一点点
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-26 00:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表