首页 文章 精选 留言 我的

精选列表

搜索[官方镜像],共10000篇文章
优秀的个人博客,低调大师

一批Android网银木马躲过官方应用商店检测 清理前下载量已达30万

Threat Fabric 安全研究人员刚刚公布了一批 Android 网银木马,而且在被 Google Play 清理之前,其下载量就已经超过了 30 万次。在二维码扫描仪、PDF 扫描仪、加密货币钱包等表象的掩饰下,这些恶意应用会在暗中窃取用户登录凭证、双因素身份验证码、记录按键、以及屏幕截图。 (来自:Threat Fabric) 通过持续四个月的追踪,Threat Fabric 发现了四个独立的 Android 恶意软件系列。可知其利用了多种技巧,来规避 Google Play 应用商店的检测机制 安全研究人员指出,之所以从 Google Play 的自动化(安全沙箱)和机器学习审核流程中逃逸,正是该平台试试权限限制的直接后果。 通常情况下,这些恶意软件会先以一款良性 App 的面目示人。所以在早期的 VirusTotal 恶意软件检测过程中,它们并不会在第一时间被揪出。 但在用户安装后,它们就会开始诱骗用户下载并安装带有“附加功能”的更新包。此时这些恶意应用会通过第三方来源来获取,但此时它们已经骗取了用户的普遍信任。 为了躲避雷达追踪,这些恶意程序还利用了其它手段。在许多情况下,幕后操纵者只有在检查受感染的设备的地理位置、或通过增量更新后,才会手动部署恶意内容。 这种致力于躲过不必要关注的手段,实在让人难以置信。然而现实表明,基于自动化流程的传统恶意软件检测方案,正在变得不那么可靠。 在近日发表的一篇博客文章中,Threat Fabric 详细阐述了被调查的 9 款 dropper 恶意软件。其中造成最多感染的,被称作 Anatsa 家族。 这款“相当先进”的 Android 网银木马内置了许多功能,包括远程访问和自动转账系统。受害者将被无情地清空账户,将资金转移到幕后黑手控制的账户中。 感染 Anatsa 恶意软件的过程,是从 Google Play 下载看似人畜无害的初始安装包后开始的。之后相关 App 会强制用户更新,以继续使用该应用程序。 但现实是,幕后黑手在远程更新服务器上托管了夹带私货的恶意内容,并通过骗取信任的方式,将之安装在了毫无戒备的受害者设备上。 为了装得更像一些,幕后团伙甚至会雇人在 Google Play 应用商店刷好评,以引诱更多无辜者上当受骗。 最后,研究人员还发现了另外三大恶意软件家族(分别称之为 Alien、Hydra 和 Ermac)。 其特点是植入了 Gymdrop 恶意负载,并利用基于受感染设备模型的过滤规则,来躲过安全研究人员的搜捕。

优秀的个人博客,低调大师

阿里云官方价格分享:云服务器ECS最低配置及最新价格分享(当前所有活动)

本文整理了阿里云目前长期优惠活动中所推云服务器的最低价格及配置,通过本文您可以知道阿里云目前长期优惠所推的最低的云服务器多少钱,适合新手用户参考选择,如果您想以最低的价格购买阿里云服务器,那么通过阿里云目前正在进行中的长期优惠活动去购买是很划算的,阿里云对于新用户给的优惠折扣都是很大的。 说明:以下仅展示的是阿里云目前主要长期优惠活动中所推的最低云服务器配置和价格,每个活动都推出了很多更高的云服务器配置,具体配置及优惠价格请登录活动详情页查看。 长期优惠活动一:Hi拼团活动最低价格:99元/1年配置:1.突发性能T6实例2.CPU内存配置:2核1G3.带宽:1M带宽4.云盘:40G高效云盘活动主要亮点:用户可以选择直接购买享受活动特价,也可以自己开团然后邀请他人一起购买享受更低的的优惠价格。 长期优惠活动二:主机爆款特惠活动最低价格:313.2元/1年配置:1.突发性能5实例2.CPU内存配置:1核1G3.带宽:1M带宽4.云盘:40G 高效云盘活动主要亮点:①,所推云服务器配置众多,均属爆款,基本上能满足绝大部分用户的上云服务器配置需求。②,带宽1-10M任选,选择更加自由。③,活动同时推出云虚拟主机,海外云服务器,数据库等产品特惠,满足不同层次用户的需求。 长期优惠活动三:高性能云服务器特惠最低价格:1282.2元/1年配置:1.计算型C5实例2.CPU内存配置:2核4G3.带宽:1M带宽4.云盘:40G 高效云盘活动主要亮点:阿里云专为企业用户而制定的专属特惠活动,活动推出的云服务器实例规格为计算型、网络增强型实例,是企业用户购买比较多的实例。 长期优惠活动四:阿里云云小站最低价格:366元/1年配置:1.突发性能T5实例2.CPU内存配置:1核1G3.带宽:1M带宽4.云盘:40G 高效云盘活动主要亮点:本活动最大亮点在于购买3年的优惠价格跟购买2年的优惠价格一样,适合于需要一次购买3年的用户。 以上就是阿里云目前主要的长期优惠活动及所推的云服务器最低配置及价格,对于新手用户来说,我们不妨每个活动都看看,参考活动所推云服务器的适合场景,多比较下然后选择最适合自己的活动去购买阿里云服务器,既达到满足需求的同时,又最大限度的节约我们的上云成本。例如我们需要购买最低配置的1核1G,2核1G之类的低配云服务器,通过比较我们发现Hi拼团优惠活动是最划算的,而我们如果需要一次购买3年的话,全民云计算是最划算的,如果我们需要带宽上面更加灵活,主机爆款特惠则是比较划算的,如果我们是企业用户可以重点考虑企业高性能特惠活动所推出的云服务器配置。

优秀的个人博客,低调大师

Android官方开发文档Training系列课程中文版:Activity测试之创建功能性测试

原文地址:http://android.xsoftlab.net/training/activity-testing/activity-functional-testing.html 功能性测试包括模拟用户操作之类的组件验证。例如开发者可以通过功能性测试来验证在用户执行了UI操作之后Activity是否启动了Activity。 如要为Activity创建功能性测试,测试类应当继承ActivityInstrumentationTestCase2。与ActivityUnitTestCase不同,ActivityInstrumentationTestCase2既可以与Android系统通信,又能使程序可以接收键盘输入事件与屏幕点击事件。 验证功能行为 一般功能性测试可能会有以下测试目的: 验证在某个UI控制器被按下后,目标Activity是否被启动。 验证目标Activity是否将在启动之前的用户输入数据正确显示。 开发者所实现的代码可能如下: @MediumTest public void testSendMessageToReceiverActivity() { final Button sendToReceiverButton = (Button) mSenderActivity.findViewById(R.id.send_message_button); final EditText senderMessageEditText = (EditText) mSenderActivity.findViewById(R.id.message_input_edit_text); // Set up an ActivityMonitor ... // Send string input value ... // Validate that ReceiverActivity is started ... // Validate that ReceiverActivity has the correct data ... // Remove the ActivityMonitor ... } 测试框架会等待ReceiverActivity启动,否则的话将会在超时后返回null。如果ReceiverActivity启动,那么ActivityMonitor则会收到一个命中。开发者可以通过断言方法来验证ReceiverActivity是否被启动,命中数是否会如所期望的那样有所增长。 设置ActivityMonitor 如果需要监视Activity,可以注册ActivityMonitor。当目标Activity启动时,系统会通知ActivityMonitor一个事件。如果目标Activity启动,那么ActivityMonitor的计数器则会更新。 一般使用ActivityMonitor应当执行以下步骤: 1.通过getInstrumentation()方法获得用于测试的Instrumentation实例。 2.通过Instrumentation的addMonitor()重载方法将Instrumentation.ActivityMonitor的实例添加到当前的instrumentation中,具体的匹配规则可由IntentFilter或者类名指定。 3.等待被监视的Activity启动。 4.验证监视器的数字增长。 5.移除监视器。 例如: // Set up an ActivityMonitor ActivityMonitor receiverActivityMonitor = getInstrumentation().addMonitor(ReceiverActivity.class.getName(), null, false); // Validate that ReceiverActivity is started TouchUtils.clickView(this, sendToReceiverButton); ReceiverActivity receiverActivity = (ReceiverActivity) receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS); assertNotNull("ReceiverActivity is null", receiverActivity); assertEquals("Monitor for ReceiverActivity has not been called", 1, receiverActivityMonitor.getHits()); assertEquals("Activity is of wrong type", ReceiverActivity.class, receiverActivity.getClass()); // Remove the ActivityMonitor getInstrumentation().removeMonitor(receiverActivityMonitor); 使用Instrumentation发送键盘事件 如果Activity含有EditText,可能需要测试用户是否可以对其输入数据。 一般来说,要发送字符串到EditText,应当: 1.在runOnMainSync()方法中运行requestFocus()同步方法,这样会使UI线程一直等待接收焦点。 2.调用waitForIdleSync()方法使主线程变为空闲状态。 3.通过sendStringSync()方法发送一条字符串给EditText。 例如: // Send string input value getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { senderMessageEditText.requestFocus(); } }); getInstrumentation().waitForIdleSync(); getInstrumentation().sendStringSync("Hello Android!"); getInstrumentation().waitForIdleSync();

优秀的个人博客,低调大师

Android官方开发文档Training系列课程中文版:后台加载数据之处理CursorLoader的查询结果

原文地址:http://android.xsoftlab.net/training/load-data-background/handle-results.html 就像上节课所说的,我们应该在onCreateLoader()内使用CursorLoader来加载数据。那么在数据加载完毕之后,加载结果会通过LoaderCallbacks.onLoadFinished()方法传回到实现类中。该方法的其中一个参数为包含查询结果的Cursor对象。你可以通过这个对象来更新UI数据或者用它来做进一步的操作。 除了onCreateLoader()及onLoadFinished()这两个方法之外,还应当实现onLoaderReset()方法。这个方法会在上面返回的Cursor对象所关联的数据发生变化时调用。如果数据发生了变化,那么Android框架会重新进行查询。 处理查询结果 为了显示Cursor对象中的数据,这里需要实现AdapterView的相关方法以及CursorAdapter的相关方法。系统会自动的将Cursor中的数据转换到View上。 你可以在展示数据之前将数据与Adapter对象进行关联,这样的话系统才会自动的更新View: public String[] mFromColumns = { DataProviderContract.IMAGE_PICTURENAME_COLUMN }; public int[] mToFields = { R.id.PictureName }; // Gets a handle to a List View ListView mListView = (ListView) findViewById(R.id.dataList); /* * Defines a SimpleCursorAdapter for the ListView * */ SimpleCursorAdapter mAdapter = new SimpleCursorAdapter( this, // Current context R.layout.list_item, // Layout for a single row null, // No Cursor yet mFromColumns, // Cursor columns to use mToFields, // Layout fields to use 0 // No flags ); // Sets the adapter for the view mListView.setAdapter(mAdapter); ... /* * Defines the callback that CursorLoader calls * when it's finished its query */ @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { ... /* * Moves the query results into the adapter, causing the * ListView fronting this adapter to re-display */ mAdapter.changeCursor(cursor); } 移除旧的Cursor引用 CursorLoader会在Cursor处于无效状态时对其进行重置。这种事件会经常发生,因为Cursor所关联的数据会经常发生变化。在重新查询之前,系统会调用所实现的onLoaderReset()方法。在该方法内,应将当前Cursor的所持有的引用置空,以防止内存泄露。一旦onLoaderReset()方法执行完毕,CursorLoader就会重新进行查询。 /* * Invoked when the CursorLoader is being reset. For example, this is * called if the data in the provider changes and the Cursor becomes stale. */ @Override public void onLoaderReset(Loader<Cursor> loader) { /* * Clears out the adapter's reference to the Cursor. * This prevents memory leaks. */ mAdapter.changeCursor(null); }

优秀的个人博客,低调大师

Android官方开发文档Training系列课程中文版:键盘输入处理之指定输入的类型

原文地址:http://android.xsoftlab.net/training/keyboard-input/index.html 引言 在文本框接收到焦点时,Android系统会在屏幕上显示一个软键盘。为了提供良好的用户体验,你可以指定相关输入类型的特性,以及输入法应当如何展现。 除了屏幕上的软键盘之外,Android还支持实体键盘,所以APP如何与各种类型的键盘交互这件事情,就变得很重要了。 指定输入的类型 每一个文本框必定只有一种输入类型,比如一个电子邮件地址,一个电话号码或者是常规文本。所以为每一个文本框指定输入类型就变得很重要,这样的话系统才会显示正确的输入法。 你可以指定比如输入方法所提供的拼写建议、首字母大写、以及输入法右下角按钮的行为(Done或者Next)。这节课主要介绍如何指定这些特性。 指定键盘类型 你应该总是为文本框声明输入类型,通过android:inputType属性可以为文本框添加输入类型。 比如,如果你希望文本框的输入类型为电话号码,可以使用”phone”: <EditText android:id="@+id/phone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/phone_hint" android:inputType="phone" /> 或者如果文本框主要是用于输入密码的,可以使用”textPassword”隐藏用户的输入文本: <EditText android:id="@+id/password" android:hint="@string/password_hint" android:inputType="textPassword" ... /> android:inputType含有多种指定的输入类型,并且一些值可以组合使用。 开启拼写检查与其它功能 android:inputType属性允许你可以为输入类型指定多种行为。更重要的一点是,如果文本框的重点在基础文本输入上(如文本消息),你应当使用”textAutoCorrect”开启拼写检查。 你还可以为android:inputType属性指定多种不同的行为以及输入类型。比如,下面的例子就展示了如何同时开启首字母大写以及拼写检查的功能: <EditText android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType= "textCapSentences|textAutoCorrect" ... /> 指定输入法按钮的行为 大多数的输入法都在右下角提供了一个用户功能按钮,这对于当前的文本框来说是极为恰当的。在默认情况下,系统使用这个按钮来实现Next或者Done功能。除非你的文本框允许多行情况的出现(比如使用了android:inputType=”textMultiLine”)。在这种情况下,该功能按钮是一个回车按钮。然而,你可以指定一些更加符合你文本框的特别功能,比如Send或Go。 为了指定键盘的功能按钮,需要使用属性android:imeOptions,并需要执行比如”actionSend”或”actionSearch”之类的值: <EditText android:id="@+id/search" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/search_hint" android:inputType="text" android:imeOptions="actionSend" /> 接下来可以通过TextView.OnEditorActionListener来监听功能按钮的按下事件,并需要在该监听器内响应正确的IME功能ID,该ID定义与EditorInfo中,比如下面使用的就是IME_ACTION_SEND: EditText editText = (EditText) findViewById(R.id.search); editText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { boolean handled = false; if (actionId == EditorInfo.IME_ACTION_SEND) { sendMessage(); handled = true; } return handled; } });

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。