美文网首页安卓逆向
安卓逆向第六篇-InlineHook(ele7版)

安卓逆向第六篇-InlineHook(ele7版)

作者: 萌木盖 | 来源:发表于2022-02-23 15:11 被阅读0次

    前言

    众所周知xposed只能hook java层。
    那就不能hook so吗?
    那就得搞xposed+
    可+的方案有点多,今天来试试ele7的InlineHook

    参考视频及项目及文献

    Android Inline Hook详解
    想看原理点这个↑
    (安卓逆向进阶视频)03_ART实现XpHookNaitive兼容安卓10
    想看视频点这个↑
    下面是参考的github项目:
    ele7的原项目
    ele7的dome项目
    珍惜的dome 这个主要解决的有个安卓版本不同注入方式不同的问题

    人话讲原理

    就是用C++写了个so文件,此处命名为Aso,原APP要调用的so此处命名为Bso,

    • 先用xposed hook住原APP加载Bso的流程,不让其加载
    • 然后读到Aso的路径,让原APP加载Aso,实现了替换
    • 然后Aso再去调用Bso,就可在指令前后想咋搞就咋搞了

    方案开始

    首先是hook的目标,我选择的是我自己的设备检测github项目

    \color{red}{本项目为64位 hook不到 文末有解决方案}
    不出意外我会更新。想要这个版本可以找历史提交记录 找到2022年2月23日提交的那版。
    deviceDetection 设备检测---检测鸡

    deviceDetection首页
    大概样子就长这样,然后箭头指向的值就是我要改的值,图中是已经改好的。本来就没调试应该是0 我给改成了339.

    然后是我的hook项目

    https://github.com/mengmugai/HookTracerPid

    讲解

    因为代码都在里面的自己看就行,这里大概说一下。

    生成so

    首先是CMakeLists.txt文件定义好,生成的so名字就会为libLVmp.so

    image.png

    版本区别

    因为android 9.0以上没有 doLoad 方法,使用nativeLoad方法了。所有要进行判断。

            int version = android.os.Build.VERSION.SDK_INT;
            Log.e("当前系统 版本号 " + version);
            //android 9.0没有 doLoad 方法
            if (version >= 28) {
                        hook Runtime.class 的 nativeLoad方法{  
                                  if (如果是我要hook的so文件则){
                                            加载我的`libLVmp.so`
                                    }
                        }
            else{
                        hook Runtime.class 的 doLoad方法{  
                                  if (如果是我要hook的so文件则){
                                            加载我的`libLVmp.so`
                                    }
                        }            
    
    
          }
    

    大概就是这样。真是代码可以到github里面去看。

    c++开发

    JNI目录结构
    主要是把inlinehook目录搞来,然后我们主要是写main.cpp
    首先加载走了JNI_OnLoad方法,然后调用into_TestSo
    image.png
    image.png
    然后就是我写的替换它的方法
    int My_Java_com_mmg_detection_utils_DebugUtils_getTracerPid(JNIEnv *env, jobject thiz) {
        int ret_value = Source_Java_com_mmg_detection_utils_DebugUtils_gettracerpid(env, thiz);
        LOG(ERROR) << "返回值为:";
    //    LOGE(ret_value)
        int my_ret_value=339;
        if (ret_value!=0){
            my_ret_value=0;
        }
    
        return my_ret_value;
    }
    

    手机就能看到改成339了。就是最开始那个图。
    还有就是上面那个getAppSo()方法也不是原有的 自己写的

    image.png

    总结及提醒:

    • 本文还是要与github项目一同看才好理解。
    • 这个只支持32位的hook。64位不可。
      • 包括我的设备检测的项目也是64位的。也不行。所以要强制安装32位app 命令如下:
      • adb install --abi armeabi-v7a -r app-debug.apk 编译好不运行 而是用这个命令安装
    • so hook 方案 还有很多
      • Cydia Substrate
      • xHook 这是爱奇艺开发的got表hook框架 原理又不一样了
      • Dobby
      • android-inline-hook 这个跟ele7的同名 但是是字节跳动开发的 而且支持64位。
      • SandHook

    相关文章

      网友评论

        本文标题:安卓逆向第六篇-InlineHook(ele7版)

        本文链接:https://www.haomeiwen.com/subject/pndolrtx.html