在理解android的类加载后,我们可以愉快对apk来脱壳了。脱壳重要的是断点:

  断点:在哪个位置脱壳,这里着重指的是在哪个方法

  先介绍断点,我们只要知道加壳是用哪个方法来加载dex的,hook这个方法就可以追踪到dex了。这个方法就是我们要的断点!

  dvmDexFileOpenPartial:——int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)

    apk为dex文件,android在执行前会先将dex转化为odex文件,由函数dvmContinueOptimization(/dalvik/vm/analysis/DexPrepare.cpp)执行。在dvmContinueOptimization中先调用mmap(这也是一个断点)将原Dex文件整体映射到内存;然后调用dvmDexFileOpenPartial去尝试生成DexFile(既然会生成DexFile,当然会调用dexFileParse函数)。以上步骤在dex转odex时才会执行,若加固的apk本来就是odex,则此断点失效。

  dexFileParse:——DexFile* dexFileParse(const u1* data, size_t length, int flags)

    odex会生成dex的内存描述DexFile(dalvik浅析三:类加载),此函数的前2个参数与dvmDexFileOpenPartial相同(自行查看源码)。没什么好说的了,记住在生成DexFile时调用。看雪上已经将提取dex代码集成到libdvm中了:【原创】让开下,让我脱下壳

  上面提及的是在dex加载过程(优化,解析)中,我们可以下断的函数(当然其他还有很多,不一一举例)。但这个有缺点是需要动态调试时才能dump出dex,这需要我们过加固apk的反调试,有点繁琐。新方法是修改libdvm代码去自动脱壳,参考上面看雪中的做法,下面还会详细解析。以下是dump dex的ida script command:

static main(void)
{
auto fp, begin, end, dexbyte;
fp = fopen("C:\\dump.dex", "wb");
begin = r0;
end = r0 + r1;
for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
fputc(Byte(dexbyte), fp);
}

  下面来看看dex运行过程中可以下断点函数(native):——/dalvik/vm/native/dalvik_system_DexFile.cpp基于源码4.4

const DalvikNativeMethod dvm_dalvik_system_DexFile[] = {
520 { "openDexFileNative", "(Ljava/lang/String;Ljava/lang/String;I)I",
521 Dalvik_dalvik_system_DexFile_openDexFileNative },
522 { "openDexFile", "([B)I",
523 Dalvik_dalvik_system_DexFile_openDexFile_bytearray },
524 { "closeDexFile", "(I)V",
525 Dalvik_dalvik_system_DexFile_closeDexFile },
526 { "defineClassNative", "(Ljava/lang/String;Ljava/lang/ClassLoader;I)Ljava/lang/Class;",
527 Dalvik_dalvik_system_DexFile_defineClassNative },
528 { "getClassNameList", "(I)[Ljava/lang/String;",
529 Dalvik_dalvik_system_DexFile_getClassNameList },
530 { "isDexOptNeeded", "(Ljava/lang/String;)Z",
531 Dalvik_dalvik_system_DexFile_isDexOptNeeded },
532 { NULL, NULL, NULL },
533};

  上面的几个函数在加载dex或运行dex会执行,Dalvik_dalvik_system_DexFile_openDexFile_bytearray对于加壳的来说很熟悉吧(看我加壳中提到的文章)。这几个函数已经不能像先前一样直接到dex的addr和len来dump了。但你可以从中得到DexFile,然后在组合出dex文件。在这里你需要了解以下结构体:

  DexFile、DvmDex、DexOrJar;

/*
521 * The set of DEX files loaded by custom class loaders.
522 */
523 HashTable* userDexFiles;      //dvmHashTableRemove(gDvm.userDexFiles, hash, pDexOrJar)

  知道userDexFiles的作用,它管理着用户加载的DexFile。

  ok,有了上面的知识我们可以写代码来脱壳,你可以用xposed来函数,也可以修改源码直接dump。

  

  修改源码脱壳:

  用上面看雪上的代码来解释,它修改了dexFileParse源码,在其中直接添加脱壳代码(具体的脱壳代码执行请看源码)。代码写好了,如何编译呢(编译libdvm.so: makefile,mm)。当然事情到这里还没有结束,若修改了内存的dex结构体,那我们dump出来东西也无法执行。这时候需要我先进行修复,看参考资料3、4。dannerWorking这方面还没去研究待续。

