那个变速齿轮用Delphi怎么做啊?

InvidentXp 2002-11-17 10:26:34
那个变速齿轮用Delphi怎么做啊?
...全文
441 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
forgot 2002-11-20
  • 打赏
  • 举报
回复
大家不妨看看http://www.vrbrothers.com/cn/study/madebyus.asp,有兄弟工作组对“变速齿轮”的研究。
rwdx 2002-11-20
  • 打赏
  • 举报
回复
gz
dext 2002-11-19
  • 打赏
  • 举报
回复
有啦,金山游侠2002自带一个
InvidentXp 2002-11-18
  • 打赏
  • 举报
回复
还是不明白...

有没有Xp的变速齿轮?
dext 2002-11-18
  • 打赏
  • 举报
回复
还有一篇......................

“变速齿轮”再研究
提起“变速齿轮”(以下简称“齿轮”)这个软件,大家应该都知道吧,该软件号称
是全球第一款能改变游戏速度的程序。我起初用时觉得很神奇,久而久之就不禁思考其实现原理了,但苦于个人水平有限,始终不得其解,成了长驻于脑中挥散不去的大问号。
偶然一天在bbs上看到了一篇名为《“变速齿轮”研究手记》(以下简称《手记》)的文章,我如获至宝,耐着性子把文章看完了,但之后还是有很多地方不解,不过还是有了比较模糊的认识:原来齿轮是通过截获游戏程序对时间相关函数的调用并修改返回结果实现的呀。
为了彻彻底底地弄清齿轮的原理,我这次打算豁出去了。考虑到《手记》的作者从是研究的“齿轮”的反汇编代码的,那我也照样从反汇编代码开始。不过自认为汇编功底不够,又从图书馆借了几本关于windows底层机制和386汇编的书,在经过差不多两周的“修行”之后,自我感觉有点好啦,哈哈,我也有点要迫不及待地把“齿轮”大卸八块了!
在动手之前,我又把《手记》看了一遍,这次可就清楚多了:通过调用门跳到ring0级代码段,修改各系统时间相关函数的前8个字节为jmp指令,转跳到“齿轮”映射到2g之上的代码,达到截获对各系统时间相关函数的调用的目的。但同时我的疑惑也更明确了:
1.“齿轮”怎样建立指向自己映射到2g以上内存的代码的调用门描述符的;
2.“齿轮”怎样将自己的代码映射到2g以上线性地址的;
3.映射到2g之上的代码是怎样做到在代码基址更改的情况仍能正确运行的
带着这样的疑问,我正式开始了对“齿轮”反汇编代码的分析。工具嘛,不用说当
然是softice for windows98、w32dasm,ok,出发啦!
我的“齿轮”版本是0.221 for win98和winme的,内含有两个文件(变速齿轮.exe
和hook.dll)。先看看hook.dll里面有些什么,用w32dasm将hook.dll反汇编,看看它的输出函数:
?ghwnd@@3pauhwnd__@@a
?gnhotkey1@@3ka
?gnhotkey2@@3ka
?gnhotkey3@@3ka
?gnhotkey4@@3ka
?nhook@@3ha
?sethook@@yahpauhwnd__@@@z
?unhook@@yahxz
看函数名好象该dll只是安装钩子捕获变速热键的,与我的研究目的没太大的关系, 跳过去!
再看看变速齿轮.exe的导入函数,timegettim、gettickcount等时间相关的函数都
在里面。嘿,还有createfilemappinga和mapviewoffileex,看来“齿轮”是用这两个函
数创建映射文件的。以下列出几个关键的导入函数:
hook.?gnhotkey1@@3ka
hook.?gnhotkey2@@3ka
hook.?gnhotkey3@@3ka
hook.?gnhotkey4@@3ka
hook.?sethook@@yahpauhwnd__@@@z
kernel32.createfilemappinga
kernel32.getmodulefilenamea
kernel32.getmodulehandlea
kernel32.gettickcount
kernel32.mapviewoffileex
kernel32.queryperformancecounte
user32.killtimer
user32.sendmessagea
user32.settimer
winmm.timegettime
winmm.timesetevent
既然“齿轮”截获了timegettime,那我就跟踪timegettime函数的执行情况。
我先写了个win32 app (以下简称app),当左击客户区时会调用timegettime并将返回的结果输出至客户区。运行这个程序,打开“齿轮”,改变当前速度。
ctrl + d 呼出softice,bpx timegettime ,退出,再左击app客户区,softice跳
出。哈,果然timegettime函数的首指令成了jmp 8xxx 002a ,好f8继续执行,进入了“ 齿轮”映射到2g线性地址之上的代码。一路f8下去,发现接着“齿轮”把timegettime 首指令恢复,并再次调用timegettime,这样就得到了timegettime的正确结果,保存结果。“齿轮”再把timegettime首指令又改为jmp 8xxx 002a 。接下来都猜得到“齿轮”要干什么了!没错,将得到的返回值修改后返回至调用timegettime的程序app。
我仔细分析了一下,“齿轮”修改返回值的公式如下:
倍数*(返回值-第一次调用timegettime的返回值)
修改后的返回值=---------------------------------------------------+上一次修改后的返回值
100000
公式中“上次修改后的返回值”是自己猜测的未经证实,仅供参考。
代码分析已经进行一部分了,可我之前的疑问仍未解决,“齿轮”是怎么将代码映
射的?又是怎么得到修改代码的权限的?
既然“齿轮”中调用了createfilemappinga,我想其安装调用门,映射代码的初始
化部分应该就在调用该函数代码的附近。好,沿着这个思路,呼出softice,在createf ilemappinga处设置断点,将“齿轮”关闭后再运行。softice跳出,停在了createfile mappinga处,f11回到“齿轮”的代码。看到了“齿轮”调用createfilemappinga的形式
如下:
createfilemappinga(ff,0,4,0,10000,0);
可见“齿轮”创建了长度为0x10000的映射文件,继续,“齿轮”接着又调用
mapviewoffileex,调用形式如下:
mapviewoffileex(edx,2,0,0,0,eax);
//edx为createfilemappinga返回的映射文件句柄
//eax为申请映射代码的基址,第一次调用时eax为0x8000 0000
这里就是关键了,“齿轮”要将映射文件映射至基址为0x8000 0000 的内存空间中,可并不见得windows就真的允许其映射呀?果然,“齿轮”在在调用之后判断返回值是否有效,无效则将上次申请的基址加上0x1000,再次调用mapviewoffileex,一直循环到成功为止,再将返回的地址保存。
接下来“齿轮”将原“齿轮”exe中的截获api的代码逐字节拷贝到映射区域去。至
此,“齿轮”已经将关键代码映射到2g以上线性地址中了。
我再f8,哈哈,和熟悉的sgdt指令打了个照面。“齿轮”保存全局描述符表线性基 址,再用sldt指令保存局部描述符表索引,计算出ldt基址。接着呢“齿轮”在局部描述表中创建了一个特权等级为0的代码段指向需要利用ring0特权修改代码的“齿轮”自己的代码,并把局部描述表中索引为2的调用门指向的地址改为“齿轮”映射到高于2g的代码。
然后“齿轮”依次调用各时间相关的api,保存其返回值留做计算返回时结果用。
“齿轮”又依次调用映射到高于2g的代码修改各api的首指令。到了这里,“齿轮”的初
始化部分就结束了,只等着还蒙在鼓里的游戏上钩啦,哈哈!
结束代码只不过是作些恢复工作罢了,仅仅是初始化代码的逆过程,所以就不再
赘述(其实是我自己懒得看了,^_^!).
至此,我对“齿轮”的加速原理已有大致的了解,深刻感受到“齿轮”代码的精巧, 所以觉得有必要将"齿轮"中所运用到的一些技巧作一个总结:
1.基址无关代码的编写
姑且以上面一句话作标题,^_^。看了“齿轮”的初始化代码,知道其映射代码
的基址差不多是随机的,那么“齿轮”是怎么保证映射后的代码能正常运行的呢?如果 代码是完全顺序执行的倒没什么问题,但如果要调用自己映射代码中的子程序呢?呵呵,就只有运行时计算出子程序的入口地址并调用了,不过还是要先得到映射代码所在的地址才行。“齿轮”简单地用两条指令就得到当前正在执行的指令的地址,具体如下(地址为假设的):
0:0 call 5
0:5 pop esi
现在esi中的值就是5了,哈哈!
这里的call用的是近调用,整条指令为e800000000,即为调用下一条指令.所进行
的操作只不过是把下一条指令的地址入栈而已.再pop将返回地址(即pop指令本身的地址)取出.
2.修改调用门,生成jmp指令,修改代码
这些都是高度依赖于cpu的操作,技巧性也很强,主要是钻了操作系统的漏洞。比如“齿轮”就是用sgdt,sldt获得全局和局部描述符表基址来安装调用门,通过访问调用门来获取ring0权限作一些平时不为系统所允许的操作;而cih病毒是用sidt获得中断描述符表基址安装中断门然后出发软中断获取ring0权限的,原理都是一样的。这些在水木上讨论过很多遍,大家都很熟悉,所以也就不敢班门弄斧,写到此为止。
3.64k代码编写
由调用createfilemappinga函数参数可知“齿轮”只映射10000(64k)大小的
区域,所以其映射在2g之上的代码和数据决不能大于64k。我想作者之所以选择64k为映射区域的大小,可能是与调用子程序或数据时容易计算地址有关。在映射代码的任意一处得到当前指令地址之后将其低16位置0即可得到映射代码的基地址,再加上子程序入口或数据的偏移即可求得其绝对地址。

