反编译百度钱包app心得

获取百度钱包app dex
1.apk中无原始dex,只有加载器,真正的dex在资源中加密
2.在启动过程中存在反java层和c层调试,检测调试器(包括android_server),运行后则无
3.考虑app启动时调用加载dex的api和每次搜索java类时解析DexFile的api ,编写cydia插件拦截dexFileParse得到4个文件dex,其中7M的为我们需要的dex,反编译失败;再次尝试dexFindClass获取内存dex,反编译失败
4.研究dex结构发现内存dex的头部被擦除,另外类实现的字节码指针由局部偏移修改成超大地址,可知字节码被另外分配空间,需要还原内存dex
5.遍历每个类结构,得到另外分配的地址范围,将这段数据dump出来,附加到原dex文件尾,修改偏移即可
6.反编译dex,最后得到50M的smali

dexFindClass

if __name__=='__main__':
    pDexFile=0x75741828
    pOptHeader=Dword(pDexFile+0)
    pHeader=Dword(pDexFile+4)
    pStringIds=Dword(pDexFile+8)
    pTypeIds=Dword(pDexFile+12)
    pFieldIds=Dword(pDexFile+16)
    pMethodIds=Dword(pDexFile+20)
    pProtoIds=Dword(pDexFile+24)
    pClassDefs=Dword(pDexFile+28)
    pLinkData=Dword(pDexFile+32)
    pClassLookup=Dword(pDexFile+36)
    DexBase=Dword(pDexFile+44)

    print "DexBase=%08x ClassDefBase=%08x classDefsSize=%d"%(DexBase,pClassDefs,classDefsSize)
    classDefsSize=Dword(pHeader+0x60)
    
    
    minaddr=0xffffffff
    maxaddr=0
    for i in range(0,classDefsSize):
        off=pClassDefs+32*i
        classIdx=Dword(off)
        classDataOff=(Dword(off+24)+DexBase)&0xFFFFFFFF;
        if(classDataOff!=0x75f40028):
            if(classDataOff < minaddr):
                minaddr=classDataOff
            if(classDataOff > maxaddr):
                maxaddr=classDataOff
        print "%08x"%classDataOff
        #datastr=""
        #for j in range(0,16):
        #    datastr += "%02x"%(Byte(classDataOff+j))
        #print "classIdx=%04d,classDataOff=%08x,sig:%s"%(classIdx,classDataOff,datastr)
    print "min=%08x,max=%08x"%(minaddr,maxaddr)

你可能感兴趣的:(反编译百度钱包app心得)