首页
社区
课程
招聘
[翻译]DIY:Android恶意应用分析-分解OBAD(1)
发表于: 2014-1-17 12:17 24901

[翻译]DIY:Android恶意应用分析-分解OBAD(1)

2014-1-17 12:17
24901

原文:DIY: Android Malware Analysis – Taking apart OBAD (part 1)
出处:http://securityintelligence.com/diy-android-malware-analysis-taking-apart-obad-part-1/
作者:Zubair Ashraf , IBM X-Force Advanced Research
时间:2013.10.14

“知己知彼,百战不殆;不知彼而知己,一胜一负;不知彼,不知己,每战必殆。”
                                                       -孙子兵法

    我计划定期写一些DIY系列的文章,目标不仅在于了解恶意软件、漏洞和利用,也与我们的读者分享一些技术和工具,他们可以使用自己“知彼”。我也期待听到你在分析类似应用的经验,相似或更有效的工具和技术。

    好吧,让我们正式开始,OBAD已被确认为安卓恶意软件最精妙作品之一  ,你可以找到各种分析结果。在这个系列中,我们将它拆开了解其功能和各种技术,它是很强大的能免卸载也很难分析。在第一部分中,我们将看到如何使用动态代码分析,使用jdb调试,smali(Dalvik的反汇编源代码)级别的调试,使用JDB命令来了解被调用的反射代码和字符串解密,使用IDA理解可视化控制和数据流,修改AOSP代码和构建定制系统映像来绕过OBAD使用的反模拟器技巧。

一、从哪里得到它

   我们将使用示例MD5:e1064bfd836e4c895b569b2de4700284(VirusTotal analysis )。你可以从Contagio Mobile下载它

二、查看APK文件的内容

    apk文件可以简单地压缩如zip文件一样,其中包括二进制格式的 manifest文件,这通常可以转换成一个可读的文件,下载AXMLPrinter2.jar并运行

Shell
java –jar AXMLPrinter2.jar AndroidManifest.xml
Shell
mobisec@Mobisec:/opt/mobisec/devtools/android-sdk/tools$ emulator-arm -avd Android_4.0.3 -scale 0.75 -debug all -logcat all -no-boot-anim
Shell
mobisec@Mobisec-VM:~$  adb install Malware/OBad/E1064BFD836E4C895B569B2DE4700284.apk
 
147 KB/s (84306 bytes in 0.558s)
pkg: /data/local/tmp/E1064BFD836E4C895B569B2DE4700284.apk
Success
Shell

$> adb shell logcat | grep -Ei "E1064B|system.admin"
 
W/ActivityManager( 80): No content provider found for permission revoke: file:///data/local/tmp/e1064bfd.apk
D/dalvikvm( 493): GC_CONCURRENT freed 400K, 8% free 6526K/7047K, paused 11ms+4ms
W/ActivityManager( 80): No content provider found for permission revoke: file:///data/local/tmp/e1064bfd.apk
I/PackageManager( 80): Running dexopt on: com.android.system.admin
D/dalvikvm( 753): DexOpt: 'Lcom/android/internal/telephony/IExtendedNetworkService;' has an earlier definition; blocking out
D/dalvikvm( 753): DexOpt: not verifying/optimizing 'Lcom/android/internal/telephony/IExtendedNetworkService;': multiple definitions
D/dalvikvm( 753): DexOpt: load 77ms, verify+opt 1198ms
I/ActivityManager( 80): Force stopping package com.android.system.admin uid=10042
D/PackageManager( 80): New package installed in /data/app/com.android.system.admin-1.apk
W/PackageManager( 80): Unknown permission android.permission.READ_EXTERNAL_STORAGE in package com.android.system.admin
W/PackageManager( 80): Not granting permission android.permission.MODIFY_PHONE_STATE to package com.android.system.admin (protectionLevel=3 flags=0x8be44)
W/PackageManager( 80): Not granting permission android.permission.WRITE_SECURE_SETTINGS to package com.android.system.admin (protectionLevel=3 flags=0x8be44)
W/PackageManager( 80): Unknown permission android.permission.ACCESS_BLUETOOTH_SHARE in package com.android.system.admin
D/dalvikvm( 80): GC_CONCURRENT freed 345K, 8% free 8789K/9543K, paused 9ms+13ms
I/AppSecurityPermissions( 223): Ignoring unknown permission:android.permission.READ_EXTERNAL_STORAGE
I/AppSecurityPermissions( 223): Ignoring unknown permission:android.permission.ACCESS_BLUETOOTH_SHARE
D/PackageManager( 80): generateServicesMap(android.accounts.AccountAuthenticator): 2 services unchanged
D/PackageManager( 80): generateServicesMap(android.content.SyncAdapter): 4 services unchanged
D/BackupManagerService( 80): Received broadcast Intent { act=android.intent.action.PACKAGE_ADDED dat=package:com.android.system.admin ***=0x10000010 (has extras) }
V/BackupManagerService( 80): addPackageParticipantsLocked: com.android.system.admin
Shell

mobisec@Mobisec-VM:~$ adb forward tcp:31415 tcp:31415
 
mobisec@Mobisec-VM:~$ sudo drozer console connect
 
dz> cd app.package
 
dz#app.package> run info -a com.android.system.admin
 
dz#app.package> run attacksurface com.android.system.admin
 
dz#app.package> run manifest com.android.system.admin
 
# More interestingly:
 
dz#app.package> run launchintent com.android.system.admin
 
tells us that the launcher activity for this package
 
com.android.system.admin.CCOIoll
 
# Now if we wanted to manually launch this activity we can do so via:
 
dz#app.activity> run start --component com.android.system.admin com.android.system.admin.CCOIoll
 
# if we want to use the sdk tools only we can start this activity as:
 
mobisec@Mobisec:~$ adb shell am start -a android.intent.category.LAUNCHER -n com.android.system.admin/.CCOIoll
Shell

# start the monitor tool
 
/opt/mobisec/devtools/android-sdk/tools/monitor &    # this has DDMS that can port forward any VM's specific debugging port to the standard port used by jdb which is 8700
Shell

dz#app.activity> run start --component com.android.system.admin com.android.system.admin.CCOIoll
 
OR
 
mobisec@Mobisec:~$ adb shell am start -a android.intent.category.LAUNCHER -n com.android.system.admin/.CCOIoll
mobisec@Mobisec:~$ jdb -attach localhost:8700
Shell

stop in com.android.system.admin.COcCccl.onCreate
 
and attached the jdb to the app:
 
mobisec@Mobisec-VM:~$ jdb -attach localhost:8700
 
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
*** Reading commands from /home/mobisec/.jdbrc
Deferring breakpoint com.android.system.admin.COcCccl.onCreate.
It will be set after the class is loaded.
> > Set deferred breakpoint com.android.system.admin.COcCccl.onCreate
 
Breakpoint hit: "thread=<1> main", com.android.system.admin.COcCccl.onCreate(), line=4,327 bci=0
 
<1> main[1]
<1> main[1] trace go methods
<1> main[1] cont
 
[One can also run trace go methods for just the main thread]
Shell

"exclude" feature in jdb,
 
running help in jdb and we see
 
exclude [<class pattern>, ... | "none"]   -- do not report step or method events for specified classes
 
issuing the exclude command on jdb prompt we see
 
> > exclude
java.*,javax.*,sun.*,com.sun.*,
Shell

mobisec@Mobisec-VM:~$ vi ~/.jdbrc;jdb -attach localhost:8700
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
*** Reading commands from /home/mobisec/.jdbrc
Set breakpoint java.lang.System.exit(int)
> > cont
Nothing suspended.
>
Breakpoint hit: "thread=<1> main", java.lang.System.exit(), line=181 bci=0
 
<1> main[1] wherei
[1] java.lang.System.exit (System.java:181), pc = 0
[2] com.android.system.admin.COcCccl.onCreate (null), pc = 1,041
[3] android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:969), pc = 0
[4] android.app.ActivityThread.handleBindApplication (ActivityThread.java:3,954), pc = 729
[5] android.app.ActivityThread.access$1300 (ActivityThread.java:123), pc = 0
[6] android.app.ActivityThread$H.handleMessage (ActivityThread.java:1,185), pc = 177
[7] android.os.Handler.dispatchMessage (Handler.java:99), pc = 20
[8] android.os.Looper.loop (Looper.java:137), pc = 122
[9] android.app.ActivityThread.main (ActivityThread.java:4,424), pc = 34
[10] java.lang.reflect.Method.invokeNative (native method)
[11] java.lang.reflect.Method.invoke (Method.java:511), pc = 17
[12] com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:784), pc = 11
[13] com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551), pc = 66
[14] dalvik.system.NativeStart.main (native method)
<1> main[1]
Shell

#decompile the apk with -d (debugging)
 
c:\downloads\apktool_2\Apktool\brut.apktool\apktool-cli\build\libs>java -jar apktool-cli-2.0.0-Beta5.jar d -d -o decompiled_with_apktool_2_with_debug d:\OBad\E1064BFD836E4C895B569B2DE4700284.apk
 
This will give you (among other things) java source files with smali code, e.g.
 
you will find COcCccl.java in decompiled_with_apktool_2_with_debug\smali\com\android\system\admin
 
and if you look at the code for onCreate you would see it as:
 
a=0;// # virtual methods
a=0;// .method public onCreate()V
a=0;// .locals 10
a=0;//
a=0;// invoke-super {p0}, Landroid/app/Application;->onCreate()V
a=0;//
a=0;// invoke-direct {p0}, Lcom/android/system/admin/COcCccl;->oIOccOcl()Z
a=0;//
a=0;// move-result v0
a=0;//
a=0;// #v0=(Boolean);
a=0;// if-eqz v0, :cond_0
a=0;//
a=0;// const/4 v0, 0x1
a=0;//
a=0;// #v0=(One);
a=0;// invoke-static {v0}, Ljava/lang/System;->exit(I)V

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (8)
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
2
写封信给作者去催一催吧,哈哈
2014-1-17 12:57
0
雪    币: 28
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不说还真没往这儿想,等下就试试
2014-1-17 13:14
0
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
4
国外的作者大部分都比较nice。。
2014-1-17 13:16
0
雪    币: 28
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
ok,下午发邮件催催
2014-1-17 13:25
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看到后面居然是不完整的。楼主催催作者写吧
2014-2-2 13:57
0
雪    币: 277
活跃值: (3358)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
作者开始写了没,,求下文
2014-2-14 11:37
0
雪    币: 30
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
part2现在有了。
http://securityintelligence.com/diy-android-malware-analysis-taking-apart-obad-part-2/
2014-3-31 23:09
0
雪    币: 64
活跃值: (134)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark一下,顶楼主
分析的相当细致。赞一个
2015-9-6 17:59
0
游客
登录 | 注册 方可回帖
返回
//