首页
社区
课程
招聘
[求助]Android Inline Hook问题
发表于: 2019-6-5 10:07 2854

[求助]Android Inline Hook问题

2019-6-5 10:07
2854
尝试使用@ele7enxxh大神的Inline Hook,注入后打印Hook没有出错,打印了Hook Sys_FileRead Success,但是就是没有走到我Hook的函数
我觉得Hook的应该是我要Hook那个so库的备份,cat /proc/pid/maps看到我要Hook的so被map了两次,主动调用一次被Hook的原函数,我的Hook函数也被执行了,但是原函数调用返回失败,因为相关变量没有初始化,实际在注入的进程中,这个接口调用时成功的
所以我确定了应该是dlopen重新打开了一份so库的备份,我Hook的是新打开的so库,并没有Hook到原先进程已经打开的so库(在我注入Hook前,所有so库都已经加载,并且要Hook的函数已被调用过)
我用Frida Hook过,是成功的,但是Frida需要PC端一起运行,不方便
请问有没有遇到相同问题的朋友,或者有大神看到能否帮忙解答下下面贴上我的部分代码
extern int Sys_FileRead(const char *name, char *buf, int len);

int (*Old_Sys_FileRead)(const char *name, char *buf, int len) = NULL;

int New_Sys_FileRead(const char *name, char *buf, int len)
{
    LOGD("New_Sys_FileRead Hook Into.\n");

    if(Old_Sys_FileRead == NULL){
        LOGD("Old_Sys_FileRead Is NULL.\n");
        return -1;
    }

    return Old_Sys_FileRead(name, buf, len);
}

int Hook_Sys_FileRead(void)
{
    if (registerInlineHook((uint32_t) Sys_FileRead, (uint32_t) New_Sys_FileRead, (uint32_t **) &Old_Sys_FileRead) != ELE7EN_OK) {
        LOGD("registerInlineHook Error.\n");
        return -1;
    }

    if (inlineHook((uint32_t) Sys_FileRead) != ELE7EN_OK) {
        LOGD("inlineHook Sys_FileRead Error.\n");
        return -1;
    }

    LOGD("Hook Sys_FileRead Success\n");

    return 0;  
}


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2019-6-5 10:14 被guoqiangck编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 963
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不知道为啥,尝试使用GOT表Hook、InlineHook、TKHooklib、ElfHook都没有成功,都是Hook的新打开库的备份
我改动源代码把原函数地址打出来,再我把注入的模块里面的原函数地址打出来,两者对不上,注入的函数模块拿到的OrginFunc的地址就是新dlopen打开的函数地址
应该要找到原始进程so库里面需要Hook函数的地址,传给Hook框架,所以这个问题和Hook框架没有关系,后面再研究下怎么拿到原始函数的地址

最后,找到一个iqiyi的xhook框架,传入需要Hook的函数名字符串,xhook查找ELF HASH 和 GNU HASH找到对应的地址,支持正则表达式全局查找,功能挺强大,使用这个框架Hook成功,源码地址 https://github.com/iqiyi/xHook,希望能对大家有所帮助
2019-6-5 16:25
0
雪    币: 963
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
贴下修改后的代码
int (*Old_Sys_FileRead)(const char *name, char *buf, int len) = NULL;
 
int New_Sys_FileRead(const char *name, char *buf, int len)
{
    LOGD("New_Sys_FileRead Hook Into.\n");
 
    if(Old_Sys_FileRead == NULL){
        LOGD("Old_Sys_FileRead Is NULL.\n");
        return -1;
    }
 
    return Old_Sys_FileRead(name, buf, len);
}
 
int xHook_Sys_FileRead(void)
{
    // 打开xhook DEBUG (默认关闭): 0:关闭DEBUG 1:打开DEBUG
    xhook_enable_debug(1);

    // 在所有已加载so库中查找函数进行Hook
    //xhook_register(".*\\.so$", "Sys_FileRead", New_Sys_FileRead, &Old_Sys_FileRead);

    // 在指定so中查找函数进行Hook
    xhook_register(".*/libmisc.so$", "Sys_FileRead", New_Sys_FileRead, &Old_Sys_FileRead);

    // 忽略libex_misc.so中的Sys_FileRead hook
    xhook_ignore(".*/libex_misc\\.so$", "Sys_FileRead");

    // 忽略libex_misc.so中的所有hook
    xhook_ignore(".*/libex_misc\\.so$", NULL);

    // 提交执行hook操作, 0:同步执行hook 1:异步执行hook
    xhook_refresh(1);
 
    return 0;  
}

最后于 2019-6-5 16:42 被guoqiangck编辑 ,原因:
2019-6-5 16:42
0
游客
登录 | 注册 方可回帖
返回
//