我的评论:
一句话:佩服“齿轮”的作者王荣先生。
“齿轮”的代码表现他对windows运行机制的深刻理解以及深厚的汇编功底还有丰
富的想象力。对我来说“齿轮”仿佛就是一件精美的艺术品,每个细处都很值得玩味一 番,所以我才在看过“齿轮”代码之后有了把我的分析过程用笔写下来的冲动。但同时 我又不得不承认“齿轮”的功能的实现是依靠其高度技巧化的代码实现的,换句话说就 是这种的方法局限性实在是太大了。不就是截获api嘛,用的着这么麻烦吗?
为了证实自己的想法,我在codeguru上直接找了个hook api 的代码,该代码是通过安装wh_cbt类型全局钩子在所有被插入dll的进程中修改进程pe映像的输入节达到截获api的(这种方法在《windows核心编程》中有详细说明)。把代码稍做修改,就能工作了(在星际争霸下试过,可以改变游戏速度)。尽管只在98下试过,但我觉得肯定也能在2000下用,因为代码中只用了一两句汇编指令,而且整个程序都是在ring3下运行的,没有作出什么出轨的举动。当然这种方法也有缺点,就是对用loadlibrary加载winmm.dll再用getprocaddress获取timegettime地址的api调用不起作用(原因在《windows核心编程》中有说明)
dext 2002-11-18
  • 打赏
  • 举报
