以下是引用云中岳在2006-5-22 13:11:26的发言: 每个游戏都有自己的计时器,作计时器不外乎下面这几个函数 SetTimer(),TimeSetEvent(),GettickCount(),TimeGetTime();另外一个就是用VxD驱动来利用系统提供给驱动程序的计时器接口实现计时器 现在的网游都是通过调用ApI函数来实现计时器功能的 一、对于用SetTimer函数和TimeSetEvent函数做计时器的游戏非常容易搞定 直接修改delay参数,方法有很多,如HOOK;或直接反汇编修改主文件 (不过一般的网游都有自检验功能,如何去除自检验功能不在本主题内) 二、对于GetTickCount()和TimeGetTime()就比较难一点,一般要动态跟踪调试(如果你现在不会汇编,也不会动态跟踪调试,那就先回去学吧) 才能有个大致的了解,下面是我分析奇迹(MU)的过程: 进入游戏,带稳定后Ctrl+D,呼出SI,bpx GetTickCount,G 马上就会断下来,因为计时器函数调用非常频繁,F12,返回到了main.exe领空, loop: 记住这次调用的地址。继续 G, 又断了下来,记地址,继续 G jmp loop 好了,跳出死循环,让我们回头看看刚才赶碌牡刂罚?呛牵?涫狄簿湍敲醇复β铮。浚浚。『昧耍?俅蜧.夷???是不是发现吊线了? 退出游戏再来一次就好了(这里我有个想法,有时候进游戏是不是没发现一个怪,也没看见一个NPC,就自己一个人孤零零的在里面跑,所以如果我们可以让他永远不掉线,这样我们动态调试起来就方便多了,具体方法我还没搞定,知道的兄弟不要忘了告诉我哦) 好了,我们继续分析,呼出SI,bpx GetTickCount,G 不过这次我们要注意的不是调用的地址了,而是寄存器的变化,通过仔细观察我们会发现,GettickCount的返回值放在了eax,edi eax里面是最新的,而edx里面是上次调用时的返回值,然后就会有一个 sub eax ,edx的动作,接着就不用想了,肯定是 cmp eax,xxx jl Label 这样的比较了 好了,到这里我们眼前是不是柳暗花明又一村了??既然edi里面放的是上一次调用GettickCount的返回值,那我们就仔细再跟踪一次,看看他在哪个地方执行存放动作的,呵呵,非常容易吧?(这里我不说出地址,免得害了那些拿来主义者),接下来该怎么办?如果你还想不到那我也没办法了。。。。(该行吧) 当然是修改edx里面存放的值啦,好,下一步的工作就是修改代码了,这里你可以用内存不定技术,也可以直接修改main.exe文件,我是个懒人,懒人当然是直接修改了。 好,退出右下,打开OD(千万不要问我OD是什么,我会晕倒的),加载 main.exe,还记得是在哪个地方存放GettickCount返回值到edi里面的吗? 先假设这个地址是00401111。好,ctrl+G,来到那个地方,我们在.text段里面找一块干净的地方干坏事吧(干净的地方在哪里?当然是这个段的尾巴上面啦)好,我们选择从00408888(你可别真选这个地址哦,这是我随便写的)我们把00401111出的代码mov edi,eax修改一下,改成jmp 00408888 (----哎呀,下面那就也nop掉了,-----没关系啦,下面我们在不上来就是) 好了,ctrl+G,来到00408888处,添加代码 mov edi,eax(不上刚才在00401111处被修改的那句) sub edi,xx(这个值就是加速的关键,我用的是28,好快啊,秒杀怪^_^) MOV EAX,DWORD PTR DS:[xxxx](不上刚才给我们nop的那句) jmp 00401116(现在当然要跳回去啦) 好了,在OD中右键,复制到可执行文件,保存刚被我们修改的main.exe 将我们修改的main.exe替换以前那个main.exe 运行游戏,哈哈,是不是一阵狂飙啊!!! 好了,给你一点忠告,不要在里面太嚣张,低调一点的好.
0 W. A9 A7 W' k @0 q- {4 s T
1 ]7 t3 T* e1 a0 o
0 P, z: H5 Z1 L; W( i
) {! l% }- b$ l+ b# B; }
( {2 y# Y% q/ n& G& g. }* x主题最新回顾(发布时间:2006-5-23 5:01:41) | ' g: X4 G: r: I# c7 d. H
5 j" G( b' ]7 w& j. s. D( [2 R; `$ |0 t) r# v
& j( \. T: ~! `) E-- 作者:风轻狂 -- 2 J E0 t, |: T0 d B
天下无双情况比较特殊,一般的方法都不灵
: |* T, E& `: U: z现在天下的时钟加速程序是对NtQueryPerformanceCounter下的手 - t) v( P# r# J1 u
Windows的服务运行于驱动层,做起来确实比较麻烦 | $ h) v, n- `+ L5 d6 j7 z
学习学习。。。。
. j3 C; s8 s3 E& m7 p |