阿里第一代 android dex加固的脱壳方法
2016-07-21 19:34
711 查看
测试程序
链接:http://pan.baidu.com/s/1cMGmF8 密码:8xgn
脱壳环境: Android 4.2、dalvik模式、 root…
使用到的工具:
IDA 6.8 Android
Device Monitor
Android Killer V1.3.1.0
Android逆向助手V2.2
将程序拖入Android killer 工具中 ,弹出如下窗口
在清单文件中看到application中有定义android:name
Android:name 不了解 、网上收集了下
android:name属性是用来设置所有activity 属于哪个application的,默认是android.app.Application。
当然也可以自己定义一个类,例如:
public class TestApplication extends Application {}
这个类的作用是为了放一些全局的和一些上下文都要用到的变量和方法。
然后在 AndroidManifest.xml 中 application 节点中添加android:name属性
这样就可以将默认的Application给设置成我们自定义的TestApplication
这样处理的好处是:继承的话,当应用程序退出后其生命周期也跟着结束,
而用静态类的话程序退出后不会立刻被gc回收,当你再次进入后会发现该静态类保存的信息状态
是之前的。有可能会导致程序不是你想要的初始化状态。
PS:TestApplication一定要指明类域为public,否则运行时候会报错找不到这个类。
即使写成这样:class TestApplication extends Application{}也不可以,因为默认情况只是为包可见
大概看出,程序的入口已经不是默认的application了,而是
我们去找StubApplication类看个究竟
可以看到,StubApplication加载了一个so文件。名字是libmobisec.so,并声明了3个方法
疑问:并没有代码中看到调用这3个so文件中的方法,可能是工具没有解析全,需要进一步探究,这里掠过。。。
下一步我们去分析so文件。这里掠过。。。
猜测:
这个so文件是解密dex文件的。
我们让程序运行起来,在Dalivk开始加载解密后的dex文件时,把dex文件从内存中dump下来即可。
根据android源码知道,Dalivk在加载dex文件时用到方法
此方法第一个参数是dex的基址,第二个参数是dex的大小。这正是我们需要的。
1. 以调试模式启动测试程序
2. 用IDA附加测试程序
3. 在内存中给dvmDexFileOpenPartial下断点,运行程序, 得到方法dvmDexFileOpenPartial参数1和参数2的值
4. 运行IDA脚本,dump dex到本地。
下面是详细操作步骤
1.以调试模式启动测试程序
命令格式:
2.用IDA附加测试程序
把程序android_server push到安卓设备/data/local/tmp/目录下并运行 【android_server在IDA 6.8\dbgsrv目录下】
设置端口转发,转发PC数据到手机,端口为android_server监听的端口
打开IDA程序,选择如下
3.在内存中给dvmDexFileOpenPartial下断点,运行程序
在模块搜索dvm,然后双击进入so程序
接着搜索关键 函数 DvmDexFileOpenPartial
打开Android Device Monitor
在控制台输入指令
jdb connect : 连接被调试程序应用层,使程序运行起来
按F8单步调试一下,看栈的变化,得到方法dvmDexFileOpenPartial参数1和参数2的值
为了验证是否正确,按快捷键 G ,输入地址0x4c05a008,跟过去瞧瞧,可见是正确的
3.运行IDA脚本,dump dex到本地。
打开脚本窗口- File –Script Command 或直接用快捷键“Shift + F2 ”
将dex基址改为0x4c05a008,dex文件大小改为0x941fc
如图,点击运行,稍等片刻
可以看到D盘目录下多一个dex文件
接下来用 工具 Android逆向助手 反编译dex文件
在Android Killer V1.3.1.0中打开这个路径,将反编译dex文件后生成的两个文件android和com复制到smali目录下
在清单文件中删除android:name属性,并保存
最后编译、安装、运行
能运行,我们脱壳并修复成功了
链接:http://pan.baidu.com/s/1cMGmF8 密码:8xgn
脱壳环境: Android 4.2、dalvik模式、 root…
使用到的工具:
IDA 6.8 Android
Device Monitor
Android Killer V1.3.1.0
Android逆向助手V2.2
将程序拖入Android killer 工具中 ,弹出如下窗口
在清单文件中看到application中有定义android:name
Android:name 不了解 、网上收集了下
android:name属性是用来设置所有activity 属于哪个application的,默认是android.app.Application。
当然也可以自己定义一个类,例如:
public class TestApplication extends Application {}
这个类的作用是为了放一些全局的和一些上下文都要用到的变量和方法。
然后在 AndroidManifest.xml 中 application 节点中添加android:name属性
application android:icon="@drawable/icon"android:label="@string/app_name" android:name =".TestApplication"
这样就可以将默认的Application给设置成我们自定义的TestApplication
这样处理的好处是:继承的话,当应用程序退出后其生命周期也跟着结束,
而用静态类的话程序退出后不会立刻被gc回收,当你再次进入后会发现该静态类保存的信息状态
是之前的。有可能会导致程序不是你想要的初始化状态。
PS:TestApplication一定要指明类域为public,否则运行时候会报错找不到这个类。
即使写成这样:class TestApplication extends Application{}也不可以,因为默认情况只是为包可见
大概看出,程序的入口已经不是默认的application了,而是
com.ali.mobisecenhance.StubApplication
我们去找StubApplication类看个究竟
可以看到,StubApplication加载了一个so文件。名字是libmobisec.so,并声明了3个方法
疑问:并没有代码中看到调用这3个so文件中的方法,可能是工具没有解析全,需要进一步探究,这里掠过。。。
下一步我们去分析so文件。这里掠过。。。
猜测:
这个so文件是解密dex文件的。
我们让程序运行起来,在Dalivk开始加载解密后的dex文件时,把dex文件从内存中dump下来即可。
根据android源码知道,Dalivk在加载dex文件时用到方法
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
此方法第一个参数是dex的基址,第二个参数是dex的大小。这正是我们需要的。
1. 以调试模式启动测试程序
2. 用IDA附加测试程序
3. 在内存中给dvmDexFileOpenPartial下断点,运行程序, 得到方法dvmDexFileOpenPartial参数1和参数2的值
4. 运行IDA脚本,dump dex到本地。
下面是详细操作步骤
1.以调试模式启动测试程序
命令格式:
adb shell am start -D -n PackageName/ActivityName
2.用IDA附加测试程序
把程序android_server push到安卓设备/data/local/tmp/目录下并运行 【android_server在IDA 6.8\dbgsrv目录下】
设置端口转发,转发PC数据到手机,端口为android_server监听的端口
打开IDA程序,选择如下
3.在内存中给dvmDexFileOpenPartial下断点,运行程序
在模块搜索dvm,然后双击进入so程序
接着搜索关键 函数 DvmDexFileOpenPartial
打开Android Device Monitor
在控制台输入指令
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
jdb connect : 连接被调试程序应用层,使程序运行起来
按F8单步调试一下,看栈的变化,得到方法dvmDexFileOpenPartial参数1和参数2的值
为了验证是否正确,按快捷键 G ,输入地址0x4c05a008,跟过去瞧瞧,可见是正确的
3.运行IDA脚本,dump dex到本地。
打开脚本窗口- File –Script Command 或直接用快捷键“Shift + F2 ”
将dex基址改为0x4c05a008,dex文件大小改为0x941fc
static main(void) { auto fp, begin, end, dexbyte; fp = fopen("d:\\dump.dex", "wb"); //打开或创建一个文件 begin = 0x4c05a008; //dex基址 end = begin + 0x941fc; //dex基址 + dex文件大小 for ( dexbyte = begin; dexbyte < end;dexbyte ++ ) { fputc(Byte(dexbyte), fp); //按字节将其dump到本地文件中 } }
如图,点击运行,稍等片刻
可以看到D盘目录下多一个dex文件
接下来用 工具 Android逆向助手 反编译dex文件
在Android Killer V1.3.1.0中打开这个路径,将反编译dex文件后生成的两个文件android和com复制到smali目录下
在清单文件中删除android:name属性,并保存
最后编译、安装、运行
能运行,我们脱壳并修复成功了
相关文章推荐
- Android 支付宝API使用流程
- 如何实现 Android 应用的持续部署?
- 安卓刮刮乐效果demo
- Android Classloader热修复技术之百家齐放
- Android-Universal-Image-Loader
- Android--多媒体
- 绝对精品—史上最全最权威的Android Studio插件整理
- Android进程间通讯——多进程共用SharedPreferences
- Android进程间通讯——多进程共用SharedPreferences
- AndroidStudio设置三步走
- 如何实现 Android 应用的持续部署?
- Android权限之sharedUserId和签名 .
- Android 自定义View-怎么绘制居中文本?
- Android-sharedUserId数据权限
- Android复习二——第一个Android应用
- Android EditText的设置
- 复习Android,Activity的启动模式——个人总结归纳
- 使用AndFix实现Android热修复
- Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板
- Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板