Android逆向工程实例 -- 善领安卓版DSA APP手势操作bug修复

  善领官方网站发布的DSA软件(安卓版)及网络上流传的其他版本,均发现手势操作会导致进程崩溃的问题。查询相关网页信息都提出是官方软件本身的问题无法解决。
        尝试使用逆向工程跟踪调试了一下,发现善领的DSA整个project较简单且手势相关function并没有封装到内部so。稍微修改后问题解决。 

简单记录步骤如下:

         1.确定DSA在Android中进程名称,方便后面跟踪。
                -- PC端运行DDMS在手机正常连接后操作手机打开DSA软件,可发现多出了 com.dsa 的活动进程

         2 .开启打印logcat,操作DSA软件的手势功能触发异常。来最终确定程序异常的真正位置。
                -- PC端开启Logcat,过滤方式为只追踪com.dsa,操DSA软件故意触发手势异常退出  。
                    在打印信息中可发现手势操作时com.dsa进程会引发系统错误,位置在package的com.dsa.q类的run()方法
                     
***非官方版DSA的logcat信息中类名略有不同,在 com.dsa.t 类的 run() 方法 *** );
                -- 被强制退出的 Activity UI是MainPage类,也就是DSA软件主界面。
     
         3 .确定了异常位置后就是反编译出此位置的java代码,查看代码逻辑
                -- 用7z或rar直接打开DSA apk,使用dex2jar工具将虚拟机执行档classes.dex转换成jar包。
                   使用JDK最终反编译jar成java源代码。 在com.dsa package中找到MainPage.class和q.class(或t.class)
                -- q.class(t.class)只是一个简单的定时器工具类,它的run()方法会按排程执行MainPage.i()对象的dismiss()
                    是这个地方引起进程崩溃的。
 
                   MainPage.class中和触屏手势相关的代码在凭经验可断定在onTouchEvent()方法中,查看代码原理为
                   通过坐标轨迹判断是否为←↑↓→四个手势,如果是则通过service做相应的音量减小,音量增大,上一首歌,
                    下一首歌等动作。

                --  截图是MainPage.class音量增大相关代码块,流程为调用W()方法初始化PopWindow X对象-->X对象显示
                    上箭头图标--> 创建 q.class(t.class)对象-->使用Timer延迟long 800后执行q.run()方法关闭PopWindow X
                    -->+系统音量-->判断当前音量是否最大,非最大则调用serivce播放后台提示音音量增大,如最大则调用
                    serivce播放后台提示音音量已最大。
                -- 再查看W()方法代码发现只是对Popwindow X的初始化动作为主,而且在代码最开始有if(X!=null) X.dismiss()
                    关闭Popwindow 
      
          

         4 . 了解代码具体逻辑后,尝试以最小改动流程避开bug 
                --  从MainPage类中可以知道调用q.class(t.class)主要作用是延迟执行dismiss来关闭手势操作后的
                    显示的箭头窗口(popwindow X);
                    尝试去掉调用q.class和定时器相关代码重新编译观察还是否程序手势操作异常
                     在上图红框区代码中去掉如下:
                            t localt4 =new t(this);
                            new Timer(false).schedule(localt4,800L);

                   去掉以上代码后关闭PopWindow X的动作自己要添加
                     在上图红框区代码中最后一行添加:
                            W();
                 -- 其余三种手势操作代码的修正方法类似 
 

          5 . Fix方法确立以后,后面是真正unpack apk 和 fix smali 机器码
                --  使用apktool解包DSA apk在解包目录smali/com/dsa中编辑MainPage.smali
                --  调用q.class和定时器相关java代码对应的smali机器码代码如下灰色部分,删除掉。
     
                --  最后添加调用W()关闭PopWindow X,对应的smali机器码最后添加如下代码。
                    至于为什么是这两行可以在MainPage.class里先找到原来调用W();的位置,拷贝过来。

                --  其他三种手势修改smali机器码方法类似
           6 . smali 机器码修改完就可以再编译打包成apk了
                --  使用apktool打包之前解包的DSA目录,将生成的新apk签名后再安装到手机就OK啦。
    
            修改好的DSA APK有放到网盘 http://pan.baidu.com/s/1mggIfdm
                --  善领DSA官方版: 1.添加720,1080高清分辨率;2.修复手势操作崩溃问题    
                --  善领DSA修改版: 1.添加720分辨率;2.修复手势操作崩溃问题
           

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android DSA 官方使用说明 (转自网络,不完整,只是一个简单说明). p z9 I: h `8 X$ S: x* f 说明:Android DSA是由惠州善领科技有限公司独立开发,软件主要基于Android 2.1及以上平台的手机及MID上使用,支持320X240、480X320、800X480、854X480、960X640、1024X600等分辨率!依托善领强大的全国道路安全驾驶信息数据库,软件的主要功能是安全驾驶预警,为用户提供及时的安全驾驶提示服务,让你远离超速远离罚单!软件还可通过蓝牙连接方式与雷达连接,实现预警流动测速雷达! 一、安装说明 1、当你下载完安装文件包后,解压可以得到两个文件,分别是dsa文件夹及DSA.apk。 2、将这两个文件复制到存储卡的根目录下(非常重要),完成后通过手机上的文件管1 i: z! ^( k* [: C# W( | 理找到DSA.apk,点击即可安装,安装完成后可在应用程序位置看到善领的LOGO图标。点击就可以使用了! 3、您也可以通过91助手及豌豆夹手机精灵来安装DSA,前提是DSA文件夹必须复制到存储卡的根目录下!0 y5 ]8 }$ @& L5 g# h+ [/ E 4、点击DSA图标即可运行% [. c% K5 r9 n0 u, D: S 5、数据升级 Android DSA软件与Wince DSA采用同一数据文件;Android DSA新数据采用在线升级方式,每星期五下午我们会提供最新数据升级,如果您的设备已经打开WIFI或GPRS上网,运行DSA时将会自动检测新数据,并弹出升级提示。4 A' s# z" D3 z
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值