<div class="blogpost-body" id="cnblogs_post_body">
<p>Android安全防护防护——加密算法:传送门<a href="https://www.cnblogs.com/huangjialin/p/9694488.html">https://www.cnblogs.com/huangjialin/p/9694488.html</a></p>
<p><strong><span style="font-size:16px;">组件安全</span></strong></p>
<p><strong>activity劫持</strong></p>
<p>简单来说就是正常的activity被攻击者替换上一个假冒的activity,但是用户并不知道这是一个假冒的activity,所以用户在输入相关信息后,就直接被攻击者获取到了。通常像登录页面,支付页面,或者是其他数据较为敏感的页面都是很容易被攻击。</p>
<p> <strong>activity劫持的原理有两种</strong></p>
<p>第1种:手机安装了木马程序,木马程序会注册一个Receiver,响应android.intent.action.BOOT_COMPLETED这个事件,这时候木马程序中的服务就会启动一个定时器,不停的循环当前运行的进程。一旦当前的进程正是我们要劫持的,并且运行在前台,就立刻使用FLAG_ACTIVITY_NEW_TASK来启动自己的木马程序中的页面并且处于栈顶,用户看到这个页面并不知道是木马程序的页面,就将一些信息输入,从而导致泄漏。</p>
<p>第2种:通常启动一个activity是通过startActivity(),这个方法的参数是intent,intent的设置有两种方式,第一种是通过设置action,让系统找到接收该action的activity,然后启动。第二种是通过包名+类名的方式进行启动。</p>
<p>当应用通过action来启动activity的时候,木马程序可以创建一个同样的action来接收activity。Android系统中,如果存在多个activity接收同一个action时,会提供一个列表让用户选择,一旦用户选错,就进入到木马程序中的页面。从而导致隐私信息泄漏。</p>
<p><strong>解决方案</strong>:</p>
<p>1、针对第一种情况,当我们的应用程序退到后台的时候,弹出提示信息提示用户,程序已经退出到后台。</p>
<p>2、自己写一个写一个反劫持程序。当一些敏感的页面时候,启动一个后台服务,然后显示一个悬浮框,我们可以获取到当前运行的进程名称,来提示用户。防止被一些木马程序欺骗。</p>
<p>3、针对第二种情况,启动activity的时候,通过包名+类名的形式进行启动,不要使用action方式。</p>
<p><strong>下面用代码简单介绍一下劫持的原理</strong></p>
<p>1、在恶意程序中启动一个服务,在服务中开启一个定时器,然后不断的获取当前的进程名。</p>
<div class="cnblogs_code">
<pre class="blockcode"><span style="color:#008080;"> 1</span> <span style="color:#008000;">/**</span><span style="color:#008000;">获取当前的运行在前台的进程,并且在前台运行</span><span style="color:#008000;">*/</span>
<span style="color:#008080;"> 2</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span><span style="color:#000000;"> String getTopAppPackageName(Context context) {
</span><span style="color:#008080;"> 3</span> <span style="color:#0000ff;">try</span><span style="color:#000000;"> {
</span><span style="color:#008080;"> 4</span> String packageName = ""<span style="color:#000000;">;
</span><span style="color:#008080;"> 5</span> ActivityManager activityManager =<span style="color:#000000;"> (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
</span><span style="color:#008080;"> 6</span>
<span style="color:#008080;"> 7</span> <span style="color:#0000ff;">if</span> (Build.VERSION.SDK_INT ><span style="color:#000000;"> Build.VERSION_CODES.LOLLIPOP) {
</span><span style="color:#008080;"> 8</span> <span style="color:#0000ff;">final</span> <span style="color:#0000ff;">long</span> end =<span style="color:#000000;"> System.currentTimeMillis();
</span><span style="color:#008080;"> 9</span> <span style="color:#0000ff;">final</span> UsageStatsManager usageStatsManager =<span style="color:#000000;"> (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
</span><span style="color:#008080;">10</span> <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">null</span> ==<span style="color:#000000;"> usageStatsManager) {
</span><span style="color:#008080;">11</span> <span style="color:#0000ff;">return</span><span style="color:#000000;"> packageName;
</span><span style="color:#008080;">12</span> <span style="color:#000000;"> }
</span><span style="color:#008080;">13</span> <span style="color:#0000ff;">final</span> UsageEvents events = usageStatsManager.queryEvents((end - 60 * 1000<span style="color:#000000;">), end);
</span><span style="color:#008080;">14</span> <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">null</span> ==<span style="color:#000000;"> events) {
</span><span style="color:#0 |
|