半老徐娘 版主

不再是美女了 - UID
- 3985
- 精华
- 8
- 积分
- 3789
- 威望
- 7 度
|
阁楼
大 中
小 发表于 2008-10-14 18:00 只看该作者
 
磨刀不误砍柴工
——关于如何配合ida对gmsv进行分析和修改 主要内容:
9 |# G* |' S$ g2 G& i/ q& Wbbs.mocwww.com 介绍一下与ida和FlexHEX使用相关的小技巧,帮助新人理解如何一步步向gmsv内部行进。可能对于老人可以跳过此篇文章,但一些细节希望对老人们也有些帮助。 妖城在线论坛# U$ c6 d; b3 s( N
两个问题:
5 ]/ ~( { ]; C mbbs.mocwww.com 1、ida可以用来修改吗 魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表& w+ J3 [7 B! N7 F) |' N8 e3 u
答:可以,但是只限于模块的修改,这个似乎离我们很远,我们还是用十六进制工具来解决吧 —魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート$ b; a8 g! c+ h
2、ue和FlexHEX谁好 bbs.mocwww.com. D- n/ L/ R$ i: A. z! }$ E/ ?
答:都好,在我们修改gmsv过程中没有哪个强于哪个,只有哪个你掌握的更好。
# W$ A- n7 G' e$ g# |5 Hbbs.mocwww.com正文:魔力私服,最新魔力宝贝私服技术交流( G2 v. u/ _& |7 G
首先这是一篇关于工具的局部说明,因为两个工具都有说不完的功能,我不会浪费那么多篇章一一介绍,网上有更多的例子和文章介绍他们的功能,在这里我们只介绍涉及到的一小部分内容即可。工具的下载和安装暂时不做说明,只要安装完全看起来是一个样子的,稍后我会找一个稳定的地址发上来供大家下载。 魔力私服,最新魔力宝贝私服技术交流! s7 P" k8 q: ?" I. Y7 T
第一部分:启动和打开魔力私服,最新魔力宝贝私服技术交流* p* v+ g# `1 ~6 {
安装完毕之后我们要使用ida来打开gmsv,这里提到两种方式,每一种方式都有其用途。第一种方式是正常的启动ida,选在运行然后我们看到的是一个空的ida工作空间,选择文件--打开:在弹出的文件框中文件类型选择All Files(*.*),这样就能在gmsv所在目录看到gmsv文件了,选择确定,开始载入如下对话框: —魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) `- b. W+ f- H7 M" M/ r- f( K
点击确定弹出如下对话框,继续点击确定。 妖城在线论坛! Q1 E7 m2 r4 z# R
魔力私服,最新魔力宝贝私服技术交流0 A" E2 Y! x: v) }. U( }! `
直到出现如下图片,则代表着正式加载完毕,视个人配置不一样三到五分钟完全载入。 魔力私服,最新魔力宝贝私服技术交流" Z4 z% f& K. ?2 U7 F, i
' ~+ M6 |- N. U$ O' Q3 K妖城在线论坛 接下来我们介绍第二种载入方式,第二种载入方式比第一种载入方式多了一个参数,就是一次读入的大小进行了最大化,这样就不会出现第一种读入方式产生的中间部分反汇编不出来的现象。但是有得必有失,代价也是相当的大的,必须有较好的处理器运算能力,还要有足够大的空间【600m左右,而第一种方式才不足50m】。运行ms-dos窗口,打开ida所在目录,输入idag -dVPAGESIZE=0x8000 [ gmsv目录包括文件],回车。如下图所示:
8 L+ T+ B# H' l; l4 v4 g$ N妖城在线论坛
—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート: P, U$ P) s1 J, X
接着会弹出和第一次打开相同第一个对话框,但是没有第二个对话框,这是一个漫长的等待,大约要10分钟到1小时不等。至此,我们算是成功那个的用ida载入了gmsv了,下面介绍ida一些用的到的窗口和基本功能。 第二部分 界面与操作% A K2 I3 y% t% c
在载入的试图选项卡中我们常用到的有三个:IDA View-A、Hex View-A、Exports。其中IDA View-A中显示反汇编出来asm代码,有两种显示模式,一种图形模式,即默认的显示形式,在图形模式下可以用鼠标方便的控制整个画面比如按住左键可以随鼠标移动,按住ctrl键也可以随滑轮随意放大和缩小,当然也可以使用图形概况中的小框来快速的移动到比较大的程序的某些特定位置;另外一种显示模式是反汇编代码视图,在该视图下,地址对应着每一条指令,让你清晰的了解机器码与指令的对应关系。Hex View-A窗口显示的就是我们常说的十六进制代码了,也就是我前面说的机器码。通过IDA View-A窗口中的指令,我们清楚的查到其对应的机器码,然后改之。。。这就是我们的修改方法。Exports窗口则存放这大量的系统处理函数,也是被分析程序的入口和数据处理中心。
% }. X3 {) }; a8 N9 h0 g% b
通过拖动箭头实现位置的快速移动 下面介绍一些基础的操作查找和定位。ida是一个庞大的反汇编工具,可是对于新手他只需要掌握两个基本的功能,那就是查找和定位,灵活的运用这两个功能往往会让你事半功倍。要说明的下的是对于不同的窗口查找具有不同的意义和选项,这个是个很好设计,比如你在IDA View-A窗口可以查询数字,文本以及一切可能出现的你需要的东西;而在Exports窗口你只能查找文本,因为函数名称没有机器码让你查。另外善用查询输入框的的下拉条,那里记录着你以往的查询,免得重复输入浪费时间。定位这个功能在修改某些较少的地址的时候非常有用,他可以让你省时省力的看到自己努力的结果是否成功,而不必等到系统加载完全。—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート/ L0 V* H. _' |: ?, J
第三部分:例子
0 ^7 L! A H* O: @$ b& h. L/ j# V魔力私服,最新魔力宝贝私服技术交流 为了能够承前,我们就以前些天我发表的帖子中提到的调教写该作为例子来具体的说一下是怎么结合起来运用工具来达到分析和调试的目的的。在Exports 窗口查找CHAR_CheckTrainSkill函数并打开,向下拉动找到如图所示部分:
bbs.mocwww.com" H- z- x/ l! g: r5 F& [! i& O$ G1 {
这一部分的函数分析我在上一个教程已经写出,但是没有写出分析过程,这个正是本文将要涉及的。抛开前面的教程里边的注释,假设我们就面对这么一个函数的某系部分,首先要解决的是:我们为什么要选择函数的这部分?有两个原因:第一是A部分的公式,这个1000乘积的公式是一个很好的突破口,也完全符合当初那个技能等级乘以1000除去宠物等级的猜想;第二是A部分的cmp eax, 3Bh和B部分的mov eax, 3Ch语句相呼应能够达成高宠60忠诚的条件,这些都是选择这个部分作为突破口的原因。 剩下的问题是我们该如何确定每一步中eax以及edx等寄存器中的值,以用来确定哪一步执行判断最为稳妥和节省代码。按照1000倍技能等级的猜想,我们可以猜到在A部分第一次执行Ivdv之后,edx应该存储着技能等级,这里我们引申一个问题:edx中的技能等级是如何得来的?edx是余数,既然余数是技能等级,那么eax在被除之前存储的是多少?根据程序可以判断出来是从TECH_getChar函数返回的ebx的值,下面我们想一个办法来显示这个时候的ebx到底赋给eax怎样的一个数值,满足一下我们的好奇心。 这次我们在 窗口IDA View-A中查询文本CHAR_CheckTrainSkill,以确定是什么函数调用的CHAR_CheckTrainSkill的结果,选择会自动跳转到CHAR_initcharWorkInt函数调用的部分,这也是一个很有意思的部分。如图所示: 妖城在线论坛2 w# c% G' e# p- h, a" ]
1 F9 p- h3 e3 K) K) [. m—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート 配合CHAR_CheckTrainSkill函数的图片,我们找到了一种可以显示eax的当时数值的办法,那就是在eax被ebx赋值后立即跳出CHAR_CheckTrainSkill函数继续执行CHAR_initcharWorkInt函数,这样根据逻辑,可以判断出会执行CHAR_initcharWorkInt函数的右侧部分,再进行cmp eax, ebx这个判断,最终输出会显示为宠物的忠诚[edi+610h]。假设这些都成立,我们来修改一些语句:
9 x4 Z, k$ g; a& z" U3 J& ACHAR_initcharWorkInt函数: —魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート) v, s" g$ T9 S
mov [edi+610h], ebx应修改为mov [edi+610h], eax,这样如果eax无论任何值会被显示出来。妖城在线论坛 L; K F" }* a8 _( [2 `( m+ W
CHAR_CheckTrainSkill函数:
) N8 d' [: Z9 h3 V魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表 在A部分mov eax, ebx后面加上一句jmp loc_806F453。其他部分不要管啦,已经被长跳转屏蔽了。bbs.mocwww.com& H, H, c8 J$ h( [# I
先说CHAR_initcharWorkInt函数的这部分修改,在IDA View-A图形界面选择 mov [edi+610h], ebx这个指令,点击右键选择汇编视图代码,进入汇编模式,这个时侯一般会已经取消了选择,再次选择 mov [edi+610h], ebx这个指令,点击Hex View-A窗口,可以看到89 9F 10 06 00 00这六个机器码被选择,这也就是这个指令的机器码,我们想要的是把 mov [edi+610h], ebx[机器码 89 9F 10 06 00 00]修改为 mov [edi+610h], eax[机器码 89 87 10 06 00 00]。得到它的长地址为.text:0806D383,在FlexHEX中的地址应806D383-804800=25383,打开FlexHEX,载入gmsv定位25383,将 89 9F 10 06 00 00更改为 89 87 10 06 00 00,保存退出。 魔力私服,最新魔力宝贝私服技术交流; H$ ]# S3 p1 K" m' V- P
接着说CHAR_CheckTrainSkill函数这部分修改,同样办法在汇编代码模式下查看mov eax, ebx这个指令的结束地址是.text:0806F545,由于我们要在后面要在后面添加一个长跳转指令jmp,所以计算出jmp的跳出地址也能应该为起始地址.text:0806F545+jmp指令长度5=.text:0806F54a,跳转的目的地为.text:0806F453,由此得出跳转的距离为目的地-跳出起始地址=806F453-806F54a=FFFFFF09。所以长指令的的完整代码为:E9 09 FF FF FF。根据jmp指令位置.text:0806F545,得出在FlexHEX中的位置是27545,打开FlexHEX,载入gmsv定位27545,将该位置开始的五个机器码89 D1 99 F7 F9更换为E9 09 FF FF FF,保存退出。 魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表) r( Y+ W7 { N+ R
重新打开ida载入gmsv,查看刚才被改过的部分如下图所示:
' d! V6 e- |# N3 I( L+ ubbs.mocwww.com
3 w2 G0 A9 S! J; n/ V1 F' w$ r- U4 {
CHAR_CheckTrainSkill函数
; A- i7 R2 V! o) M2 G: E—魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲートCHAR_initcharWorkInt函数 —魔力私服,魔力宝贝私服技术,DELPHI编程,魔力寶貝, 魔力宝贝, 크로스게이트,クロスゲート* y7 Z4 X5 t' {+ }
重启服务器进入游戏,可以看出一级调教宠物的忠诚显示7100,查找对应文件tech.txt,与techid相同,其他等级亦然。在这里我不是介绍给大家做无用功,而是想通过这个意外的探索过程让大家能够理解每一次成功的修改背后都需要你不断尝试,不断的创新方法,提高自己的理解能力。 绕了一圈,我们只弄清楚了一个问题,那就是eax的初始值是txt文本中的techid,而事实上后面的执行数值我们也就都可以确定了。一切重新来过,删除刚才修改的gmsv,重新载入未修改的gmsv我们来做正确的修改方法。 魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表; |) Q! t3 S2 a: R2 w( w5 }% }
到现在为止,我们已经完全能得出上一篇文章的所做出的诠释和判断点的选择。我们打开函数CHAR_CheckTrainSkill,右键选择反汇编代码模式,从头至尾的浏览整个程序,在程序中【包括结尾,但不包括开头】寻找到align 4、align 10h等字样共两处,下面的任务是把这两处的align代码清除掉并转移到A区lea edx, [edx+edx*4+5]上面,以供我们修改用。什么事情都得从简单的做起,我们先移动下面的两个机器码。从反汇编代码视图直观的看,我们要做的只需要把位于.text:0806F54A到.text:0806F58E之间的代码后移两位就可以搞定了。在FlexHEX中将2754A至2758E之间的所有代码后移两位【复制,粘贴我就不絮叨了吧】,空出来的两位我们设置为90 90以备后用。但是我们这里有两个长跳转需要修改一下他们就是jle loc_806F453和jle loc_806F453,因为他们的地址增加了2,所以他们的相对跳转减少2【这部分不明白的自己多动手就明白了】。在移动的代码中找到E9 C5 FE FF FF更改为E9 C3 FE FF FF,同时把0F 8E DB FE FF FF更改为0F 8E D9 FE FF FF,保存退出。
" [& a& i7 Q! }- i2 ^+ k
下面两个移上之后 接下来同理我们把上面的空指令转移到一起,这次要移动.text:0806F45C到.text:0806F54A之间的所有代码向上移一位,这个操作起来与上一个相同,注意的有两点:一,此次修改的中包含的地址被前面地址.text:0806F44C的指令调用,所以也要修改,转移的代码中包含了一个jmp长转移,也要修改;二,call函数也是一个转移指令,所以相应的转移地址也要修改,具体是+1还是-1呢,留给自己试验。
: [0 h& |7 H- q6 L8 G+ y+ b魔力私服,最新魔力私服,魔力宝贝私服,魔力宝贝私服技术,魔力宝贝私服,私服架设技术,妖城,FLASH,电影,黑客,网络,网吧,破解,入侵,注册表 做到这里我们开始做简化程序来腾出更多的空间,jle loc_806F453这个指令还有简化的余地,这里使用了一个六个机器码的长指令转移,如果我们把它转换成2个机器码的短指令转移将会获得4个机器码空间,当然直接使用短指令是不行的,短指令最远能跳转到7D的距离,在这个例子当中很显然超过这个数目,但是我们可一通过离它下面很近的jmp指令来帮它实现这个功能。找到指令.text:0806F578的代码0F 8E D9 FE FF FF,更改为短指令并定向为临近的jmp指令,代码为90 90 90 90 7E 11。然后利用前面的方法把这四个90转移到A区集合的位置,至次我们就获得了7个机器码的空间。 剩下的修改参考上篇教程,基本上达到了锻炼了队伍,取得了成绩。 1 P3 U/ ], j% w) t2 ]/ E) y& D
魔力私服,最新魔力宝贝私服技术交流( }4 M; _' @8 v/ E4 k
[ 本帖最后由 完美汉化 于 2008-10-14 22:43 编辑 ]
这个上面有我的名字
http://www.mocwww.com/ycmoli.gif
|