控件的点击事件作为分析App算法的入口,在逆向中占据举足轻重的地位。如果要找到对应的点击事件,首先要找到控件的定义。那么问题来了,如何能够快速地找到控件的定义呢?
实验说明
实验选取唯品会App,以“忘记密码”功能为例,利用UI Automator Viewer进行分析。
分析
uiautomatorviewer.bat位于Android SDK/tools目录下,点击运行,把设备停在登陆界面,点击左上角第二个按钮,对当前界面进行布局分析,效果如下:
从分析结果可以看出TextView的id是btn_findpassword
,这个id非常关键,后面就是用id进行跟踪。下图是登陆界面的详细布局:
因为有TextView的id,找到对应的id值后可以用id值进行全局搜索来查找TextView的调用情况。反编译APK后,APK所有的资源id/id值都会保存在public.xml,public.xml放在values目录下。反编译后的代码中不会用R.id.xxx
的形式访问控件,而是用转化后的id值(十进制),所以先用btn_findpassword
去public.xml中找到对应的十六进制id值:
注意:这里在查找btn_findpassword
对应的id值时,发现有多个匹配项,需要用type
字段区分。type
字段有多种取值,例如:layout
,drawable
,string
,attr
,id
,因为TextView是控件所以type
字段取id
。
直接在Android Killer中全局搜索:
打开Jeb,找到控件对应的点击事件:
双击跳转,找到“忘记密码”的实现逻辑,分析完毕。
总结
逆向过程会发现工作量非常庞大,对于逆向来说非常艰难,还好有一些强大的工具可以快速地定位问题,下面就来总结本文收获的知识。
对于逆向中想得到的控件点击事件入口,可以通过以下步骤进行:
- 使用UI Automator Viewer得到指定控件的id;
- 通过id在反编译后的public.xml中查找对应的id值;
- 利用Android Killer自带的全局搜索功能,查找控件的调用情况。
这套方法行之有效,并且普遍适用。