回复
我没有做过,但有几篇文章,你看看吧!
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

关于变速器的讨论

--------------------------------------------------------------------------------

由於有機會跟龙族的小龙喵連絡上
介绍了我们開發加速器的動機及經過..以下是部分談話內容
在这里,我们希望通过这次谈话的内容,能让大家对于网络游戏中使用变速器有个更深层次的思考,也表明了我们工作组的立场,那就是“不支持在多人游戏中使用变速器来作弊”

很像是在採訪我們 ^^
===========================================================
(2001-04-06 21:33:40) Sophie
你們開發的變速齒輪是可以針對遊戲開發加速程式
還是都通用的呢?
(2001-04-06 21:28:30) 巴巴羅薩
這個程式(在大陸叫“程序”^_^)是通用的
(2001-04-06 21:36:24) Sophie
你們兩個人一同開發的嗎 還是有更多成員呢?
有辦法防止嗎? 台灣市面上流通的加速程序...有三種..都是大陸開發的
(2001-04-06 21:31:25) 巴巴羅薩
我單獨開發的
加速程序不太容易制止,我想過,但是沒有辦法
===========================================================
(2001-04-06 22:32:49) Sophie
我們的討論區 最近很多人在那邊抗議有玩家用變速齒輪程序的
(2001-04-06 22:35:41) Leo945
不好意思,給你們帶來麻煩了。
不過有的玩家還在不斷催我們做更新的變速器呢
(2001-04-06 22:39:47) Leo945
龍族嗎???
(2001-04-06 22:41:10) Leo945
可是我也很期待的一個大作啊!
被我很多朋友(玩圖形MUD的)都譽為最值得期待的圖形MUD
(2001-04-06 22:52:36) Leo945
龍族在台灣已經上市了嗎?
那麼大陸什麼時候開始收費?
龍族大陸玩家的數掐可以和台灣玩家的數掐進行漫游嗎?
(2001-04-06 22:53:06) Sophie
no...是分開的...所以目前對於加速程序很頭疼
(2001-04-06 23:14:21) Sophie
那如果你們想玩龍族 是否能在程式裡面加一個判斷
讓是玩龍族的不能用呢?
不然 鐵定不能好好的玩到龍族的
(2001-04-06 23:14:34) Leo945
其實,從一個玩家的角度來說,我是非常非常反對在網絡游戲中使用加速器,本
來上網玩游戲最大的吸引就是公正公平,大家在一個公平的環境中游戲、練功。
你應該知道“千年”吧,我這學期開學用我可怉的網速從網上當了一個千年,本
來准備好好玩玩圖形MUD,可是當我登上去發現上面有很多人一開始就跑得飛
快,而且網絡速度也奇慢,我上了網站一看才發現是一個叫“變速齒輪”加速的
結果。
然后我就對這個游戲失去了興趣,一個多人游戲,如果不能保証游戲的公平性,
就毫無吸引人之處(不知道你們有沒有這個感覺)。
所以,我一怒之下放棄了這個游戲。
但是當我發現網上“變速齒輪”的下載量非常驚人,我就就告訴了我們的褚瑞
(絕對的技術狂),讓他研究一下這個變速的技術。本來我們并沒有打算自己作
一個,褚瑞也只不過想了解一下這個技術,可是他到了齒輪的主頁,發現作者對
于變速的技術細節只字不提,這下褚瑞就來劲了,他對我說,一周時間,我們要
有自己的變速器。
(2001-04-06 23:19:07) Leo945
結果,當天晚上,一台電腦,一杯咖啡,一個通宵。褚瑞就把齒輪給反匯編了,
而且對于齒輪使用的技術也搞清了(在技術上我极其佩服褚瑞)
不到一周,我們的兄弟變速器就誕生了,而且用的技術和齒輪截然不同,這是因
為褚瑞不願意用別人使用過的技術。
正好我剛對工作組的主頁改版,就在宣傳主頁的同時,順便宣傳了我們的兄弟加
速器,結果出乎意料,開始反響不大,但是隨
知道的人越來越多,我們的訪問量就像滾雪球一樣越來越大,關注我們的朋友也
越來越多。
我真有種哭笑不得的感覺
………… 待續 (快完了,請耐心)呵呵
(2001-04-06 23:16:09) Sophie
那你們開發加速程序 也不過是這一學期的事嚕?
(2001-04-06 23:23:01) Leo945
你的問題剛才我發現自己已經回答了
毫不夸張的說,從知道有變速這個創意,到變速器出爐,真的只有不到一周的時
間,其實真正的開發就是那個不眠之夜

