Diablo2 在创建游戏的时候,首先调用d2game.dll中的InitRandom这个函数,在InitRandom函数中,通过QueryPerformanceCounter等手段设置随机数的初始值R0(64位)。因此可以认为,这个初始化应当是十分随机的。
随后,执行下列步骤:
1、使用R0初始化MonsterRegion,同时R1=Rand_Step(R0);
2、使用R1初始化objrgn,同时R2=Rand_Step(R1);
3、使用R2初始化sunitproxy,同时R3=Rand_Step(R2);
4、使用R3初始化QuestReward,同时R4=Rand_Step(R3)
至此,各种随机因素初始化完毕。
因此,可以认为,在Client端,登入游戏的那一瞬间,Server会将大量的游戏数据发送给Client,不排除这其中存在R0~R4的情况。如果存在R0~R3任何之一,那么可以在游戏开始的时候,通过捕获R0~R3,从而可以推断出最后敲石头的报酬将会是多少~~~
Server将R0~R3发送给Client应当是可能的,因为Client要根据这些随机数重现场景、怪物等。
一个可能的途径就是修改maphack程序,捕获所有Server发送过来的包,分析其中是否含有随机数数据。如果有,那就OK了~~ |