【胖虎的逆向之路】03 |
您所在的位置:网站首页 › 安卓10脱壳工具 › 【胖虎的逆向之路】03 |
【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解
【胖虎的逆向之路】01——动态加载和类加载机制详解 【胖虎的逆向之路】02——Android整体加壳原理详解&实现 文章目录 【胖虎的逆向之路】03——Android脱壳办法罗列&脱壳原理详解前言一、主流脱壳方法1.工具脱壳法1) Frida-DexDump2) Fart3) Youpk4) 常用脱壳工具对比 2.Hook脱壳法3.插桩脱壳法4.插桩脱壳法5.动态调试脱壳法6.特殊API调试法 二、实验总结三、参考文献 前言在上文中,我们讲解了关于Android整体加壳的原理和实际操作,现在我们来针对目前主流的脱壳工具以及流程进行讲解,由于作者能力有限,会尽力的详细描述 整体壳脱壳 的流程及原理,如本文中有任何错误,烦请指正,感谢~ 一、主流脱壳方法 1.工具脱壳法工具脱壳是指的利用现有的工具进行脱壳,很多的大佬已经开发了很多实用的工具,我们可以直接搞来使用(嘻嘻嘻)~ 1) Frida-DexDump得益于Frida, 在电脑上面进行内存搜索、转储的时候都变得十分方便,不再去通过繁琐的Xposed代码来获取Dex中对应的类与方法,仅需要关注如何去搜索想要的函数即可,对于完整的 dex,采用暴力搜索 dex035 即可找到。而对于抹头的 dex,通过匹配一些特征来找~ 支持模糊搜索断头dex(深度搜索模式)。兼容所有安卓版本(支持frida)。一键安装,无需修改系统,易于部署和使用项目地址: https://github.com/hluwa/FRIDA-DEXDump 使用方法也变得简单很多,在这里借助一个大佬的使用流程图,可以快速进行脱壳 我们简单演示一下,这里结合objection一起使用 然后再次打开脱下来的dex,即可~ ps:获取到dex后,推荐使用Jadx进行反编译,dex2jar有点过时了… 另外附上深度介绍: 深入 FRIDA-DEXDump 中的矛与盾 2) FartFart 的制作过程略显繁琐,主要是FART的代码是通过修改少量Android源码文件而成的,经过修改的Android源码编译成系统镜像,刷入手机,这样的手机启动后,针对Apk可以进行脱壳~ 基于此,我更愿意称之为是脱壳鸡,因为是把经过修改的Android源码编译成了系统镜像,刷入了手机~ 官方介绍: ART环境下基于主动调用的自动化脱壳方案,基于Android 6.0实现,理论上可以移植到任何系统上~ 项目地址:https://github.com/hanbinglengyue/FART 具体的实现原理和步骤在看雪: 拨云见日:安卓APP脱壳的本质以及如何快速发现ART下的脱壳点FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法FART:ART环境下基于主动调用的自动化脱壳方案脱壳流程: 1、安装待脱壳apk,并到设置中授予sd卡读写权限(否则dump下的文件无法写入到sdcard) 2、点击app图标,开始进入fart脱壳过程 接下来可以对logcat中的tag为ActivityThread的log进行过滤,等待待脱壳app进程出现"fart run over",此时fart主动调用过程结束。脱壳下来的 dex文件和函数体bin文件均在/sdcard/fart/app包名的目录下~ 下面截图为fart的运行流程和脱壳结果 官方Ps:添加frida版的fart的两种不同实现,各有特色。可以实现具体到对某一个类下的所有函数甚至是对某一个函数的CodeItem的dump。需要的可以去体验下其强大的脱壳能力。(注意,测试环境为pixel Android8.0,frida-server 12.8.0) 3) YoupkYoupk基于ART的主动调用的脱壳机,主要针对dex整体加固和各式各样的dex抽取加固,但是目前 Youpk 只支持 pixel 1代。所以必须需要 pixel 1代手机,而且需要刷入对应的系统~ 基本流程如下: 从内存中dump DEX构造完整调用链, 主动调用所有方法并dump CodeItem合并 DEX, CodeItem项目地址:https://github.com/youlor/unpacker 在该地址中,有较多的流程及方法、注意问题等,有需要的可以去看一哈 4) 常用脱壳工具对比 2.Hook脱壳法我们上面有写到,只要函数中包含DexFile对象,其实就可以通过Hook拿到该对象,然后取到begin和size,从而进行脱壳,目前使用较多的Hook框架是Xposed和frida两种,感觉Frida使用人数较多也方便,在这里用frida进行演示~ 首先使用GDA识别加壳程序~ 看起来很明显是进行了整体加壳,有没其他加壳暂时不知道,我们先进行脱壳处理 首先找到脱壳点~ 通过IDA打开libart.so,搜索DexFile,我们可以找到海量的脱壳点 然后我们编写hook脚本 这里之所以获取begin加上一个指针,是因为我们前面讲了dexfile含有一个虚函数地址,所以加上一个指针偏移 然后在手机中启动frida_server 附加进程进行dump,这里我们存在sdcard下面,所以需要提前赋予读写文件权限 从图中可以看得出来,到这里就已经脱壳成功~ 然后使用jadx打开对应的dex,进行查看 此时说明我们整体脱壳成功,不过应用看起来还有抽取壳,抽取壳后续会单开一篇文章进行记录~ 3.插桩脱壳法插桩脱壳法,就是在Android源码里面定位到相应的脱壳点,然后插入相应的代码,重新编译源码生成系统镜像,最后就可以使用定制的系统进行脱壳~ 其原理感觉跟youpk比较像,如何编译源码不再进行赘述,有需要的小伙伴可以看下这篇文章~ 源码编译(1)——Android6.0源码编译详解 那么还是借助大佬已经完成的图片进行讲解,同理、还是定位脱壳点,我们还是随便定位一个脱壳点LoadMethod 然后进行插桩 //add char dexfilepath[100]=0; memset(dexfilepath,0,100); sprintf(dexfilepath,"%d_%zu_LoadMethod.dex",getpid(),dex_file.Size()); int dexfd = open(dexfilepathm,O_CREAT|O_RDWR,666); if(dexfd>0){ int result = write(dexfd,dex_file.Begin(),dex_file.Size()); if(result>0){ close(dexfd); LOG(WARNING) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |