美文网首页
短汇编指令inline hook

短汇编指令inline hook

作者: 珍惜Any | 来源:发表于2020-07-21 17:51 被阅读0次

目标函数:
安卓9.0 __system_property_get

因为inline hook原理是通过修改目标方法的汇编指令的开始处的几个字节的代码(Substrate中为12个字节),用一段跳转指令来完成目标方法的hook替换,因此inline hook的最大缺点为需要目标方法足够大,否则会导致替换跳板指令后后续指令紊乱。

为了验证这个猜想,从手机中将/system/lib/libc.so中pull了下来并拖到了IDA中打开,查找__system_property_ge方法的汇编指令,发现果然小于12字节,同时与安卓8.0中的libc.so中进行对比,确实是安卓9.0进行了优化导致的。

既然该方法短到了substrate无法进行 inline hook,那么此时的解决方案其实有两种,一个是采用方法入口替换的PLT表 Hook(爱奇艺的XHook),另一个则是采用所需长度更小的SandInstHook。

SandInstHook本质上仍然是inline hook,但是所需的字节更短,仅需4字节。使用方法如下:

#include "sandhook_native.h"

void* SandSingleInstHook(void* origin, void* replace);

void* SandSingleInstHookSym(const char* so, const char* symb, void* replace);

源码在native-hook的lib下,由于与容器在两个模块即两个so中,因此若要使用SandInstHook的源代码,需要对容器的CMakeLists.txt进行一定的改造。

先编译native-hook得到不同abi架构下的so文件
容器CMakeLists.txt中设置根据不同abi架构引入不同native-hook的so文件
容器CMakeLists.txt引入Sandhook_native头文件
容器CMakeLists.txt关联native-hook的so文件
引入SandInstHook之后,下一步便是开始Hook,SandInstHook的API与Substrate稍有不一致,因此需要一定转化,SandInstHook仅需要目标Hook方法的地址,以及替换的新方法地址,对于原方法的backup则通过返回值得到,开始不清楚参数 和 返回值的含义甚至导致误以为遇到了SandInstHook对32位arm不支持的thumb指令。

小Tips:C++函数指针的强转
由于需要在hook后替换的方法中调用原方法,因此
1.先声明了原方法的函数指针
2.然后将hook完成之后得到的原方法的backup地址赋值给先前声明 的函数指针
3.由于C++不允许将char强转为void,所以 这里可以使用reinterpret_cast进行强转。
4.完整代码:

int (*origin_system_property_get)(const char *name, char *value);

int new_system_property_get(const char *name, char *value) {
    int len = origin_system_property_get(name, value);
    string sname = string(name);
    if (fakeProperties.find(sname) == fakeProperties.end()) {
        return len;
    }
    // 替换value时长度最多不会超过原value长度
    string fake_value = fakeProperties[sname];
    if (strlen(value) > 0) {
        memcpy(value, (char *) fake_value.c_str(), strlen(value));
    }
    ALOGI("hook native system_property_get, key:%s,fake value:%s,length:%d", name, value, len);
    return len;
}

void FingerPrintFaker::hook_system_property_get(map<string, string> fakeProps) {
    fakeProperties = fakeProps;
    void *handle = fake_dlopen("libc.so", RTLD_NOW);
    void *symbol = fake_dlsym(handle, "__system_property_get");
    // 安卓9.0该函数汇编代码长度过短不满足12字节导致substrate inline hook崩溃
    // 因此使用SandHook SingleInstHook,只需要4字节
    if (SDK_INT < 28) {
        MSHookFunction(symbol, (void *) &new_system_property_get,
                       (void **) &origin_system_property_get);
    } else {
        void *origin_back_up_method = SandSingleInstHook(symbol,
                                                         (void *) &new_system_property_get);
        ALOGI("sand single inst hook libc __system_property_get :%d",
              origin_back_up_method == nullptr);
        if (origin_back_up_method == nullptr) {
            ALOGE("sand single inst hook libc __system_property_get failed!!!");
        } else {
            origin_system_property_get = reinterpret_cast<int (*)(const char *,char *)>(origin_back_up_method);
        }
    }
    fake_dlclose(handle);
}

相关文章

  • 短汇编指令inline hook

    目标函数:安卓9.0 __system_property_get 因为inline hook原理是通过修改目标...

  • 为什么使用汇编可以 Hook objc_msgSend(上)-

    为什么使用汇编可以 Hook objc_msgSend(上)- 汇编基础为什么使用汇编可以 Hook objc_m...

  • 逆向笔记(三)-汇编指令

    汇编指令 针对汇编来说,汇编指令是必须了解的,而且汇编中汇编指令比较多,但是每一个汇编指令对应的机器码是固定不变的...

  • HOOK SSDT(inline hook)

    HOOK SSDT(inline hook)主要代码: 更多游戏逆向视频www.yxfzedu.com

  • hook原理小结

    常用的hook方式主要有导入表hook、导出表hook和inline hook三种。 一,导入表hook 首先需要...

  • 16位汇编简记

    汇编: 汇编即是机器指令助记符,机器指令让cpu工作。像是mov、jmp、jcxz等汇编指令都有对应的机器指令。有...

  • 学习汇编--写一个完整的汇编(一)

    汇编指令 汇编有两类指令组成汇编指令如move,add,sub等,有对应的机器指令,可以被编译为机器指令最终被CP...

  • 逆向学习 持续更新中

    什么是汇编 机器指令能被计算机直接识别 汇编指令需要通过编译器转为机器指令 汇编指令和机器指令的差别在于指令的表示...

  • <<汇编语言>>第1章笔记

    第一章 基础知识 汇编语言基本概念 汇编指令是机器指令便于记忆的书写格式,通过编译器把汇编指令对应到机器指令,汇编...

  • 汇编三

    完整的汇编指令:#### 汇编由两种指令组成1.汇编指令如mov、add、sub等有对应的机器指令,可以被编译为机...

网友评论

      本文标题:短汇编指令inline hook

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