ht37 2007-12-11 22:29
现在就轮到ollydbg出场了,
先运行wow,登录选完人物进入游戏,因为WOW在登录时会进行文件校验,如果这时已经在olly
dbg下过断点的话会发生校验出错提示版本问题登录不了游戏的情况
运行ollydbg->打开file菜单->点击attach项->在弹出的菜单内选中world of warcraft ,
双击或者点右下方的attach按钮
选完之后ollydbg就会载入wow程序,可能会比较多,在截入完之后会自动暂停wow程序,这时
候你要迅速点击工具条里的运行钮或者按F9,这时再回到WOW程序看看有没有死机,如果没死
的话进入下面的程序,如果死掉的话就重新来一次,加快你按F9的速度
选择view菜单->选择memory项(也可以直接用alt+m)->弹出程序的内存清单,假设我们在上
面找到了HP的存储地址为110FE3C(这是一个十六进制的数字,用来表示内存,如果你不
知道十六进制是什么意思,那么请google"十六进制"),现在我们要做的是在清单内找到这
个值,注意,这个内存清单显示的是程序占用的内存段,如下表所示,我们找的是HP地址所对
应的内存值段,注意,因为WOW暂时在维护,因此无法登录游戏查找具体数值,下面这个表是我
为了表述方便而修改过的,实际可能有所不同,但查找方法相同
[code]
Memory map
Address Size Owner Section Contains Type Access
Initial Mapped as
起始地址 范围
00010000 00001000 <-起码地址+范围即条所涵盖的内存段,在本条上对应的区域为起
点:00010000,终点:00011000
00020000 00001000 Priv RW RW
0011D000 00001000 Priv RW Guar RW
0011E000 00012000 stack of mai Priv RW Guar RW
00130000 00006000 Priv RW RW
00137000 0001F000 Priv RW RW
0015A000 00003000 Priv RW RW
01000000 00FFFFF <- 这条即为我们所需要查找的地址段,双击进入
[/code]
弹出了类似以下这个表的内容,下表同样为了表述方便而经过修改,以后如非截图数据均就
理解为修改后数据
[code]
0110FE3C C8 00 00 00 00 01 00 00 FF EE FF EE 02 10 00 00 <这行就是我们需要找的
数据
012C0010 00 00 00 00 00 FE 00 00 00 00 10 00 00 20 00 00 ................
012C0020 00 02 00 00 00 20 00 00 2F FC 01 00 FF EF FD 7F ................
012C0030 06 00 08 06 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C0040 00 00 00 00 88 05 2C 01 0F 00 00 00 F8 FF FF FF ................
012C0050 50 00 2C 01 50 00 2C 01 40 06 2C 01 00 00 00 00 ................
012C0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C00A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C00B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C00C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C00D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C00E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C00F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
012C0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
................[/code]
接着,我们在这个表里查找地址110FE3C,第一行就是,然后选中这行的地址,选中部分会变成
灰色,一般需要选四个字节,因为WOW的数据都是分配四字节内存,选中后在选中的内容上右
击,选择弹出菜单内的breakpoint->memory,on Write,这个动作的意思,一旦程序更改这个
值,立即中断程序.这样我们就可以知道是哪条指令更改了他
[[i] 本帖最后由 ht37 于 2007-12-11 22:31 编辑 [/i]]
ht37 2007-12-11 22:39
接下来的部分等维护完再写吧,这样不和具体程序联系起来始终觉得很干瘪,而且看的人不能按内容一步步的实践,无法建立感性认识的话是很难坚持看下去的
有人说我这个东西是转来的,呵呵,要说转,那你倒转个给我看看,其实类似思路的文章很多,但是都是高手写他们的心得,而入门的文章则很少,我因为接了个写挂的活,有些东西也是现学的,从初学者的角度来写体会,可能更容易让新手看明白吧
ht37 2007-12-13 00:48
我又回来了,接上面的教程,前面两个代码图都是我瞎截的,当时游戏在维护,现在先补上内存段代码,[code]
114FA548 50 00 00 00 00 00 00 00 00 00 00 00 64 00 00 00 P...........d...
114FA558 64 00 00 00 00 00 00 00 50 00 00 00 00 00 00 00 d.......P.......
114FA568 E8 03 00 00 64 00 00 00 64 00 00 00 00 00 00 00 ?..d...d.......
114FA578 01 00 00 00 02 00 00 00 02 01 00 01 00 00 00 00 ...........
114FA588 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
114FA598 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
114FA5A8 08 00 00 00 00 00 00 00 99 09 00 00 00 00 00 00 .......?......[/code]注意上表的第一行,就是标号为114FA548这行,114FA548是一个十六进制数,表示内存位置地址,在这个数之后的每两位数表示内存中的一个字节,每行16个字节,第一个50也是十六进制数,对应的十进制数是80,这就是兽人第一级的血量,在第二行还有一个50,这个50是最大血量,当前血量和最大血量的地址都有了,然后用鼠标选中114fa548这个地址开始的四个字节,下断点,下断点的方法看上面的贴子.然后回到游戏,打个怪,让血减少.这时候ollydbg就会暂停
并且出现下表[code]00617AB0 /$ 55 PUSH EBP
00617AB1 |. 8BEC MOV EBP,ESP
00617AB3 |. 8B41 08 MOV EAX,DWORD PTR DS:[ECX+8]
00617AB6 |. 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
00617AB9 |. 8B55 08 MOV EDX,DWORD PTR SS:[EBP+8]
00617ABC |. 890C90 MOV DWORD PTR DS:[EAX+EDX*4],ECX<----这一行会被高亮黄色标示
00617ABF |. B8 01000000 MOV EAX,1
00617AC4 |. 5D POP EBP
00617AC5 \. C2 0800 RETN 8[/code]大家注意看我标了注解的这一行,这是一条汇编命令,其功能是向eax+edx*4的这个内存地址开始的位置写入一个双字,写入的值存放在ecx内,eax,edx,ecx是寄存器,具体寄存器是什么意思,大家可以google一下,在我的教程里,你只要知道寄存器可以存放内存地址和数据就行,涉及到具体的命令时我会具体解释我们现在已经知道是这行命令更改了我们的血量,而这行命令的地址是不会变化的,因为他是指令而不是数据,是在客户端载入时分配的地址,因此是固定的,而咱们现在就看看这条指令是不是只更改血量.具体操作:用鼠标左击这一行选中,然后按F2,这个动作意思是我们在这里下断点,只要程序调用这条指令,ollydbg就会中断程序并给出中断时的各项数据,包括寄存器,内存,堆栈的值.下完断点后,我们发现哪怕不打怪,不少血的情况下也会中断,也就是说不减血的时候系统也会调用这条命令....这回完球了.不仅仅地址是动态的,连程序也是公共的,公交车----大家一起上,熟泡面=====人人可以泡.不要着急,既然有人写得出外挂,那么咱们也能写.一般来说遇到这种情况就要分析程序了,一步步的向上查,看ecx的值是从哪里来的,如果程序简单的话,也许1分钟搞定,要是复杂起来,加了一百层壳的话,那就有可能要查上一会了,这就是传说中的软件破解,而且是最低级的.在HP地址这个问题上,我们有更好的办法来解决,你多启动两次游戏或者多登录两次,多查两次不同的HP地址,会发现一个规律,不管地址怎么变,最后三位总是548,注意这依然是一个十六进制数,之所计算机用十六进制数,是用计算机的硬件有关,在电脑里,只有0和1两种状态,对应就是通路和断路两种情况,而十六进制的一个数字,正好对应四位二进制数,下面为了表达方法,十六进制数加后缀H,二进制数加后缀B,1H=0001B,AH=1010B,FH=1111B,这里只是简单介绍,因为下面将要进行二进制的运算动作,如果想详细了解,还请自己google.
现在继续刚才的命令讨论,因为这条命令是复用的,因此并不是他所生产的所有数据都是我们需要的,只有当[EAX+EDX*4]这个值的最后三位数是548时,我们才需要.为了读取最后三位数并且判断是否为548,我先要介绍两个二进制的动作命令,"与","异或",注意这"与"和"异或"与我们数学中的"加""减""乘""除"是一个概念,也是一个运算符号,具体的运算法则我这里简单介绍下,我们都知道十进制的加法法则,1+1=2,2+2=4,,而二进制中,只有0和1两个数字,所以无论是什么去运算,只可能产生三种算式:0+1,0+0,1+1,1+0,其中,0+1和1+0是相同的,而二进制的运算法则如下:
1与1=1
1与0=0
0与0=0
0与1=0,"与"运算法则简单归纳就是 有0出0,双1出1
1异或1=0
0异或0=0
1异或0=1
0异或1=1,"异或"法则的速记法是"同位出,异位出1"
这两种运算均没有进位和退位,按位运算,例:0001与1101=0001,0001异或1101=1100,分别位置对应,位置不够的话在高位补0,比如1100 0000 与 0000 1111,后面这个数其实就是1111,但是在二进制运算时,需要补0再回到我们刚才的地址讨论,我们现在手上得到的HP地址是114FA548,548H=0101 0100 1000B,注意我在二进制中间加了空格,是为了大家的观察方便,实际当中是没有空格的.我们需要把高位全部清0只剩下548这三位,并且不能倍数改变原来的数字,因为我们接下来还要进行比对,看是否为548,如果是的话记录这个地址上的数值.
我们先将这个数字装入ebp内,具体的命令是mov ebp,[eax+edx+4]
然后进行与操作,将EBP与00000FFF,具体命令是and ebp,00000FFF,这样我们就将EBP内的高位清0,只剩下原来的3位十六进制数,或者是12位b
然后再异或,将EBP异或00000548,命令:xor ebp,00000548,如果结果是0的话,那么代表这个地址正是我们所需要.如果非零,那么就不用管他了
接下来,就是要把上面这些命令插到中断的这条命令后面.
[[i] 本帖最后由 ht37 于 2007-12-13 00:52 编辑 [/i]]
ht37 2007-12-13 01:21
上面的帖子有个错误,因为无法编辑,在这里更正一下:
最后一段
[quote]我们先将这个数字装入ebp内,具体的命令是mov ebp,[eax+edx+4][/quote]
这一行错了,在命令中如果加了中括号是表示地址,
正确的命令要分解成几条
[code]
push edx<-把edx的中的数据保存起来待用
push eax <-把原来的eax中的值保存起来,我们现在要用eax进行剩法运算
push eax<-保存第二份,待会要取两次
mov eax,edx<-把EDX中的值移入eax<准备用处
mul 4<-这条命令的作用是将eax*4再放回eax中
pop edx <-把刚才保存的第二份eax的值放到edx
add eax,edx<-将eax+edx,结果保存在eax内
mov ebp,eax<-将计算出来的地址装入ebp待用
pop eax<-恢复原来的数据,下同
pop edx
[/code]
ht37 2007-12-13 09:09
[color=red]谢[/color]楼上的朋友顶,因为接下来的的内容比较枯噪,我还在酝酿怎么写得生动感性一点
先给大家来点感性的料,用ce搜索hp的值,在确定为XXXXX548这个地址后,打开内存编辑页面,可以看到如下表所示两行
第一行的红色50对应的就是我们的当前血量,这个数值会随着我们打怪而减少和恢复,第二行的绿色50则是我们的最大血量,升级时才改变.把后面的绿色50改成F0,再回到游戏看看是什么效果,在血量的显示条上变成了80/240,但是你的当前血量并不会增加,这个数值仅仅是显示数据,而当前血量是一直与服务器同步的.
114FA548 [color=red]50[/color] 00 00 00 00 00 00 00 00 00 00 00 64 00 00 00
114FA558 64 00 00 00 00 00 00 00 [color=green]50[/color] 00 00 00 00 00 00 00
顺便提一下,前段时间有些朋友进不了游戏,来问我什么原因,截图来看是登录时出错版本错误提示,大家在使用ollydbg更改程序后也会出现这个提示,因为WOW会在启动时对内存中的数据进行一次校验,如果发现被更改就给出这个提示.出现这样问题多半使用了外挂,本应该在完成登录后再启动的外挂,如果在登录前就启动了,因为外挂更改了内存的指令,所以就发生这样的问题.由此可见暴雪在防外挂这个事上还是挺用心的.
[[i] 本帖最后由 ht37 于 2007-12-13 09:10 编辑 [/i]]