安卓APP在运行时,每个进程都有单独的进程空间,这是因为每个进程都独有一个Davlik虚拟机。系统启动时会先启动init进程,init进程会启动zygote进程,该进程会为每个要启动的App进程孵化出一个Davlik虚拟机实例.之后该虚拟机实例会将要运行App的DEX文件映射到内存中。
通过虚拟机实例调用dvmDexFileOpenPartial()来解析,加载DEX文件格式.。关于DEX文件格式见博客
dvmDexFileOpenPartial的函数原型如下
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
参数1:加载的DEX文件在内存中的基址.(也就是DEX.035)
参数2:加载的DEX文件的文件长度,
参数3:略。
本次第一代的阿里加固主要就是将DEX文件入口隐藏,而脱壳的关键也在于找到DEX的入口.
1.首先将实验用的APK装入真机中。
失败原因:(1)1可能可能是手机上也需要没确认。
(2)手机上需要确认adb通信。
(3)如果其他原因请确认ADB时候正常。
2.使用AndroidKillers静态分析
入口的MainActivity被隐藏了。在程序启动时系统会创建一个application对象用来储存系统以及Activity等一些组件的信息。
在配置文件中android:name="com.ali.mobisecenhance.StubApplication" ,分析该类。
该类你创建了三个原生函数。配置动态调试so文件环境分析。
3.将IDA的 的Android_server插件放入手机的 ./data/local/tmp文件中。
(1)找到该文件文件夹。按住shift右击选择在此处打开命令行。
(2)执行adb push android_server ./data/local/tmp
(3)进入./data/local/tmp文件夹中设置android_server权限为777 (可读可写可执行)
6.启动android_server
7.将原APK文件中解压出的so文件拖入IDA中,配置调试选项。
首先选择调试环境为ARM,然后再次选择Debbugger->Process options
设置hostname为localhost,与port为23946.(在一些反调试会检测该端口,遇到此类反调试可以修改端口为其他)
7.设置端口通信转发
adb forward tcp:23946 tcp:23946
7.以调试状态启动Activity
adb shell am start -D -n com.ali.tg.testapp/.MainActiity
8.IDA附加进程
选择以调试方式启动的com.ali.tg.testapp的测试APP
OK之后进入调试模式。断在了onload,再次启动。
找到attachBaseContext。在Export中搜索函数名,或者搜索字符串
找到initclass函数下断点。
启动java层调试so文件。
jdb -connectcom.sun.jdi.SocketAttach:hostname=localhost,port=8700
搜索不到所以该函数是动态注册的。搜索该字符串。
Ctrl+F在模块中搜索dvm
双击,Ctrl+F搜索dvmdexfile
双击,下断点
8.F9运行 9.shift+F2
static main(void)
{
auto fp, begin, end, dexbyte;
fp = fopen("d:\dump1.dex", "wb");
begin = r0;
end = begin + r1;
for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
fputc(Byte(dexbyte), fp);
}
Dump出dex文件.
参考博客:http://developer.51cto.com/art/201002/182933.html.