背景
PM:这儿有一个需求,调起 XXX 浏览器显示一个网页链接(网页内容较特殊,内嵌 webview 不满足需求)。
程序狗:这还不简单,三分钟搞定!
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
intent.setPackage("xxx");
startActivity(intent);
完事儿~
测试:啊,你这个有点问题啊~你打开浏览器后用户可以自由切换网页呢~下面工具栏上那么多按钮都可以随便点。。。
程序狗:。。。
测试:不行!你得优化下~
程序狗:这个搞不定啊~
测试:不可能!XXX 浏览器高度定制化,肯定有方法可以去掉工具栏!
程序狗:那是 PC 版的,Android 版的没提供接口~
测试:我不信。。。
程序狗:Android 传参是靠 Intent 和 Extra 的,巴拉巴拉。。。
测试:我不管!
是不是日了狗了,是你你怎么办?也是出于好奇吧,遂开始了下面艰难旅程。
艰难旅程 - 逆向破解
-
提取浏览器 apk,查看 MainActivity,看看如何处理 Intent 的,倒是接收了几个参数,但是根本没有哪个参数是控制工具栏的显示与否啊,简直就是坑!
-
继续看代码,发现工具栏添加的地方是一个单一入口,还是比较好屏蔽的,于是直接一通修改 smali 文件,重新编译、签名、测试,终于去掉了这个工具栏。
测试:你这属于逆向破解啊,不行,有风险!
程序狗:。。。
艰难旅程 - 正向编译
-
几经周转,从某个地方得到了 xxx 浏览器的源码,欣喜若狂
-
赶紧导入 AS,开始 sync,build,,,发现编译不过
-
原来,代码并不完全,工程也是 java 和 c 混合编译的,仔细看发现有些 c 代码并不存在
-
怎么办?程序狗岂会轻易放弃(一舔到底?)
-
想了好久,终于柳暗花明,没有 c,有 so 不也是一样吗?
-
紧急打开 AS,gradle 中去掉 c 编译相关的部分,从 apk 中直接提取出 so 放入工程
-
哼哼,这次总行了吧,奶奶的~
-
幻想着~"0 errors, 0 warnings."
-
卧槽,硕大的 build failed... 再次映入眼帘
-
再看,尼玛,居然还有 java 类也不存在,这不是坑爹吗?
-
扣脑壳,,,无招,再扣。。。旁边小姐姐都看不下去了,就这几根,再扣就掉完啦~
-
没办法,还得扣~嗯,和 so 一样的原理不就可以了,仔细整理,发现少的 java 主要在一个包下,于是打算从 apk 反编译来补全这个包下的代码
-
我勒个大草,反编译的代码直接复制过来简直就是灾难,各种奇怪副号,AS 直接就给你标红了,很红很红的那种,根本编译不过~硬着头皮修改了几个类,不行,再这样毛就更少了
-
再扣脑壳,哈哈~那就不用源码,直接用 class 文件呗。遂从 apk 提取 dex,从 dex 提取 jar 包,把 jar 包中多余的 class 文件删除,只留目标 class 文件,然后把 jar 包放到 libs 目录下作为依赖~
-
gradlew assembleDebug,狠狠敲一个回车(注意此处有声音),开始编译,这次再不行,老子直播吃屎!
-
幻想着~"0 errors, 0 warnings."
-
尼玛,有屎么,我买点。。。
-
再次 build failed
-
为什么呢?仔细分析,发现拿到的 apk 是 release 版本的,在编译的过程中,好些类的方法都被删除了,直接采用了内联的方式,甚至有些类(工具来,只有 static 方法)都被直接删除了,所以再源码中自然也就找不到这些类的方法了,故报错
-
这次是真没法了,可以放弃么??
-
天无绝人之路,偶然间从某个地方得到了一个浏览器的 debug 包,赶紧从 debug 版本的 apk 中提取对应的 class 文件,放到 AS 中
-
小心翼翼地开始编译
-
小心脏砰砰砰,,,
-
卧槽!居然编译通过了,泪流满面啊。。。。
-
安装,运行,一切 OK
-
于是乎,绝大部分源码在手,你想干什么都可以了,哼哼(坏笑)
-
对面小姐姐诧异地看过来,该不是误会了什么吧。。。
网友评论