Android脱壳入门教程

2019-02-26

当前主流加固产品主要是对移动应用所有 DEX 代码进行完整加密,并使用壳DEX代替原DEX,修改Androidmanifest.xml中的入口,并将核心代码加密替换,在移动应用启动时选择合适时机进行内存解密后并依据相关业务流程继续执行。此外,部分加固产品还具有加密so文件、html和js文件的功能,少数加固产品还增加了vmp虚拟指令。而脱壳就是拿到apk原dex的过程。

脱壳主要工具:ida、Android sdk、拥有root权限的Android手机或模拟器(android4.0以上版本)

要脱壳,首先要熟悉dex文件结构,Android应用安装包apk文件其实是一个压缩文件,可以用7z等工具直接打开,而dex就是是指java代码编译后生成的Android dalvik虚拟机运行程序文件,通常反编译查看java源代码就是反编译了这个文件。

dex文件结构如下,其中对于我们来说最重要的是要记住“dex.035”这个关键词

加固产品一直在发展,到目前不少加固厂商已经开始使用vmp加固。作为脱壳入门教程,本文主要介绍第一二代壳脱壳方法。第一二代壳在app运行过程中会还原出完整的dex文件到内存中,而脱壳的原理就是当内存中出现dex文件时,将其dump到本地文件系统。详细步骤如下:

1、安装待脱壳apk到Android手机或模拟器(文末有下载链接),并打开开发者选项中的usb调试,连接上电脑。

2、将ida安装目录下下dbgsrv中的android_server push到手机/data/local/tmp目录中。注意要push与手机或模拟器架构相同的文件。例如靠谱Android模拟器通常使用的是x86,则需要push android_x86_server。

adb push android_server /data/local/tmp/android_server

3、赋予android_server可执行权限后,开始运行。

adb shell
su
cd /data/local/tmp
chmod 777 frida_server
./frida_server

出现上图中的Listening on …..表示启动成功。

4、打开另一个终端窗口,使用adb端口转发。

adb forward tcp:23946 tcp:23946

5、通过反编译Androidmanifest.xml文件或使用aapt工具查找到apk的包名和主入口。aapt命令如下:

aapt dump badging ***.apk

6、以调试模式启动app。(手动反编译apk将androidmanifest.xml中的android:debuggable改为true,或者用我另一篇博客中的方式将Android手机debuggable永久设置为true)

adb shell am start -D -n com.example.protectapp/org.isclab.shh.protectapp.MainActivity

此时,Android手机或者模拟器屏幕上会出现waiting For Debugger,先不要点击任何地方。

7、IDA调试。

打开IDA,点击Debugger>Attach>Remote ARMLinux/Android debugger,Hostname设置为127.0.0.1,port设置为23946,点击ok。然后点点击Debugger>attach to process,在出现的进程列表中找到com.example.protectapp(可以搜索),点击进入。

等待一段时间后,会进入调试界面:

点击Modules(如果没有,则点击windows,添加Modules),直接搜索libart.so

点击进入/system/lib/libart.so,继续搜索openmemory

这时可能会出现多个,点击第一个进入,在该函数第一行F2打上断点

8、JDB附加

此时,我们还需要另一个工具,Android studio 和eclipse都有的Android device monitor,查看待调试app的端口。

知道端口后,我们使用jdb开始附加。

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 //失败则改为上图中的另一个端口,例如我的是8600。

此时会看到monitor中红色的debug图标变为绿色。此时切换到IDA界面。开始点击运行,程序会在我们下的端点处暂停。此时鼠标点击一下Hex vew窗口,然后在General registers窗口中找到bfsprotect.jar,点击左边的箭头

这时Hex view窗口会出现dex.o35,表示我们已经找到了内存中的dex文件。General registers窗口中的R1为dex文件起始地址,R2表示dex文件长度。如果没有出现,则继续F8单步调试。

9、开始dump

点击IDA菜单栏的File>script command…,在出现的窗口中输入以下代码:

static main(void){   
	auto fp, dex_addr, end_addr;   
	fp = fopen("F:\\dump.dex", "wb");  //路径可以自己定义
	end_addr = R1 + R2;   
	for ( dex_addr=R1; dex_addr < end_addr; dex_addr ++ )       
		fputc(Byte(dex_addr), fp);
}

点击Run开始运行

此时会出现 Running IDC script Please wait…的弹窗,等待一段时间,等弹窗消失,打开对应文件夹,出现dex文件,表示dump成功。

到此,脱壳就已经完成,dex文件可以使用d2j工具转换成jar包阅读,也可以直接使用jeb等工具打开。

这个壳没有防调试,其他壳如果有防调试,可以在fopen处下断点,修改TracerId为0即可。具体方法百度。

待脱壳apk下载

《Android脱壳入门教程》有一个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注