WINCE的摄像头远程监控系统。在网上找到一个现成的摄像头驱动。可惜是试用版的。最后整个系统基本完工了,就是整个驱动由于是试用版,做了单次使用时间限制(驱动连续使用十多分钟就自动关闭)。郁闷 … 在网上倒腾了半天也没什么进展。最后迫不得已只能自己硬着头皮来试试看了。
IDA PRO。不管那么多了,down下来再说。安昂靡桓銎平獍妗9?/SPAN> 启动程序上居然有一个专门针对ARM处理器的动态链接库的反编译项:
ARM处理器的问题,都是想当然的当作x86处理器来思考的;更侥幸的是上面居然有专门针对dll的项。因为我手上的驱动文件就是dll文件)。不管了点击pocket PC ARM Dynamics 直接进去。哈哈。
一通默认下一步下一步后,终于进入到程序界面。它自己一通自动分析结束,才轮到我来探路了。
dll中引用的外部函数接口。通过主界面的页面选项中的import可以看到dll中引用了mmtimer中的timeSetEvent和timeKillEvent.大致理解起来明白了,dll的限时功能应该就是通过这两个函数来实现的。那么如果要这个限制功能,最彻底的就是不去执行timeSetEvent这个函数。
IDA PRO也不熟悉…. 郁闷中
再翻看主界面上的EXPORT选项,上面列出了dll中输出的函数接口。上面有个camstart。真正的摄像头驱动启动应该是这里开始的。双击这个函数,程序自动跳转到camstart对应的arm 汇编代码。
deviceIOControl,这个应该是USB接口操作函数,不管。下一个是timeKillEvent,哈哈这个是关闭定时器的。最后一个timeSetEvent,就是这个了。程序前面R0,R1,R2,R3应该就是timeSetEvent参数了。在网上查了一下timeSetEvent的参数说明,过不其然 哈哈,uDelay,fptc等一个不少。其中R0就是对应的定时时间了。
R0中的数值,这样可以调节限制时间。看程序上面的时间是0Xdb000,单位是毫秒。将之修改为0XFFFFFFFF.算下来都有34天多了。
IDA PRO倒腾了半天也没个进展(到现在也还不知道IDA 怎么修改代码,也许本来就不行????)。郁闷。突然想起以前用过的超级文本编辑器UltraEdit。哈哈 有招了。
UltraEdit打开这个dll的一个副本,根据IDA 反编译中调用timeSetEvent的程序地址在UltraEdit中找到对应的16进制代码(IDA中也可以显示arm 汇编代码对应的16进制执行代码)。剩下的就是修改指令代码了。
0XFFFFFFFF在arm的汇编代码中怎么表示,又不知道,卡壳了。在整个dll的代码段找找看,也许就是MOV R0,0XFFFFFFFF指令(按道理应该是有一个专门的文件来说明arm汇编指令对应的16进制指令代码的,只是一会没功夫,直接幸运的找到了这个指令)。找到这个指令,直接替换掉MOV R0, 0Xdb000这个指令对应的代码,保存。搞定,将修改过的dll文件放到wince系统中测试,过了原先的限制时间,摄像头仍然正常工作。
timeSetEvent不执行,那就不是说有34天的时间限制,就是34年也没问题了。斩草除根,彻底 哈哈
timeSetEvent的前一条语句插入一条跳转语句,跳转到调用timeSetEvent的下一条语句。我的做法是加入:
CMP R0,R0
BEQ XXX ; (XXX对应下下一条语句地址标签 )
BL timeSetEvent
没关系,老办法,在程序中搜索,哈哈找到了直接在UltraEdit中修改。保存。
wince中测试,一切正常。
到这里,整个的工作完成了。