首页
社区
课程
招聘
菜菜鸟请大虾指点迷津(处男作)
发表于: 2004-8-4 23:55 6185

菜菜鸟请大虾指点迷津(处男作)

2004-8-4 23:55
6185
记得读书的时候,很喜欢用GameBaster之类的游戏修改工具修改游戏。时至今日,学计算机的资格越来越老,对计算机的理解却越来越陌生,才发现自己实际已是一个菜菜鸟。

大半年前买了罗云彬的《Windows环境下32位汇编语言程序设计》,重温儿时解读Apple机器码的兴奋与喜悦,接下来知道了看雪,买了段老大的《加密与解密》(第二版),接着还看到了梁肇新的《编程高手箴言》。这些经历都给予了我勇气。程序员和歌星一样,都是吃青春饭的吗?在编程工具越来越傻瓜的今天,我们似乎更认同这样的观点。而在我看来,对操作系统的了解,对底层的了解,没有多年的浸泡,根本就无法透彻了解,甚至难以入门。Longhorn就要来了,MSIL也来了,是时候和win32 Say Goodbye了吗?我相信不会,而且随着平台的底层封装得越好,cracker越吃香。(当然,要付出的代价更大:))

在单位搞所谓的“电子政务”,指导领导用手写板输入中式的标点符号,的确没有多少机会谈技术,也就?里?唆了这么多,还望各位大虾对我这个头一回露脸的不知天高地厚的自大狂一些薄脸。多谢!

我的问题很菜,所研究的东西也只是为了哄哄老婆(老了,没机会哄MM了)。如哪位可以赐一眼半句,在下感激涕零。

(1)目前第一步的工作是分析游戏软件:连连看3.0(kawai.exe)。目标是修改相关的内容,包括分数、提示的次数、直接进入后面的关卡。
     i.开始用Regedit查看注册表,没有发现分数记录;
     ii.用FileMon查看软件相关的文件操作,也没有找到相关的记录文件,唯一注意的是调用了数据库访问组件,估计放在一些数据库中。
     iii.接下来尝试用“金山游侠V”看是否可以通过修改内存数据来实现对分数的修改,结果分数可能有加密过程,找不到分数存放的位置。
     iv.用Peid v0.91查看卡kawai.exe,发现用ASPack 2.12 -> Alexey Solodovnikov加密。
        1.文件入口:00162001
        2.文件编译:000A3A01
        3.程序入口点(OEP):004020DC
     v.利用AspackDie 1.41进行脱壳,基本成功。但是没有normal和hard级别。
       1.再用Peid查看脱壳后的程序,发现是用VB 5.0或6.0开发的。
     vi.利用W32Dasm以及ida pro进行静态反汇编,发现字串是乱码,利用各种中文字符集查看都无法还原。
     vii.想利用exeScope编辑对话框资源,却显示该资源被压缩,无法编辑。接着用FreeRes可以释放资源,但发现里面只有声音文件和一个图标文件,且保存资源后,exeScope仍然无法对其进行修改。
     viii.如何找到菜单资源,仍然是一个问题。(该软件曾被汉化:繁转简)
     ix.今天看了一些有关VB破解的资料,感觉还是要对msvbvm60.dll的函数要有所了解。

     知道我有多菜了吧,还望大虾们指导一下该从很处入手,谢了!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (14)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
2
看了不少书阿.入门应该很快

我以前分析过这个,就是无限洗牌.直接分析那个洗牌的菜单就可以了.到最后也就是改个跳转.不过郁闷的是好像洗牌多了以后,最后的得分是负数,被同学狂骂......后来也没继续搞.
2004-8-5 04:10
0
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
对于VB程序,可以试一下带壳分析,
用trace指令,分析一下游戏的过程,看看那些是关键,
游戏中的数据一般放在内存中的
2004-8-5 09:44
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢nbw和lordor。

我利用ida查找rtcMsgBox,终于找到了存储分数的位置在004A3134.(这是脱壳后的程序)

然后利用softice拦截rtcMsgBox,此时已进入msvbvm60.

利用D命令,显示004A3134的数据,显示00005234(实际上我的分数只有210分),从ida显示程序在读入数据后,还调用了__vbaStrR4.代码如下所示:
.text:00485EC2 8B 15 34 31 4A 00 mov     edx, dword_4A3134
.text:00485EC8 50                push    eax
.text:00485EC9 52                push    edx
.text:00485ECA FF 15 24 11 40 00 call    ds:__vbaStrR4
不知道这个函数有什么功能?

另外一个疑问是,代码段和数据段的选择子为何不一样,代码段为001b,数据段确是0010.
2004-8-6 17:18
0
雪    币: 232
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我看啦上面,也有点问题,我想问那个程序把分数放到内存里,到是可以,可是从那里来的呢!!!!它不可能每一回都是把分数写入到自己的EXE文件里吧!我想它一定把分数放到它本身以外的一个地方,只是可能是加密啦而已!!!
2004-8-7 20:13
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
6
都32位了,选择子无所谓
至于数据的来历可以用 bpm  XXXXXX(地址) .我这2天搞这个,头大的要死
另外比分也没放在exe里面.你自己找找看.应该不难
2004-8-7 20:52
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
分数的问题我已经解决了,就放在004A3134,唯一高明之处是它以单精度实数的形式存放的,即IEEE浮点格式标准。这也是一般的游戏修改器无法捕抓到它的原因。

