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 ...
随机推荐
- css样式 body的font-size 为什么用625%
浏览器的默认高度?一般为16px. 为什么用62.5%作为body的默认样式?16px62.5%=10px.* 那么为什么一般多是 16px *625% = 100px; <响应式Web设计实 ...
- Python面向对象--高级(一)
## 属性的类型 - 属性可分为类属性和实例属性 - 实例属性可以通过在类中使用self定义,或者直接在类外部使用实例变量定义 class Person(object): def __init__(s ...
- 微信小程序插件内页面跳转和参数传递
在此以插件开发中文章列表跳传文章详情为例. 1.首先在插件中的文章列表页面wxml中绑定跳转事件. bindtap='url' data-id="{{item.article_id}}&qu ...
- 图解HTTP总结(2)——简单的HTTP协议
HTTP协议是一种不保存状态,即无状态(stateless)协议.HTTP协议自身不对请求和响应之间的通信状态进行保存.也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理. 使用H ...
- python学习之map函数和reduce函数的运用
MapReduce:面向大型集群的简化数据处理引文 map()函数 Python中的map()函数接收两个参数,一个是调用函数对象(python中处处皆对象,函数未实例前也可以当对象一样调用),另一个 ...
- 1016-06-首页20-封装工具条-有控件在viewDidLoad的时候距离顶部是0--到了viewWillAppear或viewDidAppear系统就加了64
- C语言进阶——分支语句06
if分支语句分析: if语句用于根据条件选择执行语句 else不能独立存在且总是与在它之前的最近if相匹配 esle语句后可以连接其他if语句 用法如下: if(condition) { //stat ...
- python-8错误调试测试
1-错误处理 import logging try: print('try.......') r = 10/0 except ValueError as e: print('result:', e) ...
- 20145202马超GDB调试汇编堆栈过程分析
20145202马超GDB调试汇编堆栈过程分析 esc :w保存,:wq保存并退出 x:删除错误的单个字母 dw:删除整个单词 gcc hello.c -o hello:运行hello.c gcc - ...
- Python数据类型一
一.整型 在Python内部对整数的处理分为普通整数和长整数,普通整数长度为机器位长,通常都是32位,超过这个范围的整数就自动当长整数处理,而长整数的范围几乎完全没限制Python可以处理任意大小的整 ...