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原理学习(翻译)的更多相关文章

  1. Android中为APP创建快捷方式的原理(自己的理解)

    我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...

  2. 在Android上编写模块化项目(翻译)

    来源博客:Wang Jie's Blog 本文链接:http://blog.wangjiegulu.com/2018/02/13/writing_a_modular_project_on_androi ...

  3. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  4. 我的Android进阶之旅------>RxJava学习资料汇总

    在响应式编程中,应该牢记以下两点: everything is a stream(一切皆流) don't break the chain(不要打断链式结构) 记住,可观测序列就像一条河,它们是流动的. ...

  5. Android插件化技术——原理篇

    <Android插件化技术——原理篇>     转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...

  6. 深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍

    1.1 什么是热修复 对于广大的移动开发者而言,发版更新是最为寻常不过的事了.然而,如果你 发现刚发出去的包有紧急的BUG需要修复,那你就必须需要经过下面这样的流程: 这就是传统的更新流程,步骤十分繁 ...

  7. 深入探索Android热修复技术原理读书笔记 —— 代码热修复技术

    在前一篇文章 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍中,对热修复技术进行了介绍,下面将详细介绍其中的代码修复技术. 1 底层热替换原理 在各种 Android 热修复方案中 ...

  8. Android版-支付宝APP支付

    此项目已开源 赶快来围观 Start支持下吧 [客户端开源地址-JPay][服务端端开源地址-在com.javen.alipay 包名下] 上一篇详细介绍了微信APP支付 点击这里 此篇文章来详细介绍 ...

  9. Android Material Design控件学习(一)——TabLayout的用法

    前言 Google官方在14年Google I/O上推出了全新的设计语言--Material Design.一并推出了一系列实现Material Design效果的控件库--Android Desig ...

随机推荐

  1. http协议组成(请求状态码)

    http请求由:请求行:消息报头:请求正文组成 //请求行 Request URL: http://172.32.4.33:8080/operation/v2/autoServer/queryAuto ...

  2. python中的列表内置方法小结

    #!/usr/local/bin/python3 # -*- coding:utf-8 -*- ''' names=['zhangyu','mahongyan','zhangguobin','shac ...

  3. 爬虫之urllib模块

    1. urllib模块介绍 python自带的一个基于爬虫的模块. 作用:可以使用代码模拟浏览器发起请求. 经常使用到的子模块:request,parse. 使用流程: 指定URL. 针对指定的URL ...

  4. pycharm中文乱码问题 总结

    前言: 这几天刚刚开始学习python,然后就安装了pycharm,但是那个中文乱码的问题真是让人心烦,在网上找了好久,都写得好乱,今天终于让我解决了,在这里总结一下经验,希望可以帮到你们 问题:如下 ...

  5. Visual Stutio 2015激活密钥

    Visual Stutio 2015 专业版激活密钥:HMGNV-WCYXV-X7G9W-YCX63-B98R2 Visual Stutio 2015 企业版激活密钥:HM6NR-QXX7C-DFW2 ...

  6. ASP.NET 使用 MySQL

    基本是通用的 C#与MySQL的交互, 先添加MySQL.Data.dll(位于MySQL安装目录下的Connector NET 8.0\Assemblies${version}目录下)引用, 之后代 ...

  7. EF实体部分更新的问题

    之前遇到只更新部分的问题:如前端修改用户信息(不修改密码),传实体到后台,这个实体是没有密码,这样一来要更新的话,得先去数据库通过传过来的实体的ID读取这条记录,然后将改动的部分填到查出来的记录中,再 ...

  8. getprop 与 dumpsys 命令

    Android 设备连接 PC 后,我们可以通过 adb 命令完成绝大多数工作.下面借助 getprop.dumpsys 来了解一些系统相关信息. 一.getprop 此命令的原理很简单,就是从系统的 ...

  9. anr trace文件分析

    测试给的trace文件好几万行,怎么看? 1.搜索 你的包名,看它报错误报在你代码的哪里 2.在你代码里面分析 还有,synchronized 就是用来防止多线程调用的,没有那么神奇.

  10. 树&二叉树&哈夫曼树

    1.树 需要注意的两点:n(n>=0)表示结点的个数,m表示子树的个数 (1)n>0时,树的根节点是唯一的. (2)m>0时,子树的个数没有限制. 结点的度和树的度 (1)结点的度是 ...