现在将目标转移到如何修改提示次数和直接进入任意关卡的问题上,这个程序可能是因为汉化的原因,菜单是程序执行后生成的,exeScope无法捕抓到。

利用消息断点 bmsg xxxxxxxx wm_char截取键盘消息,也无法获取。
游戏中获取提示的快捷方式是F5, 利用wm_keydown仍然无法截取按键。估计被处理菜单快捷方式的消息处理函数处理掉了。我现在想知道的就是如何截取用户选取菜单的消息。

nbw,可不可以告诉我你当时是怎样分析那个菜单的?谢了!
2004-8-7 23:23
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
8
连续洗牌,直到最后弹出对话框,就拦截这个对话框
要是不行的话再说
2004-8-8 00:00
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢nbw.

我找到判断洗牌的代码了,洗牌次数存放在004a30d4.

老婆要睡了,明天继续。
2004-8-8 00:31
0
雪    币: 166
活跃值: (112)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
4A3194 提示次数
4A30D4 洗牌次数
4A3134 总分

游戏还是用专用工具比较好,比如 game expert等
2004-8-8 10:33
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
10搂,这个游戏不是我自己玩,不会要教我老婆怎么用game expert 吧。

无限洗牌的问题解决了,在00485acd处连续修改为10个nop.

关数记录在004a30ce处,现在问题是如何一开始游戏就进入第3关呢?如果说用户直接输入关数,则要增加的代码或许比较多。
2004-8-8 12:35
0
雪    币: 280
活跃值: (281)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
12
如果用keymaker做个lorder怎么样?动态修改内存
2004-8-8 14:07
0
雪    币: 236
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
你先用这个软件把程序中的汉字转换成英文,再进行静态反编译看看。附件:VBExplorer.rar
2004-8-8 14:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
用game master就可以做个无敌档,不过只能从easy开始,还有时间能否让它停下来
2004-8-8 20:32
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
经过一个星期的努力和大虾们的指点,终于将我的“处男作”完成了。

实现的目标包括:
(1)找到分数的记录位置,修改分数,并保存在分数榜中;
(2)实现无限制洗牌;
(3)实现直接进入某一关卡;
(4)解决脱壳后,只能玩easy级的问题。

将自己的一些心得体会贴出来,与大家分享。希望能继续得到高手们的帮助。

xiv.实现无限制洗牌的方法。
   1.是洗牌次数用完后,会弹出一个“已无牌可走”的对话框。
   2.通过Ultra Edit获取“已无牌可走”的Unicode编码,然后在ida中搜索到字符串的位置;
   3.根据对字符串的引用,找到对应的编码在00485acd处。
   4.然后将次数减一及判断跳转的指令去掉即可。
xv.实现直接进入任意关卡的方法
   1.每关结束后,都会弹出“成功完成第n关”的对话框。
   2.通过该对话框找到存放关数的位置在004a30ce处。
   3.然后利用bpmw 004a30ce w设置对该处的写断点,找到对应的初始化关数代码在004894ff。
   4.然后在004a2394处找到代码空隙,于是加一个跳转,然后赋予任意关数值,然后再跳回。对机器指令仍然不是很熟悉,用到的指令包括:
    a)jmp rel32 (E9 xx xx xx xx) : 32位相对跳转;
    b)mov word ptr mem,imm (66 C7 05 MM MM MM MM ww ww )
xvi.目前来看,以上解决的3个问题都是利用bpx msvbvm60!rtcMsgBox设置对话框断点解决。对于菜单的截取,因为涉及消息处理机制,所有的消息是通过回调消息处理函数解决的。因此跟踪时通常进入底层代码,无法去到上层代码中去。
xvii.继续研究消息处理代码,解决只有easy级别的问题。
    1.这个问题花了一天的时间,终于解决了。在VB编写的程序中,并没有直接调用user32!EnableMenuItem。从EnableMenuItem到用户的应用程序,还隔了几层调用。另一方面,通过F12无法跟踪到调用代码,或许是这种程序结构实现了隐藏:
                     push Offset_NextAddress
                     jmp Loc_Ret
                     …
     Loc_Ret:        ret               
     因此必须老实的用F10一步一步返回。
   2.通过跟踪,发现对菜单的屏蔽是写在程序里的。因此估计压缩时还添加了恢复这些菜单的代码。因此用Aspdie并没有完全将代码还原。
   3.设置菜单的代码入口点包括:(参数0为禁止,FF为开启)
     a)0047BCB9:(提示)
     b)0047BD3D:(洗牌)
     c)0047BD9D:(暂停)
     d)0047BE0A:(放弃)
     e)0047BF29
     f)0047BFEA
     g)0047C0AB
     h)0047C16C
     i)0047C22D
     j)0047C2EE
xviii.通过对这个程序的破解,感觉还需要更多的了解底层的东西。另外需要《Windows API》以及《Intel opCode》的相关资料。对于指令代码,目前的资料都描述得不是很清楚,或许真的需要看Intel提供的资料。

最后再次感谢看雪,感谢各位高手,感谢精神上支持我的老婆!
2004-8-11 16:49
0
游客
登录 | 注册 方可回帖
返回
//