本來自己是最反對使用變速器的,可是最終我們卻自己作出了變速器。所以,我
們堅持共享了全部源代碼,目的就是讓大家知道我們的變速器是如何制作的,也
希望一些圖形MUD公司能夠利用變速的原理可以進行必要的防范措施。
不過,我還是覺得變速器是一個我們很值得驕傲的程序,而且用它來加速單機游
戲是一件很好玩的事情
(2001-04-06 23:27:47) Leo945
至于龍族(還有好多別的網絡游戲),我已經給褚瑞說了,能不能根掐具体情況
在服務器端判斷是否使用變速,但是目前來說不是很好解決。
首先,讓我們自己有種 吃了原告吃被告 的不好的感覺,^^
其次,在技術上也又很大的困難。

真的不是很好辦,就算我們可以針對自己的變速器作個判斷,但是變速齒輪我們
如何判斷?我們共享了源碼,以后出現了新的變速器我們如何判斷?所以,堵并
不是辦法
(2001-04-06 23:25:20) Sophie
我今天問過褚瑞 他說沒辦法防 ><
(2001-04-06 23:28:42) Leo945
是的 他也告訴我了
(2001-04-06 23:29:26) Sophie
那 被捉到肯定會砍帳號的
開發並且共享程式碼 是對大家都沒好處的
玩家 廠商 代理商

你們有收費的打算嗎? 你們有從中得利嗎?沒有的話
我看不出那邊有人有好處 只有投機者沒有被捉到砍帳號的有好處
好好的一個遊戲 韓國那邊沒有人用加速器 一到台灣大陸
就一堆玩家使用..蠻糟的

(2001-04-06 23:35:50) Sophie
目前的狀況是...韓國工程師有沒有去看你們的程式碼我就不知了...
在韩国工程师防止前 ...游戏本身游戏环境被破坏了而忠实玩家的心都已经碎了
(2001-04-06 23:42:00) Leo945
如果說我們從中得利的話,就是憑
這個程式我們認識了很多高手朋友,而且對于我們工作組是一個非常好的宣傳。
至于經濟方面,我們雖然很想如何利用我們的技術為我們自己和工作組帶來一定
的經濟效益,但是現在這并不是最主要的,也不是我們最關心的。
我和褚瑞的身份你也許并沒有注意
所以,目前技術﹢朋友是我們最大的也是最渴求的財富
(2001-04-06 23:43:01) Leo945
我和褚瑞在長沙一個學校,一個班的,隔壁宿舍
(2001-04-06 23:43:33) Sophie
嗯...對於懂程序的人來說是個很好的交流機會
但對那些不懂得好好玩遊戲的網友來說是個可利用的投機機會...
對他們來講 有人寫好好的程式能用就拿來用
然後一邊用還一邊罵原廠開發者無能擋不了 罵代理商無能
管不了捉不完
罵開發加速程序的人沒品無恥...被停帳號後就隨便又破口亂罵
老實玩家就只能灰心搖搖頭離開了

(2001-04-06 23:46:46) Sophie
我對程序方面都不懂..
不過龍族在大陸開放beta測試,大家如都用加速 那麼遊戲環境變糟,
就將會沒有口碑了

(2001-04-06 23:51:38) Leo945
我知道,我也在很多網站上看了這些留言,自己感覺也很沉重

你知道嗎?大陸最出名的游戲修改工具“金山游俠”最新版據說就有游戲變速的
功能。所以我只能說,我們的變速器真的是從善意的角度出發,讓單機游戲變得
更快,讓網絡游戲的商家更加重視這個問題(畢竟我們公布了源代碼,讓商家可
以根據代碼解決問題)。就算我們的變速器不出,變速齒輪也會繼續的開發下
去,到時候網絡游戲商家連破解都要自己動手了,而我可以說,褚瑞的技術是一
流的,他能很快破出來並不意味所有的商家都能很快破出變速齒輪。

(完)
zuizhu 2002-11-18
  • 打赏
  • 举报
回复
1.得到VM句柄
2.由hVM得到sidt(中断描述表的基址)
3。修改一个中断的地址,把它指向自己
4,调用此中断,使自己的程序从3层跳到0层
5。获取更大的权限后,加速CPU的始终频率,实现加速。
6。机器报废。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