edit_note帖子
21
stars积分
8,130
event加入
2012-03-10
安卓交流
[安卓技术]android手机root后的安全问题 (二)
schedule发表于 2013-05-01 14:46:00
visibility查看 730
chat_bubble回复 28
#1 楼主
导读:本文介绍杀毒软件和病毒是如何获取通知栏上的所有通知,并且利用其信息杀死应用。
上一篇将过如何利用root权限来做一次静默安装,有的人会说,安装apk就安装呗,反正哥有金山手机卫士,哥有360主动防御……他们都会弹出通知告诉我的!
安装了新的应用,手机会发送广播,这些所谓的杀毒软件监听这些广播,然后弹出通知
好吧,我承认,他们在一定意义上还是有点用处的,我们先把这个问题放一放,先来说两句题外话
360和和金山手机卫士都有一个让广大android开发者比较蛋疼的一个功能:那就是检查广告通知!
当有通知栏有广告的时候,运行360执行检查,它会告诉你是哪个应用程序的广告(当然,这里并不局限于广告,他们是获得所有通知,然后过滤),然后他会让用户选择:不处理;关闭通知(实际上是把这个进程kill掉,整个软件停止运行);卸载此软件。
虽然我没有发布过android应用,但是我知道,靠软件赚钱的各位,本来收入已经够尴尬的了,再加上这些*的软件提供这些*的功能……哎
大家不喜欢收费软件那咱们就免费,点点广告支持一下总行吧,就是不点,你就放在那呗(当然,有的软件发起广告来没玩没了也挺*)
说了这么多废话,我们就来看看那些所谓的杀毒软件是如何对付大家的
到了关键的地方,实际也就那么一行代码……又让大家失望了。。。
adb shell dumpsys notification
比如,我现在在我机器上面执行一下,输出的结果为
current notification manager state:
notification list:
notificationrecord{41453c70 pkg=com.zdworks.android.toolbox id=7f090092 tag=null pri=0}
icon=0x0 / <name unknown>
contentintent=null
*intent=null
tickertext=null
contentview=null
defaults=0x0
flags=0x62
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
notificationrecord{415f48e8 pkg=com.zdworks.android.toolbox id=7f090080 tag=null pri=100}
icon=0x7f0200fd / com.zdworks.android.toolbox:drawable/barttery_notify_icon
contentintent=pendingintent{41949028: pendingintentrecord{412e3c20 com.zdworks.android.toolbox startactivity}}
*intent=null
tickertext=电量提示
contentview=android.widget.remoteviews@416e7b90
defaults=0x0
flags=0x22
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
notificationrecord{416db3e0 pkg=android id=1040414tag=null pri=100}
icon=0x10804f5 / android:drawable/stat_sys_adb
contentintent=pendingintent{41275de8: pendingintentrecord{416dade8 android startactivity}}
*intent=null
tickertext=usb 调试已连接
contentview=android.widget.remoteviews@416daf40
defaults=0x0
flags=0x2
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
notificationrecord{41790de8 pkg=com.htc.android.psclient id=7f020010 tag=null pri=100}
icon=0x7f020010 / com.htc.android.psclient:drawable/usb_to_pc_notify
contentintent=pendingintent{416c3e38: pendingintentrecord{417bc968 com.htc.android.psclientstartactivity}}
*intent=null
tickertext=null
contentview=android.widget.remoteviews@4169d128
defaults=0x0
flags=0x2
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
msoundnotification=null
msound=com.android.server.notificationplayer@413e73b8
mvibratenotification=null
mdisablednotifications=0x0
msystemready=true
现在大家知道了吧,这么简单就把咱们给搞定了
下面的事情就简单
1.想办法获取这段log
2.提取包名
3.根据数据库中的黑名单白名单不同处理
4.你的应用很可能在黑名单中,最后的结果也基本是进程被杀死
(这里就不演示3、4部分了,只演示1、2)
[java] view plaincopy
testbutton = (button)findviewbyid(r.id.*);
testbutton.setonclicklistener(new view.onclicklistener() {
public void onclick(view v) {
string[] *s = {“dumpsys notification“};
process process = null;
dataoutputstream dataoutputstream = null;
try {
process = runtime.getruntime().*(“su“);
dataoutputstream = new dataoutputstream(process.getoutputstream());
int length = *s.length;
for (int i = 0; i < length; i++) {
log.e(tag, “*s[“ + i + “]:“ + *s[i]);
dataoutputstream.writebytes(*s[i] + “\n“);
}
dataoutputstream.writebytes(“exit\n“);
dataoutputstream.flush();
process.waitfor();
bufferedreader reader = null;
reader = new bufferedreader(new inputstreamreader(process.getinputstream()));
string line = ““;
list<string> linelist = new arraylist<string>();
final stringbuilder log = new stringbuilder();
string separator = system.getproperty(“line.separator“);
pattern pattern = pattern.compile(“pkg=[^\\s]+“);
while ((line = reader.readline()) != null) {
if(line != null && line.trim().startswith(“notificationrecord“)){
matcher matcher = pattern.matcher(line);
if(matcher.find()){
linelist.add(matcher.group());
}else{
log.e(tag, “what‘s this?!“);
}
}
log.append(line);
log.append(separator);
}
log.v(tag, “log:“ + log.tostring());
int size = linelist.size();
for (int i = 0; i < size; i++) {
log.i(tag, “app:“ + linelist.get(i));
}
} catch (exception e) {
log.e(tag, “copy fail“, e);
} finally {
try {
if (dataoutputstream != null) {
dataoutputstream.close();
}
process.destroy();
} catch (exception e) {
}
}
log.v(tag, “finish“);
}
});
}
上面的这段代码实在没什么技术含量,让给位网友见笑了
按顺序简单解释一下
首先,我们先执行dumpsys notification这条命令,这在上一期的代码中已经有了
然后通过process.getinputstream()获得其输出按行读取,这里只关心类似于下面这种的log
notificationrecord{40dacad8 pkg=com.htc.android.psclient id=7f020010 tag=null pri=100}
然后从中提取出包名即可
其中的正则就是为了提取包名用的,想了解正则的同学可以看我的正则教程
深入入门正则表达式(java)
这里我执行的结果为(看来有一个应用提示了两个通知)
[java] view plaincopy
app:pkg=com.zdworks.android.toolbox
app:pkg=com.zdworks.android.toolbox
app:pkg=android
app:pkg=com.htc.android.psclient
之后的工作就是把这个list展示给用户,让用户去选择了
既然360可以这样,病毒为什么不可以呢?病毒fake.apk可以在半夜偷偷安装应用real.apk,几秒钟后,fake.apk执行上面的这些操作,获取360,然后kill!爽!
大家有兴趣可以反编译一下金山和360,他们基本就是这么干的,我发现360比较坏,至于为什么这么说,大家自己去发现吧
ps:我使用的是卡巴斯基免费版,杀毒软件是不会去管有没有广告推送的,广告不是病毒,杀毒软件也不应该干一些不该干的事!
请大家不要用root的手机随意下载软件,更不要以任何借口制造任何病毒!
上一篇将过如何利用root权限来做一次静默安装,有的人会说,安装apk就安装呗,反正哥有金山手机卫士,哥有360主动防御……他们都会弹出通知告诉我的!
安装了新的应用,手机会发送广播,这些所谓的杀毒软件监听这些广播,然后弹出通知
好吧,我承认,他们在一定意义上还是有点用处的,我们先把这个问题放一放,先来说两句题外话
360和和金山手机卫士都有一个让广大android开发者比较蛋疼的一个功能:那就是检查广告通知!
当有通知栏有广告的时候,运行360执行检查,它会告诉你是哪个应用程序的广告(当然,这里并不局限于广告,他们是获得所有通知,然后过滤),然后他会让用户选择:不处理;关闭通知(实际上是把这个进程kill掉,整个软件停止运行);卸载此软件。
虽然我没有发布过android应用,但是我知道,靠软件赚钱的各位,本来收入已经够尴尬的了,再加上这些*的软件提供这些*的功能……哎
大家不喜欢收费软件那咱们就免费,点点广告支持一下总行吧,就是不点,你就放在那呗(当然,有的软件发起广告来没玩没了也挺*)
说了这么多废话,我们就来看看那些所谓的杀毒软件是如何对付大家的
到了关键的地方,实际也就那么一行代码……又让大家失望了。。。
adb shell dumpsys notification
比如,我现在在我机器上面执行一下,输出的结果为
current notification manager state:
notification list:
notificationrecord{41453c70 pkg=com.zdworks.android.toolbox id=7f090092 tag=null pri=0}
icon=0x0 / <name unknown>
contentintent=null
*intent=null
tickertext=null
contentview=null
defaults=0x0
flags=0x62
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
notificationrecord{415f48e8 pkg=com.zdworks.android.toolbox id=7f090080 tag=null pri=100}
icon=0x7f0200fd / com.zdworks.android.toolbox:drawable/barttery_notify_icon
contentintent=pendingintent{41949028: pendingintentrecord{412e3c20 com.zdworks.android.toolbox startactivity}}
*intent=null
tickertext=电量提示
contentview=android.widget.remoteviews@416e7b90
defaults=0x0
flags=0x22
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
notificationrecord{416db3e0 pkg=android id=1040414tag=null pri=100}
icon=0x10804f5 / android:drawable/stat_sys_adb
contentintent=pendingintent{41275de8: pendingintentrecord{416dade8 android startactivity}}
*intent=null
tickertext=usb 调试已连接
contentview=android.widget.remoteviews@416daf40
defaults=0x0
flags=0x2
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
notificationrecord{41790de8 pkg=com.htc.android.psclient id=7f020010 tag=null pri=100}
icon=0x7f020010 / com.htc.android.psclient:drawable/usb_to_pc_notify
contentintent=pendingintent{416c3e38: pendingintentrecord{417bc968 com.htc.android.psclientstartactivity}}
*intent=null
tickertext=null
contentview=android.widget.remoteviews@4169d128
defaults=0x0
flags=0x2
sound=null
vibrate=null
ledargb=0x0 ledonms=0 ledoffms=0
msoundnotification=null
msound=com.android.server.notificationplayer@413e73b8
mvibratenotification=null
mdisablednotifications=0x0
msystemready=true
现在大家知道了吧,这么简单就把咱们给搞定了
下面的事情就简单
1.想办法获取这段log
2.提取包名
3.根据数据库中的黑名单白名单不同处理
4.你的应用很可能在黑名单中,最后的结果也基本是进程被杀死
(这里就不演示3、4部分了,只演示1、2)
[java] view plaincopy
testbutton = (button)findviewbyid(r.id.*);
testbutton.setonclicklistener(new view.onclicklistener() {
public void onclick(view v) {
string[] *s = {“dumpsys notification“};
process process = null;
dataoutputstream dataoutputstream = null;
try {
process = runtime.getruntime().*(“su“);
dataoutputstream = new dataoutputstream(process.getoutputstream());
int length = *s.length;
for (int i = 0; i < length; i++) {
log.e(tag, “*s[“ + i + “]:“ + *s[i]);
dataoutputstream.writebytes(*s[i] + “\n“);
}
dataoutputstream.writebytes(“exit\n“);
dataoutputstream.flush();
process.waitfor();
bufferedreader reader = null;
reader = new bufferedreader(new inputstreamreader(process.getinputstream()));
string line = ““;
list<string> linelist = new arraylist<string>();
final stringbuilder log = new stringbuilder();
string separator = system.getproperty(“line.separator“);
pattern pattern = pattern.compile(“pkg=[^\\s]+“);
while ((line = reader.readline()) != null) {
if(line != null && line.trim().startswith(“notificationrecord“)){
matcher matcher = pattern.matcher(line);
if(matcher.find()){
linelist.add(matcher.group());
}else{
log.e(tag, “what‘s this?!“);
}
}
log.append(line);
log.append(separator);
}
log.v(tag, “log:“ + log.tostring());
int size = linelist.size();
for (int i = 0; i < size; i++) {
log.i(tag, “app:“ + linelist.get(i));
}
} catch (exception e) {
log.e(tag, “copy fail“, e);
} finally {
try {
if (dataoutputstream != null) {
dataoutputstream.close();
}
process.destroy();
} catch (exception e) {
}
}
log.v(tag, “finish“);
}
});
}
上面的这段代码实在没什么技术含量,让给位网友见笑了
按顺序简单解释一下
首先,我们先执行dumpsys notification这条命令,这在上一期的代码中已经有了
然后通过process.getinputstream()获得其输出按行读取,这里只关心类似于下面这种的log
notificationrecord{40dacad8 pkg=com.htc.android.psclient id=7f020010 tag=null pri=100}
然后从中提取出包名即可
其中的正则就是为了提取包名用的,想了解正则的同学可以看我的正则教程
深入入门正则表达式(java)
这里我执行的结果为(看来有一个应用提示了两个通知)
[java] view plaincopy
app:pkg=com.zdworks.android.toolbox
app:pkg=com.zdworks.android.toolbox
app:pkg=android
app:pkg=com.htc.android.psclient
之后的工作就是把这个list展示给用户,让用户去选择了
既然360可以这样,病毒为什么不可以呢?病毒fake.apk可以在半夜偷偷安装应用real.apk,几秒钟后,fake.apk执行上面的这些操作,获取360,然后kill!爽!
大家有兴趣可以反编译一下金山和360,他们基本就是这么干的,我发现360比较坏,至于为什么这么说,大家自己去发现吧
ps:我使用的是卡巴斯基免费版,杀毒软件是不会去管有没有广告推送的,广告不是病毒,杀毒软件也不应该干一些不该干的事!
请大家不要用root的手机随意下载软件,更不要以任何借口制造任何病毒!
全部回复 (28)
2013-05-01 14:48:00
沙发
你牛,我顶!
2013-05-01 14:49:00
板凳
你牛,我顶!
2013-05-01 15:48:00
地板
这帖不错,该顶
2013-05-01 22:23:00
#5
这帖不错,该顶
2013-05-01 22:59:00
#6
看帖回帖是美德!
2013-05-02 09:14:00
#7
安卓我最行!
2013-05-02 09:16:00
#8
祝安卓论坛越来越好!
2013-05-02 11:57:00
#9
你牛,我顶!
2013-05-02 17:26:00
#10
安卓我最行!
2013-05-03 00:15:00
#11
安卓我最行!
2013-05-03 13:03:00
#12
看帖回帖是美德!
2013-05-06 00:40:00
#13
这帖不错,该顶
2013-05-18 18:06:00
#14
安卓的世界,我的世界
2013-05-20 14:53:00
#15
安卓问题、内信1111
2013-05-25 13:00:00
#16
安卓问题、内信50m590
2013-08-18 14:07:00
#17
咯哦睡觉了
2013-08-18 22:19:00
#18
jj
2013-08-18 22:29:00
#19
痛苦了了了了
2013-08-18 22:36:00
#20
ohggjj
2013-08-20 02:45:00
#21
9633
登录 后才能回复
flag举报帖子