返回信息流最近各种宅啊,都有些自责了!也因为实验室太热了,天天蜗在宿舍吹风扇,玩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,那就是你再怎么摆,球也不会动,如下图所示:
宅了这么多天,这游戏也玩通了,于是强迫自己今天必须来实验室了。当然,玩通其实大多数关还是靠实力,这是真的,请不要怀疑...
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #4039同步于 2011/7/11
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
手机平衡球通关心得
ColdZenLeft
2011/7/11镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复