我们知道,在Android的最初的几个版本,Android的app 运行在Dalvik中,完全是解释性执行.在Android2.2中,Google把JVM中常用...
文章目录 一、禁用 dex2oat 简介 二、TurboDex 中禁用 dex2oat 参考示例 一、禁用 dex2oat 简介 ---- 在上一篇博客 【Android 逆向】ART 函数抽取加壳 (...ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 ) 分析了 dex2oat 机制 的运行过程 , 即将 Dex 字节码文件 转为 Oat 字节码文件 , 其目的是为了 提高运行效率...禁用 dex2oat , 在 【Android 逆向】ART 函数抽取加壳 ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 ) 二、禁用 dex2oat 机制源码分析 章节...Hook 【Android 逆向】ART 函数抽取加壳 ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 ) 博客中介绍的过程 , 实现了 禁用 dex2oat 的功能 ; 其中文介绍如下...函数实现的 , 与 【Android 逆向】ART 函数抽取加壳 ① ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 ) 二、禁用 dex2oat 机制源码分析 4、exec_utils.cc
我们知道当在Android的设备上安装第三方应用的时候,系统会自动把java的bitcode编译为nativecode.这样当我们运行App时, 系统直接运行n...
文章目录 前言 一、搜索 dex2oat 源码 二、dex2oat.cc#main 主函数源码 前言 在 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc...中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 ) 博客中 , 将 dex 文件编译为 oat 文件 , 编译过程是由 dex2oat 可执行程序完成的 , 这是一个有...main 函数的可执行程序 ; 一、搜索 dex2oat 源码 ---- 进入源码搜索页面 http://aospxref.com/android-8.0.0_r36/ , " Project " 中...源码路径是 /art/dex2oat/dex2oat.cc ; 二、dex2oat.cc#main 主函数源码 ---- dex2oat.cc#main 主函数中 , 调用了 art::Dex2oat...注:Dex2Oat类 // 在这种情况下,不应破坏运行时。 if (!
文章目录 前言 一、/art/dex2oat/dex2oat.cc#Dex2oat 函数源码 二、/art/dex2oat/dex2oat.cc#Setup 函数源码 ( 脱壳点 ) 前言 在上一篇博客...【Android 逆向】ART 脱壳 ( dex2oat 脱壳 | aosp 中搜索 dex2oat 源码 | dex2oat.cc#main 主函数源码 ) 中 , 分析到 dex2oat 工具源码中的主函数为.../art/dex2oat/dex2oat.cc#main , 在该函数中调用了 /art/dex2oat/dex2oat.cc#Dex2oat 函数 ; 在将 dex 文件编译为 oat 文件的过程中..., 也有脱壳点 ; /art/dex2oat/dex2oat.cc#Dex2oat 函数源码 : static dex2oat::ReturnCode Dex2oat(int argc, char**...std::unique_ptr dex2oat = MakeUnique(&timings); // 解析参数。
() 最后进入了Dex2Oat,这就进入了Dex2Oat的编译流程 反之如果我们在下面Dex2Oat的流程中通过Hook相关方法或execv或execve导致dex2oat失败,我们就会返回到OpenDexFilesFromOat...编译流程 Dex2oat是google公司为了提高编译效率的一种机制,从Android8.0开始实施,一些加壳厂商实现抽取壳往往会禁用Dex2oat,而针对整体加壳没有禁用的Dex2Oat也成为了脱壳点...,而如果我们不禁用dex2oat,execve函数是用来调用dex2oat的二进制程序实现对dex文件的加载,我们这时候找到dex2oat.cc这个文件,找到main函数 /art/dex2oat/dex2oat.cc...Dex2Oat /art/dex2oat/dex2oat.cc static dex2oat::ReturnCode Dex2oat(int argc, char** argv) { *****...********************************* dex2oat::ReturnCode setup_code = dex2oat->Setup(); dex2oat::
文章目录 一、禁用 dex2oat 操作 HOOK 点介绍 二、集成 InLineHook 在 【Android 逆向】ART 函数抽取加壳 ① ( ART 下的函数抽取恢复时机 | 禁用 dex2oat...机制源码分析 ) 【Android 逆向】ART 函数抽取加壳 ② ( 禁用 dex2oat 简介 | TurboDex 中禁用 dex2oat 参考示例 ) 两篇博客中 , 简单介绍了 禁用 dex2oat...机制 的原理 , 下面开始 实现 dex2oat 禁用功能 ; 一、禁用 dex2oat 操作 HOOK 点介绍 ---- dex2oat 机制 的实现流程中 , 其中需要调用 exec_utils.cc...exec_utils.cc#ExecAndReturnCode ; 二、集成 InLineHook ---- 在上个章节介绍的 exec_utils.cc 源码 编译后的二进制代码被封装到了 libc 库 中 ; 禁用 dex2oat
execve 函数分析 二、使用自定义的 myexecve 函数替换 libc.so#execve 函数 在 【Android 逆向】ART 函数抽取加壳 ① ( ART 下的函数抽取恢复时机 | 禁用 dex2oat...机制源码分析 ) 【Android 逆向】ART 函数抽取加壳 ② ( 禁用 dex2oat 简介 | TurboDex 中禁用 dex2oat 参考示例 ) 两篇博客中 , 简单介绍了 禁用 dex2oat...机制 的原理 , 下面开始 实现 dex2oat 禁用功能 ; 在 【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat 操作 HOOK 点介绍 | 集成 InLineHook...字节码文件 , 这里将需要拦截的字节码都放在 dex2oat 目录中 , 检测到 dex2oat 目录 , 就退出 ; 不需要拦截的 , 直接调用原函数执行 ; 源码示例 : // 用于接收 Android...目录中 if (strstr(__file, "dex2oat")) { return 0; } else { // 不需要拦截的 , 直接调用原函数执行
机制 : 如果 禁用 dex2oat 的编译过程 , 则 恢复 被抽取的 函数指令 , 不在受 该条件限制 , 不是必须在 dex2oat 之前恢复 , 可以稍晚一些再恢复函数指令 ; 如果选择第一种方案..., 在 dex2oat 之前进行恢复 , 这没有任何意义 , dex2oat 编译后 , 生成的 oat 文件是完整的 , 此时 可以 完整的将 oat 文件 dump 到 SD 卡中 , 基本等于没有加固..., 还是一个一代壳 ; 因此 , 大部分加固厂商 , 选择 禁用 dex2oat 机制 ; 这样处于安全考虑 , 牺牲了应用的运行效率 ; 二、禁用 dex2oat 机制源码分析 ---- 在之前的博客章节...// TODO:为什么dex2oat会这样做?...Dex2Oat(args, error_msg)) { // 手动删除oat和vdex文件。这样可以确保没有垃圾 // 如果进程意外死亡,则剩余。
在ROM OTA或者恢复出场设置后 , 会要进行dex2oat根据当前ROM进行重新编译生成.oat文件....优点 : 运行时省电 , 运行速度快 缺点 : 由于安装APK时触发dex2oat , 需要编译成native code , 导致安装时间过长 由于dex2oat生成的文件较大 , 会占用较多的空间...目的是为了避免不必要的验证Dex文件合法性的过程,例如首次安装时进行dex2oat时会校验Dex 文件各个section的合法性,这时候使用的compiler filter 为了照顾安装速度等方面,并没有采用全量编译...,当app启动后,运行一段时间后,收集了足够多的jit 热点方法信息,Android会在后台重新进行dex2oat, 将热点方法编译成机器代码,这时候就不用再重复做验证Dex文件的过程了 .odex...Compiler-fileter 在dex2oat的时候 , 会有一个目标编译类型 , 会有以下几类 , 根据时机不同dex2oat的编译方式也会不同 verify:只运行 DEX 代码验证。
文章目录 一、对 libc.so#execve 函数进行内联 HOOK 操作 在 【Android 逆向】ART 函数抽取加壳 ① ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析...) 【Android 逆向】ART 函数抽取加壳 ② ( 禁用 dex2oat 简介 | TurboDex 中禁用 dex2oat 参考示例 ) 两篇博客中 , 简单介绍了 禁用 dex2oat 机制...的原理 , 下面开始 实现 dex2oat 禁用功能 ; 在 【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat 操作 HOOK 点介绍 | 集成 InLineHook ) 博客中...函数 定义在 bionic/libc/include/unistd.h 中 , 在 exec_utils.cc 中进行调用 ; 使用 在 【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat
LoadClass 类加载操作 三、class_linker.cc#LoadClassMembers 类成员加载操作 在 【Android 逆向】ART 函数抽取加壳 ① ( ART 下的函数抽取恢复时机 | 禁用 dex2oat...机制源码分析 ) 【Android 逆向】ART 函数抽取加壳 ② ( 禁用 dex2oat 简介 | TurboDex 中禁用 dex2oat 参考示例 ) 两篇博客中 , 简单介绍了 禁用 dex2oat...机制 的原理 , 下面开始 实现 dex2oat 禁用功能 ; 在 【Android 逆向】ART 函数抽取加壳 ③ ( 禁用 dex2oat 操作 HOOK 点介绍 | 集成 InLineHook...下面还需要 在源码中找到一个时机点 , 还原 被抽取的函数 ; 函数抽取加壳 操作 , 打包到 APK 应用中的 Dex 字节码文件中函数是被抽取出来的 , 执行前必须将函数还原 , 第一步 关闭 dex2oat
3 dex2oat Android ART虚拟机后,可以将dex文件预先的翻译处理成机器码直接运行,在Android 5 - 7版本,dex处理是在app安装的时候处理的,但是由于dex2oat性能影响较大...,安装的时候将耗时过长,Android 7后改为安装的时候不做翻译,运行时还是解释执行,运行时的时候记录运行的函数等信息,在手机闲置的情况下去把这些热方法做dex2oat,下次运行直接运行机器码。...但是系统判断闲置的条件比较苛刻,导致大部分情况下app没有被dex2oat,另外互联网app快速发展,发版速度较快,所以dex2oat的利用率低,通过app自己手动调用系统dex2oat达到快速将app...系统记录热方法的数据文件存在 /data/misc/profiles/cur/0/packageName/primary.prof下,我们可以通过FileObserver监听这个这个文件修改判断是否需要dex2oat...dex2oat可以通过shell命令执行cmd package compile -m speed-profile -f packageName 4 Redex Linux 文件系统从磁盘读文件的时候,会以
The AOT compilation (dex2oat) daemon parses that file to drive its compilation....Android N的编译模式 在compiler_filter.h,我们可以看到dex2oat一共有12种编译模式: enum Filter { VerifyNone,...Profile-guided compilation JIT WORK FLOW dex2oat编译 首先我们来看系统在什么时候会对各个应用做JIT/AOT编译呢?...编译参数 对于[speed-profile]模式,dex2oat编译命令的核心参数如下: dex2oat --dex-file=....其流程:若dex2oat参数中有输入profile文件,会读取profile中的数据。
文章目录 dex2oat 触发场景 各种文件 .dex .odex .oat .vdex 类信息 mirror::Class ArtField ArtMethod 缓存 ClassTable DexCache...dex2oat 触发场景 https://cs.android.com/android/platform/superproject/+/master:art/dex2oat/dex2oat.cc dex2oat.../superproject/+/master:art/runtime/vdex_file.h VerifierDeps 用于快速校验 dex 里 method 合法性 8.0 增加,目的是减少 dex2oat...从 vdex 里提取 dex:https://github.com/anestisb/vdexExtractor dex2oat::Setup(): // No need to verify...::ReturnCode::kOther; } 如果之前做过 dex2oat,有 vdex 文件,下次执行 dex2oat 时(比如系统 OTA)就可以省去重新 verify dex 的过程
)) { case kNoDexOptNeeded: return kUpdateSucceeded; // TODO: 现在,不要为我们打电话的各种方式而烦恼 // dex2oat...= nullptr); Runtime* runtime = Runtime::Current(); // 判断 Dex2Oat 当前是否可用 , 如果不可用 , 直接返回 if (!...Dex2Oat(args, error_msg)) { // Manually delete the oat and vdex files....可执行二进制程序的相关参数 , 最终调用了 Exec(argv, error_msg) 函数 , 完成 Dex2Oat 执行的过程 ; oat_file_assistant.cc#Dex2Oat 函数源码...: bool OatFileAssistant::Dex2Oat(const std::vector& args,
第三代壳dex2oat法定制系统dex2oat法 ART模式下,dex2oat生成oat时,内存中的DEX是完整的 http://bbs.pediy.com/showthread.php?
原理 在APK安装的时候,PackageManagerService会调用dex2oat通过静态编译的方式,来将所有的dex文件(包括Multidex)编译oat文件。...罗老师的图 优点与缺点 优点 运行时会超级快 在运行时省电,也节省各种资源 缺点 在系统更新的时候,所有app都需要进行dex2oat的操作,耗费的时间太长 在app安装的过程中,所耗费的时间也越来越长...编译以及优化来提升经常使用的这些功能 避免为了一些不常用的代码而付出资源(编译、存储等等) 混编模式的实现 在JIT的过程中,生成Offline的Profile Offline Profile的文件格式 使用AOT增强过后的编译器(dex2oat...64位的So,并且对于加壳的So会出现一些问题 参考资料 Understanding JIT Compilation and Optimizations Android profile-guided dex2oat
dex2oat 触发场景 dex2oat 的作用:对 dex 文件进行编译,根据参数,生成 oat vdex art 文件。...text_Q1NETiBAQjF1ZVNvY2tz,size_20,color_FFFFFF,t_70,g_se,x_16] VerifierDeps 用于快速校验 dex 里 method 合法性 8.0 增加,目的是减少 dex2oat...watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQjF1ZVNvY2tz,size_20,color_FFFFFF,t_70,g_se,x_16] dex2oat...copy_dex_files_, &opened_dex_files_map, &opened_dex_files)) { return dex2oat...::ReturnCode::kOther; } 如果之前做过 dex2oat,有 vdex 文件,下次执行 dex2oat 时(比如系统 OTA)就可以省去重新 verify dex 的过程
apk安装时候,PMS会通过installd唤起dex2oat进程对apk进行优化。...dex2oat根据系统prop中的配置决定进行何种程度的优化,在AOSP N上,默认配置如下: ?...因为我们是动态加载了dex,这个dex只有在classloader加载dex时才会被发现,dex2oat编译时只知道apk自身中的class的存在。...dex2oat进行interpret-only优化时,编译依赖是原先的method,导致生成的vtable索引为原先Test类中的方法索引。
领取专属 10元无门槛券
手把手带您无忧上云