从零开始,看我是怎么把“恶灵”塞进安卓系统的
兄弟们,今天聊聊怎么把一个藏不住的进程,硬是塞进安卓里,让它死不了,这就是我说的“恶灵寄生”。这事儿折腾了我快一个礼拜,主要是被一个烂透了的系统逼的。咱们不说为啥要塞,就说说怎么塞。
第一步:找个沙袋。
我
我得先找到一个能让我随便折腾的手机。我翻箱倒柜,扒拉出一个几年前的安卓机,系统版本老得掉渣,但刚我
我得先找到一个能让我随便折腾的手机。我翻箱倒柜,扒拉出一个几年前的安卓机,系统版本老得掉渣,但刚我刷了Root权限。没Root,咱们根本没法玩这么深的东西,人家系统大门锁着。
第二步:准备“恶灵”。
“恶灵”就是个自启动服务。我希望它干点啥?最基本的要求是:
- 开机自启。
- 内存占用必须低到忽略不计。
- 一旦被系统杀掉,能马上活过来。
这个服务,我用了一套很土的办法写了一个基础的心跳包,就几十K的东西。写完后,我打包成一个最小的APK,名字改得跟系统组件一样,比如叫“*”。但这还不够,光靠名字骗不了人。
第三步:实现寄生和持久化。
这是最麻烦的一步,安卓系统天天盯着看谁耗电,谁占用内存高。普通的START_STICKY根本扛不住。我开始研究那些牛逼的卫士软件是怎么实现不死进程的。
我试过好几种套路:
- 双进程互拉: A死了B拉,B死了A拉,互相守望。但很快就被系统批量干掉了。
- 前台服务: 弹个通知栏,假装自己是个播放器,但通知栏太显眼了,失败。
- 利用系统广播: 专门监听那些系统不常发的广播,比如网络切换、屏幕解锁,收到就启动一次。但这不够稳定。
我发现,要彻底“寄生”,必须把自己伪装成一个系统都懒得管的组件。我把代码偷偷塞进了一个常用的、且拥有系统级权限的App里,比如某个输入法或者一个自带的日历应用。我不是直接替换,而是通过Root权限,直接修改了它们的代码包,让我的服务在它们启动的时候跟着启动。
我甚至还研究了一下安卓底层那个叫“AMS”的东西(就是管进程生死的总管)。我让我的服务在被系统认定为“Low Memory”的时候,也能保持在“White List”的边缘。具体怎么实现?简单粗暴:反复申请一个极小的透明像素窗口,让系统认为我一直在跟用户交互。这个窗口肉眼看不见,但系统会觉得这个App是“必要的”。
第四步:验收成果。
我把手机重启了十几次,每次启动后,我的“恶灵”都能在后台安静地活着,用任务管理器根本抓不到它,必须得用专业工具看进程ID才能发现它的存在。而且我手动把它杀掉,不到三秒它又自己蹦出来了。这种感觉,就像真的给系统里种了一个杀不死的蛊。
为啥我非要折腾这么个东西?说起来都是泪。
我有个亲戚家的孩子,被他爸妈装了个特别严格的监控软件,那软件权限高得离谱,连晚上十点自动锁屏都给锁了。孩子找我哭诉,我本来想直接卸载,结果人家在系统底层设了N多自保护机制,删了又活,杀了又长,简直就是个数字蟑螂。
那软件的流氓程度,让我觉得简直就是个恶灵。我当时就琢磨,既然这些大公司能用技术手段搞出这么难缠的玩意儿来限制用户,那我也得把底层机制摸透,搞出个能跟它对着干的。我搞的这个“寄生”技术,就是从研究怎么绕过那种限制软件的反杀机制开始的。
搞完这一套,我彻底明白了。现在这些系统,尤其是安卓这种,看着开放,但里头塞满了各种相互牵制、互相制约的代码块。搞不随便一个小小的后台服务,就能变成谁都管不了的“恶灵”。普通用户根本不知道自己的手机里,到底有多少程序在偷偷地活着,偷偷地跑着,甚至偷偷地消耗着你的电量和流量。系统维护起来就是一锅大杂烩,各种乱七八八的权限互相咬着,太混乱了。