2016年12月8日 星期四

废物利用老旧安卓平板流水账(一):解决ROM问题


家里有个常年落灰的老旧平板,这两天把他折腾了一番重新废物利用了起来,在此记录一下遇到的问题和解决方案。

老旧平板的安卓系统也已经非常老了, 为了更新系统我从网上找了个最新(多年前)的ROM更新到机器上,然后悲剧的发现触摸时x轴镜像了,原来能用的ROM又找不回来了。
不断下载了各个不同子型号的ROM仍然没有找到合适的ROM的我,决定使用相性最好的一个ROM,并手动解决这个ROMx轴反向像的问题。

要改ROM首先要能解包封包,这个板子是RK2918的方案,对应的解包封包工具在这个帖子有介绍。

我按照国内一个论坛的说法尝试首先尝试了修改build.prop的以下属性:accelerometer.hwrotationinput.hwrotationro.sf.hwrotation。然而这并没有什么卵用。

然后我尝试修改内核驱动,首先通过这个帖子的找到了解包boot.img的办法:打开winhex16进制搜索1f8b08 ,定位到zip头,然后把后面的数据都拷到新的文件。然而看了一圈并没有发现合适下手对象。

于是我把目光转向了system.img,并发现了合适的下手目标:libinput.so
把这东西拖给IDA,根据IDA的分析结果,在github上搜到这个安卓系统对应版本的libinput的相关代码:InputReader.cpp

注意void TouchInputMapper::cookPointerData()这个函数的这段:
switch (mSurfaceOrientation) {
  case DISPLAY_ORIENTATION_90:
    x = float(yTransformed - mRawPointerAxes.y.minValue) * mYScale + mYTranslate;
    y = float(mRawPointerAxes.x.maxValue - xTransformed) * mXScale + mXTranslate;
    left = float(rawTop - mRawPointerAxes.y.minValue) * mYScale + mYTranslate;
    right = float(rawBottom- mRawPointerAxes.y.minValue) * mYScale + mYTranslate;
    bottom = float(mRawPointerAxes.x.maxValue - rawLeft) * mXScale + mXTranslate;
    top = float(mRawPointerAxes.x.maxValue - rawRight) * mXScale + mXTranslate;
    orientation -= M_PI_2;
    if (mOrientedRanges.haveOrientation && orientation < mOrientedRanges.orientation.min) {
    orientation += (mOrientedRanges.orientation.max - mOrientedRanges.orientation.min);
    }
    break;
  case DISPLAY_ORIENTATION_180:
    x = float(mRawPointerAxes.x.maxValue - xTransformed) * mXScale + mXTranslate;
    ...
    break;
  case DISPLAY_ORIENTATION_270:
    ...
    y = float(xTransformed - mRawPointerAxes.x.minValue) * mXScale + mXTranslate;
    ...
    break;
  default:
    x = float(xTransformed - mRawPointerAxes.x.minValue) * mXScale + mXTranslate;
    ...
    break;
}
这段代码明显就是安卓应对屏幕的不同旋转方向映射触点坐标系到显示坐标系的代码了,只要在这里做修改即可解决x轴镜像的问题
接下来继续啃ida逆向代码,找到对应的x值和y值计算的部分:
 
实际上只需要把“xTransformed - mRawPointerAxes.x.minValue”和“mRawPointerAxes.x.maxValue - xTransformed”互换即可,这里如何逆向并找到相关汇编代码就不赘述了,这是另一个方向的技术了。光找到相应的汇编其实还不能解决问题,还需要一个ARM汇编器帮我们把想要的ARM汇编转换成我们需要patch的机器码当时在pediy上找到了一个,但是并不好用,这里感谢44同学提供的ARM汇编器帮我解决了patch的最后一步。

之后只需要把修改好的libinput.so替换到ROM里重新刷机即可完美解决x轴反向/镜像。
有了能用的ROM,下一篇流水账就是在ROM上继续折腾了。

5 則留言:

  1. 回覆
    1. 感谢麻衣捧场啊,折腾了一下模板才把回复留言功能弄出来,回复晚了

      刪除
  2. 折腾blogspot麻烦不=。。= 最近在想是把博客搞到这上面还是gayhub上。。。

    回覆刪除
    回覆
    1. 这博客也有年头了……有些记不住以前怎么折腾了。不折腾模板直接用现成模板倒是不麻烦,为啥想在墙外开博客啊?好像现在WordPress是主流

      刪除
    2. wordpress漏洞跟筛子似的。。而且太大众了。。
      已经决定自己从零折腾elm去惹_(:3JZ)_

      刪除