BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #4039同步于 2011/7/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖

手机平衡球通关心得

ColdZenLeft
2011/7/11镜像同步6 回复
最近各种宅啊,都有些自责了!也因为实验室太热了,天天蜗在宿舍吹风扇,玩DNF,有时候半夜三更玩平衡球。要说不该这么堕落,都是要找工作的人了,该看的书什么的都不看,很紧张啊! 说道平衡球,我之前中奖得了个酷派手机,里面有个自带的游戏平衡球,属于休闲解闷的,居然玩上瘾了。前段时间,玩到大概50多关的样子,实在是再也过不去。我试了很多办法,甚至让悬赏饭找宿舍以及同学认识的高手通关都未果。问题还得自己处理,所以以下就是我处理的过程。 首先吧,说说平衡球这个游戏的规则。就是,由手机里面的硬件重力感应一类的玩意决定,然后通过你的控制让铁球碰到数字,必须按照顺序从1到末(比如16、25、34等)。 另外还得顺便说说,酷派这款手机是Windows手机操作系统,但是它不是Windows Mobile,也不是WinPhone7,而是介于它们之间的一款感觉广谱度并不高的Windows CE6内核操作系统。 这里我就知道得也不全,简单的说吧:Windows Mobile(WM)严格说内核是CE5,这个CE5内核有点像Windows 9.X内核,而CE6以及WP7应该说就是差不多的内核,有点像NT架构那种,传说中的“双重隔离”(用户模式和内核模式隔离,用户模式之间彼此隔离),这个是CE5不具备的。CE5管理很乱,搞过Windows手机的人可能都知道什么SetKMode之类的函数,可以写DLL内存,以及写高位内存甚至是内核内存,但是CE6不行,就像你Windows系统也不能直接访问0x80000000以上的地方一样。扯淡了这么多陈年技术了,其实估计没人学这些了,反正我就是感觉酷派偏偏就是所谓的CE6手机,感觉貌似有点稀罕,不过品牌方面一直文盲,大牛路过请无视。 好吧,现在回到怎么玩平衡球了。平衡球,如果我想过关,要么直接输入什么类似于“上上下下左右左右”的办法,要么就是吃错了数字不会复位,要么就是改时间或者改重力加速度。至于秘籍,我还真的找到了一个配置脚本,经过简单的研究,真直接跳到了60多关。不过这个游戏是阶段难度,也就是说,第六阶段的第一关难度可能不如第五阶段的最后一关,显然我这么做感觉有点简单,毕竟我还是想挑战下自己的游戏技术嘛。但是吃错球不会死这个我试验了很多办法,最早估计是memcpy导致的,后来发现不是,在这点上我有点笨,想不出来如果说真的要编程的话我们应该怎么编,所以也不好确定怎么下手最好。最后就是改时间,这个真的可以,我后来测试可以通过程序,把时间调到正规的1/10秒,但是我感觉操作起来其实一点都不容易,因为重力加速度还在,手稍微抖一下,你吃错了就完了。 于是乎,不满足改脚本这种太无聊的办法,放弃了乱吃不会死的思路,舍弃了改时间这种不易操作的办法,我最后选择是:改重力加速度! 总该是有个类似于获得重力加速度的办法吧?于是乎我查了下酷派的编程文档,还真找到个相关的,第一是酷派提供了一个例子和接口,就是和重力加速度有关,有一个API由accelerator.dll导出,叫GetAcclerator,这个东西很符合“要求”,但问题是,我通过逆向平衡球游戏的EXE发现,其实它就压根没有调用过GetAcclerator...⊙﹏⊙b汗 不过,这可能说明,GetAcclerator本来就是一个马甲,里面其实有更深刻的东西,于是乎我逆向分析了一下: EXPORT GetAcclerator GetAcclerator lpOutBuf= -0x34 nOutBufSize= -0x30 lpBytesReturned= -0x2C lpOverlapped= -0x28 OutBuf= -0x24 var_23= -0x23 var_22= -0x22 STMFD SP!, {R4-R10,LR} SUB SP, SP, #0x14 ; lpOutBuf MOV R6, R2 MOV R7, R1 MOV R8, R0 LDR R0, =aAcc1 ; "ACC1:" MOV LR, #4 MOV R10, #0 MOV R3, #0 ; lpSecurityAttributes MOV R2, #0 ; dwShareMode MOV R1, #0 ; dwDesiredAccess MOV R5, #0 STR R10, [SP,#0x34+lpBytesReturned] ; hTemplateFile STR R10, [SP,#0x34+nOutBufSize] ; dwFlagsAndAttributes STR LR, [SP,#0x34+lpOutBuf] ; dwCreationDisposition BL CreateFileW ; 特别注意这个CreateFileW,以及ACC1,这里估计就是申请设备文件的句柄 MOV R4, R0 CMN R4, #1 BEQ loc_1000117C ; 判断函数调用情况是不是失败 //... MOV R3, #0x220000 ORR R1, R3, #4 ; dwIoControlCode MOV R3, #0 ; nInBufSize MOV R2, #0 ; lpInBuf STR R10, [SP,#0x34+lpOverlapped] ; lpOverlapped STR R10, [SP,#0x34+lpBytesReturned] ; lpBytesReturned STR R10, [SP,#0x34+nOutBufSize] ; nOutBufSize STR R10, [SP,#0x34+lpOutBuf] ; lpOutBuf BL DeviceIoControl ; 好吧,这里就是亮点,估计搞Windows内核的人都明白了吧 CMP R0, #0 其实,就是一个创建设备句柄,然后访问内核,这就是重力加速度获得的办法...我应该怎么改呢?首先注入一个DLL,HOOK IAT DeviceIoControl,然后这就是HOOK IAT的代理函数代码,这个说明一下,获取重力加速度的操作码是0x220000,所以我就以这个来判定,另外这里不处理Z轴,貌似没有必要: __declspec(dllexport) BOOL __stdcall My_DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, __inout_bcount_opt(nInBufSize)LPVOID lpInBuf, DWORD nInBufSize, __inout_bcount_opt(nOutBufSize) LPVOID lpOutBuf, DWORD nOutBufSize, __out_opt LPDWORD lpBytesReturned, __reserved LPOVERLAPPED lpOverlapped) { BOOL bRet = FALSE; bRet = ((DEVICEIOCONTROL)g_Proc_DeviceIoControl)(hDevice,dwIoControlCode,lpInBuf,nInBufSize,lpOutBuf,nOutBufSize,lpBytesReturned,lpOverlapped); if( dwIoControlCode == 0x00220000 ) { BYTE bX,bY,bZ; bX = *(PBYTE)lpOutBuf; bY = *(PBYTE)((PBYTE)lpOutBuf+1); // bZ = *(PBYTE)((PBYTE)lpOutBuf+2); int iX,iY,iZ; iX = (int)bX; iY = (int)bY; //锁定重力加速度 //00000000 (8位) if( iX<=0x80&&iX>=g_MAX_A ) //X为正 { memset( (char*)lpOutBuf,g_MAX_A,1); } if( iX>0x80&&iX<=255-g_MAX_A+1 ) //X为负 { memset( (char*)lpOutBuf,255-g_MAX_A+1,1); } if( iY<=0x80&&iY>=g_MAX_A ) //Y为正 { memset( (char*)lpOutBuf+1,g_MAX_A,1); } if( iY>0x80&&iY<=255-g_MAX_A+1 ) //Y为负 { memset( (char*)lpOutBuf+1,255-g_MAX_A+1,1); } // iZ = (int)bZ; // DLLPrintString(L"Coordinate = %d %d %d",iX,iY,iZ); // DLLPrintString(L"nOutBufSize = %d",nOutBufSize); 每次恒定返回为3个数的值 } return bRet; } 好吧,然后我在电脑上编了个程序,通过TCP通信的方式和手机里面一个程序来合作控制平衡球的重力加速度:比如我可以设置X轴为0,Y轴为不到5,球就灰常缓慢地只在一个方向移动,对于某些关过分密集的像迷宫一样的球阵非常好。当然我可以设置X轴和Y轴都为0,那就是你再怎么摆,球也不会动,如下图所示: 宅了这么多天,这游戏也玩通了,于是强迫自己今天必须来实验室了。当然,玩通其实大多数关还是靠实力,这是真的,请不要怀疑...
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
ingenious机器人#1 · 2011/7/11
矮油 我记得lz是北交的呀
ColdZenLeft机器人#2 · 2011/7/11
只能说,你对我的诡异情况了解得不够多,嘿嘿。。。不过那没有什么好说的!佣兵,就是这个解释
ingenious机器人#3 · 2011/7/11
哈 确实不多.. 佣兵imba
shuanshuan机器人#4 · 2011/7/11
太长了,佩服LZ精神
handspeaker机器人#5 · 2011/7/11
imba……lz把自己本行发挥的淋漓尽致!
hihuang机器人#6 · 2011/7/11
imba,赞心得