本帖最后由 chicharito_14 于 2016-9-1 11:24 编辑
最近受人委托将一款打印APP的驱动集成在本地,使APP在不用联网的前提下可以安装驱动正常使用打印机。下面开始介绍下方法。
拿到APP后首先要做的自然就是默默地拿出jeb反编译一下,这里不得不夸赞下jeb这个工具,跟以前用apktool+dexjar+jd-gui比起来,简直就是六到飞起的节奏
反编译完之后就是查找跟驱动相关的函数了,首先先去扒一下资源文件,找一些有用的strings参数
找到了两个挺重要的strings字符串,一个是提示安装打印机驱动,另一个是提示打印机安装成功可以使用。接下来根据第一个字符串从smali代码中找到相应的函数
直接Ctrl+F搜索字符串就能够找到,定位之后敲下Tab键就可以把smali代码转换为java代码
可以看到定位到的函数功能是检查手机上是否有驱动,没有的话执行InstallDriverThread函数来安装驱动,下面要做的就是定位到InstallDriverThread函数了
在InstallDriverThread中看到了installDrvLibPack函数,该函数顾名思义就是安装驱动安装包,而且它的参数包含着drv_name,这时候看到重要线索了。然后在smali中搜索该函数的名称进行定位,然后Tab转换为java代码
现在基本就已经很明朗了,懂android开发的朋友肯定能看出来这部分代码的功能是在/asset/data/文件夹下匹配相应的驱动名称,然后进行安装。所以说我们只需要把驱动下载下来,然后放进asset/data/文件夹下再反编译就可以了。接下来就是要如何下载驱动了,代码里的URLConnection v10给了我们下一个线索。
在v10的定义中看到了变量的作用就是建立下载链接,App.DOWNLOAD_PATH_PREFIXES,顾名思义可以猜到就是下载路径,接下来跳转到该变量的定义位置
然后我们就得到了驱动的下载地址(有一个地址没有访问权限,还好另一个可以用),接下来要做的就是获取与手机和打印机型号相对应的驱动了,我这里采用的是抓包的方式,当然也可以通过对smali下断点进行动态调试来获取。
最后要做的就是去站点下载相应的驱动程序放到asset/data/文件夹下,反编译+签名后就算完工了。
只是搬砖之余的小娱乐,给大家分享一下以供消遣,技术渣一枚,还在努力学习中。。。。
|