首页 > android > 破解教程 > android加固xx(一)
2016
07-02

android加固xx(一)

前言

目前基本上把dex文件隐藏的更深一点,(拿到dex更难一点),或者把dex文件中的偏移改改,再或者把某个段重写一次。运行的时候修复。在内存中拿不到完整的dex文件,(以上个人观点)

难度分析

首先个人认为免费版比较简单属于梆梆加固,他是比较简单的很久很久没更新了,在内存中dex文件还是一个整体,也就是说 如果你拿到了DvmDex那么你就拿到了整个dex文件,这一点类似目前版本的数字的和tx的,都是比较简单的,再次就是爱加密了,某加密dex文件是拆开的确是是拆开的,因为它的code_item中的insns和debug_info_off都是错误的,正确的信息应该被单独提取出来存放在单个文件中。

DexMethodDexMethodDexCodeDexCodedebugInfoOffdebugInfoOffinsns[1]insns[1]通过codeoff 拿到DexCodedebuginfo偏移被修改insns被清空

其次就是某里加固了,某里加固和某加密差不多庆幸的是在只要拿到DvmDex dump 2~3倍的dexfilesize即可。主要他的偏移早已经修复。

简单的修复(DVM)

dvm加载一个类时流程大概是Dalvik_dalvik_system_DexFile_defineClass()===>dvmDefineClass()===>findClassNoInit()===>dvmLookUpClass(),在这个函数里会去gDvm.loadedClasses这个HashTable去查找类,但没有找到然后null,然后返回findClassNoInit()函数中loadClassFromDex()找到目标类对应的ClassObject指针,然后dvmAddClassToHash将其加入到gDvm.loadedClasses中去。
下面是dexhunter的修复流程简单图示

dvmDefineClass()dvmDefineClass()dvmIsClassInitialized()dvmIsClassInitialized()dvmInitClass()dvmInitClass()后续部分后续部分判断类有没有装载完成类如果没装载完成,主动初始化如果装载完成执行脱壳装载完成执行脱壳

上面是dexhunter的脱壳代码类加载的流程:个人尝试移植代码实现hook修复:上面类加载部分至少要拿到两个函数的指针,于是找到了下面一个函数:hook时候拿到一个指针就可以解决上面所有的问题。

ClassObject* dvmFindClass(const char* descriptor, Object* loader)
{
    ClassObject* clazz;
    clazz = dvmFindClassNoInit(descriptor, loader);
    if (clazz != NULL && clazz->status < CLASS_INITIALIZED) {
        /* initialize class */
        if (!dvmInitClass(clazz)) {
            /* init failed; leave it in the list, marked as bad */
            assert(dvmCheckException(dvmThreadSelf()));
            assert(clazz->status == CLASS_ERROR);
            return NULL;
        }
    }
    return clazz;
}

拿到装载完成的class 就可以修复啦。。。
可以通过ClassObject->Method的结构拿到每一个Method结构,在通过Method->insns拿到修复后的核心代码。具体的可以参照dexhunter。
当然修复是个煎熬的过程,至少要求对dex文件格式有个熟悉的了解,大概过程可以参考dexhunter,后面有时间详细给出。
(如果有错误希望指出,谢谢)

最后编辑:
作者:xiaowu
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。