记android平台下一次病毒发现之旅

事发时间: 2013.04.27

事发现象: 手机不能待机,自动开启GPRS连接网络

具体分析过程


分析过程1


部分log:

[html]  view plain  copy
 print ?
  1. 04-26 13:20:56.002 W/System.err(  388): java.lang.Throwable  
  2.   
  3. 04-26 13:20:56.002 W/System.err(  388):       at android.net.wifi.WifiManager.setWifiEnabled(WifiManager.java:841)  
  4.   
  5. 04-26 13:20:56.002 W/System.err(  388):       at com.suntu.engine3.engine.ConnectionManagerProxy.setWifiState(ConnectionManagerProxy.java:809)  
  6.   
  7. 04-26 13:20:56.002 W/System.err(  388):       at com.suntu.engine3.engine.ConnectionManagerProxy.selectApn(ConnectionManagerProxy.java:611)  
  8.   
  9. 04-26 13:20:56.012 W/System.err(  388):       at com.suntu.engine3.engine.HttpEngineManager.SelectApn(HttpEngineManager.java:115)  
  10.   
  11. 04-26 13:20:56.012 W/System.err(  388):       at com.suntu.engine3.engine.HttpSocketEngine.run(HttpSocketEngine.java:134)  
  12.   
  13. 04-26 13:20:56.012 W/System.err(  388):       at java.lang.Thread.run(Thread.java:856)  
  14.   
  15. 04-26 13:20:56.012 D/WifiStateMachine(  240): setWifiEnabled(false)  
  16.   
  17. 04-26 13:20:56.012 W/System.err(  240): java.lang.Throwable  
  18.   
  19. 04-26 13:20:56.012 W/System.err(  240):       at android.net.wifi.WifiStateMachine.setWifiEnabled(WifiStateMachine.java:697)  
  20.   
  21. 04-26 13:20:56.012 W/System.err(  240):       at com.android.server.WifiService.setWifiEnabled(WifiService.java:565)  
  22.   
  23. 04-26 13:20:56.012 W/System.err(  240):       at android.net.wifi.IWifiManager$Stub.onTransact(IWifiManager.java:170)  

首先反馈是不能待机,dumpsys power查看发现pid 240(搜狗输入法)持有了一个wakelock.

当时也没细想.结合上面的log,想了下应该是搜狗输入法的问题.毕竟报错的pid和持有wakelock的pid都指向了罪魁祸首是它.

log里最后一句显示setWifiEnabled出错,我惯性思维的以为,可能是程序员没有处理好try/catch块吧,申请了wakelock,忘了释放它.


分析过程2


试想既然假定是搜狗的问题,那么移除了搜狗输入法.就不会复现此问题.

事实完全推翻了我的结论.移除搜狗输入法之后,再次复现,并且log指向的是酷我音乐盒.

点再背,不可能两个apk都有这种问题吧,这些apk都是第三方提供给我们的现成货.我开始怀疑是否有病毒.

com.suntu.engine3.engine入手,在package.list和package.xml都没有他的踪迹.而且是通过Thread启动的.


山穷水复疑无路,柳暗花明又一村


找包名这个线索是断了,既然是病毒导致.总会在进程里留下线索吧.
首先去找搜狗和酷我的map文件.惊喜出现了,都有莫名其妙的so文件.

搜狗


酷我


还有一个很反常的现象是ps里有一个很奇怪的进程.agt这个进程看着就有问题.

记android平台下一次病毒发现之旅_第1张图片

很明显,已经被感染了.反编译了酷我.发现mainactivity被人改动了,添加了新的代码.

mainactivity.smali

[html]  view plain  copy
 print ?
  1. .method public onCreate(Landroid/os/Bundle;)V  
  2.     .locals 6  
  3.   
  4.     const-string v0, "MainActivity"  
  5.   
  6.     const-string v1, "onCreate"  
  7.   
  8.     invoke-static {v0, v1}, Lcn/kuwo/framework/e/a;->b(Ljava/lang/String;Ljava/lang/String;)V  
  9.   
  10.     invoke-super {p0, p1}, Lcn/kuwo/player/activities/BaseActivity;->onCreate(Landroid/os/Bundle;)V  
  11.   
  12.     invoke-static {p0}, Lcn/kuwo/player/MainActivityyb;->aa(Landroid/app/Activity;)V  
  13.   
  14.     const/4 v0, 0x1 ......省略部分代码  

