Android Hook框架总结

2018-12-12  本文已影响0人  超哥__

老帖子了,放这以免丢了

Android Hook框架总结

Java正常方式调用逻辑:

Java反射方式调用逻辑:

Constructor getDeclaredConstructor = clazz. getDeclaredConstructor()
Method m = clazz.getDeclaredMethod()
m.Invoke() =>
Constructor. newInstance =>
Dalvik_java_lang_reflect_Constructor_constructNative =>
dvmInvokeMethod =>
method->nativeFunc/dvmInterpret insns
Method.invoke =>
Method.invokeNative =>
Dalvik_java_lang_reflect_Method_invokeNative =>
dvmInvokeMethod =>
method->nativeFunc/dvmInterpret
nativeFunc => dvmResolveNativeMethod
dfunc = dvmLookupInternalNativeMethod
dfunc()
GOTO_TARGET(invokeMethod, bool methodCallRange, const Method* _methodToCall, u2 count, u2 regs)

Android Hook方式:

Hook类型

Xposed文件结构

问题1:何时加载framework.jar?

ActivityThread.class => const-class ActivityThread => OP_CONST_CLASS.cpp
dvmResolveClass 
    dvmFindClassNoInit
        findClassFromLoaderNoInit
            dvmCallMethod(loadClass)
        dvmFindSystemClassNoInit
            findClassNoInit
            searchBootPathForClass

问题2:为何IXposedHookZygoteInit可以hook framework/system api

XposedBridge.main
    initForZygote
         findAndHookMethod 加载系统jar
    loadModules
        loadModule        
            moduleInstance.initZygote()
            hookLoadPackage(moduleInstance)

问题3:为何IXposedHookLoadPackage可以hook app自身函数

首次加载:

android.app.ActivityThread.bindApplication
handleBindApplication
    ActivityStack.realStartActivityLocked
        scheduleLaunchActivity
            getPackageInfoNoCheck
getPackageInfoNoCheck
    LoadedApk()构造
        LoadedApk.getClassLoader
            ApplicationLoaders.getDefault().getClassLoader(zip,libpath,null)

问题4:何时加载xposedbridge?

Xposed app_main->main():
    xposed::initialize()        ->  env中加入xposedbridge.jar
    runtime.start(“de.robv.android.xposed.XposedBridge”) -> AndroidRuntime
         startVm()
         onVmCreated()
             xposed:nVmCreated        加载xposedbridge.jar
         startReg()
         XposedBridge.main()

问题5:底层实现hook?

  强制吧函数设置为native,并修改native函数使其返调java函数,实现于libxposed_dalvik.cpp

hookInfo->reflectedMethod = dvmDecodeIndirectRef(dvmThreadSelf(), env->NewGlobalRef(reflectedMethodIndirect));
hookInfo->additionalInfo = dvmDecodeIndirectRef(dvmThreadSelf(), env->NewGlobalRef(additionalInfoIndirect));
SET_METHOD_FLAG(method, ACC_NATIVE);//设置Method->AccessFlag强制为native函数
method->nativeFunc = &hookedMethodCallback;//修改默认回调dvmResolveNativeMethod为自定义函数,该函数原先从系统函数和so中的jni函数中寻找java对应的c层方法,hookedMethodCallback函数则调用dvmCallMethod执行java层方法
method->insns = (const u2*) hookInfo;//该域原用于非native模式下保存dex字节码用于解释执行,现用于存储Method指针
method->registersSize = method->insSize;
method->outsSize = 0;

Xposed Hook框架特点

Cydia Substrate Hook框架特点

文件:

substrate.h             //c++ header file used in JNI layer hook 
substrate-api.jar       //import package used in java layer hook
substrate-bless.jar     //used to remove properties(private,protect,etc...) in java layer hook
com.saurik.substrate.apk//host apk, we can only develop plugin for it to install package
\lib\armeabi  \lib\x86  //real operation for hooking
libAndroidBootstrap0.so //used to fake /system/lib/liblog.so and pull up libAndroidLoader.so    
libAndroidLoader.so     //used to pull all *.cy.so
        //MSLoadExtensions
libAndroidCydia.cy.so   //still in research
libDalvikLoader.cy.so   //still in research
libsubstrate.so         //provide jni layer hook low-level api
        //MSFindSymbol MSGetImageByName MSCloseFunction MSDebug MSHookFunction
libsubstrate-dvm.so     //provide java layer hook low-level api
        //MSDecodeIndirectReference MSJavaHookClassLoad MSJavaHookBridge MSJavaHookMethod 
        // MSJavaCreateObjectKey MSJavaReleaseObjectKey MSJavaGetObjectKey MSJavaSetObjectKey MSJavaBlessClassLoader
libSubstrateJNI.so      //used by substrate.apk to do c++ layer work
        //getppid readlink grep unlink symlink mkdir kill chown chmod
libSubstrateRun.so      //used by substrate.apk to do patch/unpatch/link/unlink operation
        //patch unpatch link unlink nm rpl
update-binary.so        //used by substrate.apk to recover patch/link operation

Hook框架对比

substrate框架 xposed框架 dexposed框架
dalvik/art虚拟机支持 dalvik dalvik/art dalvik/art
android版本支持 2.x 3.x 4.x 2.x 3.x 4.x 5.x 6.x 2.x 3.x 4.x 5.x 6.x
hook能力 java/c api java api java/c api(自身模块)
修改文件 app_process liblog.so 自身文件
hook时机 app_process启动时 app_process启动前加载so的时刻 未知
hook方式 修改method结构体 重新映射java层对应的jni函数 修改method结构体
c层hook类型 inline 未知
是否需要root
使用形式 宿主+插件 宿主+插件 未知
风险 app_process随每个版本变化 加载so较多 未知
ABI x86/arm x86/arm 未知
操作系统 ios/android android
上一篇 下一篇

猜你喜欢

热点阅读