参考资料:

  1 安卓动态调试七种武器之孔雀翎 – Ida Pro

  2 【原创】让开下,让我脱下壳

   3  从Android运行时出发,打造我们的脱壳神器

4  Android应用程序通用自动脱壳方法研究

      

apk 脱壳的更多相关文章

  1. DexHunter在ART虚拟机模式下的脱壳原理分析

    本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...

  2. Dalvik模式下基于Android运行时类加载的函数dexFindClass脱壳

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78003184 前段时间在看雪论坛发现了<发现一个安卓万能脱壳方法>这篇 ...

  3. Android crash特殊位置定位

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 通常情况下,在我们开发的过程中遇到的crash,可以到logcat中找原因:如果做定制App,对方用 ...

  4. Java中的Html解析:使用jsoup

    包:jsoup-1.10.2.jar import java.io.File; import java.io.IOException; import org.jsoup.Jsoup; import o ...

  5. Android 开发日常积累

    Android 集合 Android 开源项目分类汇总 扔物线的 HenCoder 高级 Android 教程 hencoder HenCoder:给高级 Android 工程师的进阶手册 Andro ...

  6. 掘金 Android 文章精选合集

    掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...

  7. Android中实现Activity的启动拦截之----实现360卫士的安装应用界面

    第一.摘要 今天不是周末,但是我已经放假了,所以就开始我们的技术探索之旅,今天我们来讲一下Android中最期待的技术,就是拦截Activity的启动,其实我在去年的时候,就像实现这个技术了,但是因为 ...

  8. APK加固之静态脱壳机编写入门

    目录: 0x00APK加固简介与静态脱壳机的编写思路 1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆 ...

  9. 【逆向&渗透实战】Dump内存中的Dex_我是如何脱壳某公司加固过的Apk并利用其API渗透对方数据库

    /作者:Kali_MG1937 QQ:3496925334 CNBLOG博客号:ALDYS4/ 某天午睡,朦朦胧胧梦到给学校提供建站模板的公司有个注射点 梦醒后,我凭借着零散的记忆日进了对面的数据库, ...

随机推荐

  1. cve-2018-2893 weblogic -WLS核心组件反序列化

    漏洞分析 https://www.freebuf.com/column/178103.html https://www.freebuf.com/vuls/177868.html 攻击者可以在未授权的情 ...

  2. 漫漫Java路1—基础知识2—注释和命名规则

    ## 注释 1. 单行注释 ```java //这是一个注释 ``` 2. 多行注释 ```java /* 这是一个注释 */ ``` 3. 文档注释 ```java /** * * * */ ``` ...

  3. Java基础:常用基础dos命令

    打开cmd的方式1.开始+系统+命令提示符2.win键+R 输入cmd 打开控制台3.在任意的文件夹下,按住shift键+鼠标右键点击,在此处打开命令提示行4.在资源管理器的地址栏前面加上cmd路径 ...

  4. C语言知识汇总,史上最全面总结,没有之一

    C语言基础 C语言学习路线 C语言入门笔记 初识C语言 简单的C程序示例 我们编写的C代码是怎样跑起来的? 简单示例,VS2019调试C语言程序 C语言基础-数据类型 深入理解变量,变量的声明,定义, ...

  5. beego框架panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroller问题解决

    在使用beego框架时,出现类似于panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroll ...

  6. 有意思!强大的 SVG 滤镜

    想写一篇关于 SVG 滤镜的文章已久,SVG 滤镜的存在,让本来就非常强大的 CSS 如虎添翼.让仅仅使用 CSS/HTML/SVG 创作的效果更上一层楼.题图为袁川老师使用 SVG 滤镜实现的云彩效 ...

  7. 14、运行Django时浏览器中遇到Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny'

    问题:Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny' 解决办法: 只需要在 Djagno ...

  8. InfluxDB、Grafana等开源软件的监控后门

    在使用手机APP的过程中,用户信息会不知不觉的被APP悄无声息的收集到云端,然后进行各种用户行为分析以及智能推荐,这是众所周知但秘而不宣的事. 在使用开源软件时,也存在悄悄收集用户使用信息,并且上报到 ...

  9. shell分支与循环结构

    1. 条件选择 1.1 条件判断分支介绍 格式 if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMM ...

  10. 死磕Spring之AOP篇 - Spring AOP自动代理(二)筛选合适的通知器

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...