Android自复制传播APP原理学习(翻译)
Android自复制传播APP原理学习(翻译)
1 背景介绍
论文链接:http://arxiv.org/abs/1511.00444
项目地址:https://github.com/Tribler/self-compile-Android
吃完晚饭偶然看到这篇论文,当时就被吸引了,马上翻译总结了一下。如有错误欢迎斧正。
该论文的研究出发点比较高大上这里我们就不多说了,简而言之就是想通过移动设备来实现一个自组网,在发生灾难的时候,手机之间能够自动传输关键数据,减少损失。整个目标通过设计一个能够实现自编译、自变异和病毒式传播的“自治app”实现。下面我们直接去了解它的核心原理。
2自治app的设计
1.要求能够同时使用多种网络连接方式如WIFI、蜂窝网络、蓝牙等。
2.最好系统本身开源,主要是方便获取软件的编译工具以及了解相关编译过程。
所以选择了Android系统。同时注意到自治app的关键功能最好不需要root权限就能顺利完成。
3.1病毒式的传播
核心原理图

简而言之就是在同一个无线网域中,能够通过NFC和蓝牙进行传播,然后这个网域中如果有一台机器能够连接外网的话,就通过这台机器传播到外网去。
3.2 自编译
为了能够在各个设备、平台上运行APP,这个app就必须包含所有系统版本的编译套件。最有效的方法就是在这个APP中内嵌一个app编译工厂,此工厂包含所有需要的编译和连接工具。要完成自我编译主要需要如下3类原数据:
①app源码;
②第三方库;
③编译、链接工具
当然,如果app中含有c/c++代码的话,还需要一些ndk工具。
3.3 自变异
主要是为了通过变异来让app能够在各种不同的环境中存活下去。主要方式就是让app自身能够将代码、资源文件、和新的或者更改后的库文件集合在一起,让它变成一个万精油的app,进而适应各种设备(当然,就恶意代码而言,可以通过变异来减少被杀软报毒的概率)。
3.4无害的组件
在app中嵌入一些无害的组件(软硬件均可),或者将“关键逻辑”嵌入到无害的app中,可以迷惑用户,减少被发现的概率。比如嵌入到计算器中。当然为了免得被查水表,给app签名的时候最好用别人的,或者默认的debug key。
4 具体实现
主要就是构建一个内嵌的编译环境,并且这个编译环境要是全java的。由于Android本身就是开源的,所以获取各个编译工具以及了解它的编译原理并不难,并且除了aapt之外,其他工具基本都是使用java写的。
具体的编译过程见图3。当然网上也有很多相关文章。

4.1重写aapt
aapt的功能这里就不多说了。主要看如何将这部分native代码移植到java代码中。这方面的工作已经有现成的工具可以使用了,就是JavaIDEdroid。同时需要注意,aapt在工作的时候需要的那些native库文件都被集中到了一个so文件中。所以为了实现完全的NDK无关性,这里只需要对aapt的代码进行移植即可。
4.2 Java编译器
这里选择使用Eclipse的Java编译器ECJ,因为这个编译器是使用java写的。
4.3 Dalvik转换
Android使用dex格式的可执行文件。在Android5.0之前的版本中使用Dalvik VM来运行dex文件,后来使用ART代替了DVM,不过ART是向后兼容的,所以也是执行dex文件。因此就需要将java字节码转换为dex格式的dalvik字节码。整个转换工作通过一个叫做dx的工具包实现。Dx在进行转换的时候比较吃内存,如果一次性转换太多东西的话容易crash,但是好在我们可以分块对上面提到的各个java库进行转换。转换完成后在通过DexMerger进行组合。好消息是,dx和DexMerger都是用java写的。
4.4 打包工具
APK的打包主要是通过ApkBuilder工具实现,它也是用java写的。ApkBuilder包括用于完成java代码编译的Android.jar库文件,用于完成最后链接工作的Java KeyStore文件(这个文件在对apk进行签名的时候用到)等等。
4.5签名问题
如果两个apk的包名相同,签名也相同,那么新的apk就可以完美替换旧的apk。但是自变异的apk却不行。它要么被当做一个新的app安装,要么因为包名相同但签名不同而被拒绝安装。所以为了解决这个问题,可使用ZipSigner工具,这个工具可以使用任意的Key Store文件(本身默认包含debug key)对apk进行签名。所以可以通过这个工具使用debug key对自变异的apk进行签名。
4.6无线传播
主要就是通过NFC来开启蓝牙传输,然后通过蓝牙来传输apk文件。整个传输过程可以做成全自动化的。
5 总结
这个论文首先提出并实现了在Android平台能够自动重编译、自变异和病毒式传播的“自治型app”,虽然作者的出发点是好的,但是难免会被有心之人利用,做成恶意代码加以传播。同时很容易联想到,我们完全可以将这些Android平台的编译工具替换为其他系统平台的编译工具,程序通过检测当前所处的系统环境,选取相应的编译套件,进而实现跨平台感染。
Android自复制传播APP原理学习(翻译)的更多相关文章
- Android中为APP创建快捷方式的原理(自己的理解)
我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...
- 在Android上编写模块化项目(翻译)
来源博客:Wang Jie's Blog 本文链接:http://blog.wangjiegulu.com/2018/02/13/writing_a_modular_project_on_androi ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- 我的Android进阶之旅------>RxJava学习资料汇总
在响应式编程中,应该牢记以下两点: everything is a stream(一切皆流) don't break the chain(不要打断链式结构) 记住,可观测序列就像一条河,它们是流动的. ...
- Android插件化技术——原理篇
<Android插件化技术——原理篇> 转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...
- 深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
1.1 什么是热修复 对于广大的移动开发者而言,发版更新是最为寻常不过的事了.然而,如果你 发现刚发出去的包有紧急的BUG需要修复,那你就必须需要经过下面这样的流程: 这就是传统的更新流程,步骤十分繁 ...
- 深入探索Android热修复技术原理读书笔记 —— 代码热修复技术
在前一篇文章 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍中,对热修复技术进行了介绍,下面将详细介绍其中的代码修复技术. 1 底层热替换原理 在各种 Android 热修复方案中 ...
- Android版-支付宝APP支付
此项目已开源 赶快来围观 Start支持下吧 [客户端开源地址-JPay][服务端端开源地址-在com.javen.alipay 包名下] 上一篇详细介绍了微信APP支付 点击这里 此篇文章来详细介绍 ...
- Android Material Design控件学习(一)——TabLayout的用法
前言 Google官方在14年Google I/O上推出了全新的设计语言--Material Design.一并推出了一系列实现Material Design效果的控件库--Android Desig ...
随机推荐
- MySql编码、卸载、启动问题
一.启动问题 计算机------管理------服务------找到MySql------右键------启动或停止 问题:打开Mysql,点击 MySQL Command Line Client,输 ...
- python__基础 : 异常处理与自定义异常
异常处理方法一般为: try: ------code----- except Exception as e: # 抛出异常之后将会执行 print(e) else: # 没有异常将会执行 print( ...
- P1414 又是毕业季II (数学?
题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...
- react+redux状态管理实现排序 合并多个reducer文件
这个demo只有一个reducer 所以合并reducer这个demo用不到 ,但是我写出来这样大家以后可以用到,很好用,管理多个reducer,因为只要用到redux就不会只有一个reducer所以 ...
- python基础之继承组合应用、对象序列化和反序列化,选课系统综合示例
继承+组合应用示例 1 class Date: #定义时间类,包含姓名.年.月.日,用于返回生日 2 def __init__(self,name,year,mon,day): 3 self.name ...
- Javascript Step by Step - 02
DOM 操作 DOM是面向HTML和XML文档的API,为文档提供了结构化表示.在DOM中一切都是节点Node,文档就是由许多的Node组成的.文档里的每个节点都有属性 nodeName.nodeVa ...
- hihocoder1014 : Trie树
#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助, ...
- Android如何实现毛玻璃效果之Android高级模糊技术
自从iOS系统引入了Blur效果,也就是所谓的毛玻璃.模糊化效果,磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片: 效果我们知道了,如何在Android中实现呢, ...
- Java入门 手把手教你配置环境变量
很多人觉得配置Java开发的环境变量很麻烦,很容易忘记,时常被它搞得晕头转向.如果出现这样的情况,那么原因只有一个,你不了解为毛需要配置环境变量,不配置环境变量就不能开发了吗? 答案是:NO!,那么下 ...
- CodeIgniter学习笔记五:分页,文件上传,session,验证码
一.分页 示例代码: //装载类文件 $this -> load -> library('pagination'); $controller = $this->router-> ...