-
-
[原创]某加固详细分析总结,另附该加固脱壳机
-
发表于:
2019-7-25 17:09
17256
-
自己稍微了解一点加固,当然只是皮毛而已。前不久发了一篇脱壳的帖子(只能脱早期的壳,本身也只是发着玩玩)为了看看现在加固技术的演进和锻炼一下自己的逆向能力,遂选择了一个业界算知名度比较高的加固产品。
本人没有装逼之意,知道我大中华牛人数量之多可以多过我的遍身毛发,也仅是对自己的一个总结,文章必会有错误和疏漏之处,还请大佬们高抬贵手。我接受任何发自肺腑的建议。
本人目前时间还算充裕,但时间毕竟珍贵,遂我仅仅分析加固流程中dex如何解密,如何加载到内存中,后续关于dex的其他流程、以及保护app的相关流程我并没有分析。
我这里会用最简洁的文字稍作描述(具体详细流程,请到github上下载)。
加固特征:libdexHelper、classes0.jar
如何加固:classes0.jar是一个经过加密的zip压缩包,压缩包里面包含被拆分的dex(注意dex是完整的,没有进行dex code 抽取),dex的数量可能大于1,加密算法是rc4(稍有改变)+ 异或或者直接异或,选择加密方式是由加密算法第一个代表偏移的参数决定的。
如何加载:系统hook了libc很多函数(open、read、pread64、mmap等)和libart函数(OpenDexFilesFromOat、DexFileVerifier::Verify等),反射调用Helper类的install方法会触发系统调用OpenDexFilesFromOat函数,如果传入参数dex_location匹配.cache/classes.jar直接调用bool DexFile::Open(const char* filename, const char* location, std::string* error_msg,
std::vector<const DexFile*>* dex_files)加载dex。加载过程中会进入到hook后libc的函数
如mmap、read在这里进行解密解压,最终调用下面这个函数完成加载:
static const DexFile* DexFile::OpenMemory(const byte* base,
size_t size,
const std::string& location,
uint32_t location_checksum,
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-7-26 22:13
被angelToms编辑
,原因: