0%

Android脱壳

Android脱壳

比较简单的示例,拖一个阿里的壳,从别的地方学习借鉴到的。https://blog.csdn.net/coc_k/article/details/51985976
首先脱壳Android Killer,发现是阿里的壳。
壳
看一下入口类:

1
android:name="com.ali.mobisecenhance.StubApplication"

明显是加壳了,而且文件结构中只有一个类,典型的加固,使用IDA进行脱壳。

使用调试模式打开APP,使用到的命令:
adb shell am start -D -n com.ali.tg.testapp/.MainActivity

调试模式
等待我们的调试进程进行附加

我们使用IDA附加进程。来到:/system/lib/libdvm.so 这个库文件中,在导出函数:dvmDexFileOpenPartial的开始位置下断:

特定函数下断

下好断点之后,连接调试进程:jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

输入这条命令之后,JDB就会在等待IDA运行,运行之后JDB就输出:

1
2
3
4
C:\Users\a>jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
设置未捕获的java.lang.Throwable
设置延迟的未捕获的java.lang.Throwable
正在初始化jdb...

这个可能失败,要注意看看DDMS怎么个情况。
然后我们程序就会断在:

断下
我们是在dvmDexFileOpenPartial这个函数断下的,所以我们的第一个参数是dex文件的起始地址,第二个参数是dex文件的长度。第一个参数的值存在R0,第二个参数的值存在R1。我们转到R0看一下:
R0寄存器
可以看到起始地址就是我们想要要的,然后使用脱壳脚本进行脱壳,R0:0x4E472008,R1:0x941FC

1
2
3
4
5
6
7
8
9
10
11
static main(void)
{
auto fp, begin, end, dexbyte;
fp = fopen("d:\\dump.dex", "wb"); //打开或创建一个文件
begin = 0x4E472008; //dex基址
end = begin + 0x941fc; //dex基址 + dex文件大小
for ( dexbyte = begin; dexbyte < end;dexbyte ++ )
{
fputc(Byte(dexbyte), fp); //按字节将其dump到本地文件中
}
}

运行这个脚本,会在D盘下生成一个dex文件。
运行脚本
然后我们将脱掉的dex反编译。
反编译dex
最后得到smali文件:
生成文件
然后我们将这两个文件拖进Android Killer的。
复制
新文件
然后我们将我们的入口APP类删除掉,最后就是剩下我们脱掉壳的程序了。
删除入口类
然后我们进行编译!最终就会生成脱壳之后的apk文件。
能够正常运行。
脱壳成功