里面多了一句调用Acinactivityyyb的静态方法aa

aa方法如下

[html]  view plain  copy
 print ?
  1. .method public static aa(Landroid/app/Activity;)V  
  2.     .locals 3  
  3.     .parameter  
  4.   
  5.     .prologue  
  6.     .line 36  
  7.     new-instance v0, Landroid/content/Intent;  
  8.   
  9.     sget-object v1, Lcn/kuwo/player/MainActivityyb;->recvMsg:Ljava/lang/String;  
  10.   
  11.     invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V  
  12.   
  13.     .line 37  
  14.     const-string v1, "act"  
  15.   
  16.     const-string v2, "true"  
  17.   
  18.     invoke-virtual {v0, v1, v2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;  
  19.   
  20.     .line 38  
  21.     invoke-virtual {p0}, Landroid/app/Activity;->getApplicationContext()Landroid/content/Context;  
  22.   
  23.     move-result-object v1  
  24.   
  25.     invoke-virtual {v1, v0}, Landroid/content/Context;->sendBroadcast(Landroid/content/Intent;)V  
  26.   
  27.     .line 39  
  28.     return-void  
  29. .end method  

发了一个广播,并且自己接受了这个广播.

为什么这么肯定是他自己接受了这个广播.Manifest暴露了一切.

[html]  view plain  copy
 print ?
  1. <receiver android:name="cn.kuwo.player.MainActivityyb">  
  2.             <intent-filter android:priority="2147483647">  
  3.                 <action android:name="cn.kuwo.player.krhkocwca" />  
  4.                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />  
  5.                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />  
  6.                 <action android:name="android.intent.action.BOOT_COMPLETED" />  
  7.                 <category android:name="android.intent.category.LAUNCHER" />  
  8.             </intent-filter>  
  9.         </receiver>  

onReceive里没什么好说的主要就是调用了addURL函数.这个函数就是去下载病毒,com.suntu.engine3.engine-就是这货.运行方式是通过DexClassLoader启动,所以在系统里找不到相关痕迹.


至此总结一下,两个被感染的文件都是oncreate被修改,执行了未知代码.这段代码会从网上下载病毒.很明显属于下载者病毒.

一旦你点击被感染的apk.就会下载bin文件和apk&dex文件&so文件

kuwo

记android平台下一次病毒发现之旅_第2张图片

sogou

记android平台下一次病毒发现之旅_第3张图片

最后反编译dex文件,定位到不能待机的代码

不待机的原因是病毒执行申请wakelock锁的时候没有做好异常处理.
[java]  view plain  copy
 print ?
  1. private void acquireWakeLock()  
  2.  {  
  3.    try  
  4.    {  
  5.      if (this.wakeLock == null)  
  6.        this.wakeLock = this.pm.newWakeLock(1, getClass().getCanonicalName());  
  7.      if (this.wakeLock != null)  
  8.      {  
  9.        Engine.engine.getMain().Log("acquireWakeLock");  
  10.        this.wakeLock.acquire();  
  11.      }  
  12.      return;  
  13.    }  
  14.    catch (Exception localException)  
  15.    {  
  16.      while (true)  
  17.        Engine.engine.getMain().Log(localException.toString());  
  18.    }  
  19.  }  


如果产生异常,代码没有在catch里释放这个锁.所以会一直看到宿主进程一直持有

com.suntu.engine3.engine.JpowerManager

这个wakelock,导致手机无法睡眠.

总结

这货居然各种手机杀毒软件都杀不出来,所以不见得我们的手机是多安全的.不要去xx市场下乱下apk玩.搞不好都是有病毒的哦,亲 偷笑.

你可能感兴趣的:(记android平台下一次病毒发现之旅)