Android逆向

apk壳检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import zipfile
'''
first,get namelist from apk
second,matching the features
thrid,julging for the shellType
so easy~~
by zsdlove
2018/8/24 Morning
'''
shellfeatures={
"libchaosvmp.so":"娜迦",
"libddog.so":"娜迦",
"libfdog.so":"娜迦",
"libedog.so":"娜迦企业版",
"libexec.so":"爱加密",
"libexecmain.so":"爱加密",
"ijiami.dat":"爱加密",
"ijiami.ajm":"爱加密企业版",
"libsecexe.so":"梆梆免费版",
"libsecmain.so":"梆梆免费版",
"libSecShell.so":"梆梆免费版",
"libDexHelper.so":"梆梆企业版",
"libDexHelper-x86.so":"梆梆企业版",
"libprotectClass.so":"360",
"libjiagu.so":"360",
"libjiagu_art.so":"360",
"libjiagu_x86.so":"360",
"libegis.so":"通付盾",
"libNSaferOnly.so":"通付盾",
"libnqshield.so":"网秦",
"libbaiduprotect.so":"百度",
"aliprotect.dat":"阿里聚安全",
"libsgmain.so":"阿里聚安全",
"libsgsecuritybody.so":"阿里聚安全",
"libmobisec.so":"阿里聚安全",
"libtup.so":"腾讯",
"libexec.so":"腾讯",
"libshell.so":"腾讯",
"mix.dex":"腾讯",
"lib/armeabi/mix.dex":"腾讯",
"lib/armeabi/mixz.dex":"腾讯",
"libtosprotection.armeabi.so":"腾讯御安全",
"libtosprotection.armeabi-v7a.so":"腾讯御安全",
"libtosprotection.x86.so":"腾讯御安全",
"libnesec.so":"网易易盾",
"libAPKProtect.so":"APKProtect",
"libkwscmm.so":"几维安全",
"libkwscr.so":"几维安全",
"libkwslinker.so":"几维安全",
"libx3g.so":"顶像科技",
"libapssec.so":"盛大",
"librsprotect.so":"瑞星"
}
def shellDetector(apkpath):
shellType=""
shellsign=""
flag=True
zipfiles=zipfile.ZipFile(apkpath)
nameList=zipfiles.namelist()
for fileName in nameList:
for shell in shellfeatures.keys():
if shell in fileName:
flag=True
shellType=shellfeatures[shell]
shellsign=shell
break
else:
flag=False
if flag==True:
print("经检测,该apk使用了"+shellType+"进行加固")
if __name__ == '__main__':
shellDetector("test.apk")

脱壳方法

  • dumpDex

    dumpDex-Android脱壳:https://github.com/WrBug/dumpDex

    dumpDex是一个github上开源的xposed插件,可以用来脱掉当前市场上大部分的壳。

    一、准备工作

        首先需要root的手机一部,我使用的是华为荣耀6(android5.1),安装好xposed框架

        dumpDex项目地址:https://github.com/WrBug/dumpDex

        可以直接下载release的apk,也可以自行编译打包成apk安装到手机,我个人比较喜欢第二种。

        安装好apk后,对于32位手机,需要将lib/armeabi-v7a/libnativeDump.so复制到/data/local/tmp/libnativeDump.so,权限设置为777。

    二、开始脱壳

       1515214-20191209202615320-855088235

        反编译apk后,根据特征发现是使用了梆梆加固

        安装插件,重启手机,打开加固的apk,脱壳的后的dex会在/data/data/对应包路径/dump文件夹下

       1515214-20191209204222043-373634842

        脱壳后的dex如图所示,其中有一部分是壳的dex,需要自己自行选择一下

     三、补充说明

        设置权限问题,GitHub上有详细说明

        编译过程有可能会有让你设置签名的一个问题,直接设置成你的debug签名就可

       如果加固后的包名在PackageInfo.java中没有对应的,自行加到PackageInfo.java中即可

        应用有可能有卡死状况或者手机重启状况,但应该能脱出壳来,建议多脱几遍

        1515214-20191209205153835-993146226

       源码部分如果是百度系的壳,直接返回并有没dump,因为还没遇到过百度的壳,暂不知道具体原因

  • FART

    1、安装镜像

    https://github.com/hanbinglengyue/FART上下载镜像,然后按照https://www.bodkin.ren/index.php/archives/513/刷机,中间没有遇到什么问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    adb reboot bootloader
    fastboot oem unlock

    fastboot flash system system.img
    fastboot flash userdata userdata.img
    fastboot flash boot boot.img
    fastboot flash cache cache.img
    fastboot flash ramdisk ramdisk.img
    fastboot reboot

    2、修改fart文件并上传

    将fart配置文件fart复制到/data/fart(注意文件权限问题,和换行的问题),其中,fart配置文件中为要脱壳的app包名

    1
    adb push ~/app_crack/fart/test/fart  /data

    20179028-4f502705af9aa74f

    3、查看日志确认

    1
    2
    # 在命令行输入下面的命令,然后打开app
    adb logcat -s ActivityThread

    20179028-32b9c75f97ed7a86

    4、查看脱出来的dex

    1
    adb pull /sdcard/fart/包名/6600696_dexfile.dex .

    20179028-0e0e17108be7cabe

  • Frida

    https://github.com/hluwa/FRIDA-DEXDump

    https://github.com/GuoQiang1993/Frida-Apk-Unpack

    使用:

    1. 默念一声”我想脱个壳”。
    2. 启动 APP。
    3. 启动 frida-server。
    4. python main.py。
    5. 默数三秒,脱好了。

    或者可以将脚本封装成命令,就像这样:

    715510_KETE3VDRG42AS8P