能力值:
( LV2,RANK:10 )
|
-
-
2 楼
多嘴回复一下。 你自己说对hook有大致了解,但是看了你的提问,感觉你对hook还没入门。你了解的inline hook是什么样子?
最后于 2020-3-21 11:18
被tDasm编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
难道没有人用过或者了解这种hook方式吗?Android源码里可是好多啊
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
tDasm
多嘴回复一下。你自己说对hook有大致了解,但是看了你的提问,感觉你对hook还没入门。你了解的inline hook是什么样子?
@tDasm 是啊,我还没有入门呢,只是了解了一些hook原理。肯指教都是我的老师  。我理解的inline hook应该是首先备份目标函数N字节的指令,准备一段指令和这个长度相同,指令主要作用是跳转至跳板函数的跳转指令,然后mprotect 修改目标函数所在页的写权限,修改目标函数开始N字节为跳转指令,达到hook的目的。 在跳板函数里call原函数的话,先进行参数准备,然后call备份的指令,然后跳转到目标函数后续的指令地址。 这帖子里提到的和这个方法想去甚远,我的理解是这种dlsym获取函数指针,并修改指针指向的值的方式就是修改代码段,既没有看到修改内存写权限,也没有看到准备跳转指令,原函数首地址内容被替换后,再call备份的函数指针应该无法执行原函数的。
跳板函数的首地址只是个地址,并不是跳转指令,作为指令覆盖了原函数头部,模块跳转到原函数执行时,pc走到原函数头的代码段时把一个地址号当指令执行,应该就跑飞了,也不可能跳转到跳板函数啊,
实在无法理解。
还望大佬指点一二  。
最后于 2020-3-21 12:24
被andwei编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
老师教你1十1=2,别人写成1+3-3+1=2,你就不理解了? 1.如果代码段本来就可写,是不是不需要调用mprotect修改内存为可写?或者在其它位置调用了mprotect使整过代码段都可写,那么在hook某函数就不必再调用了? 2、hook如果要调用原函数才需要保存原函数入口代码n字节并加跳转到原函数n+1处执行。如果是替换原函数呢?是不是就不需要跳转到原函数了? 你是德国人?
最后于 2020-3-21 14:40
被tDasm编辑
,原因:
|
能力值:
(RANK:200 )
|
-
-
6 楼
可以参考https://bbs.pediy.com/thread-258239.htm
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
tDasm
老师教你1十1=2,别人写成1+3-3+1=2,你就不理解了?1.如果代码段本来就可写,是不是不需要调用mprotect修改内存为可写?或者在其它位置调用了mprotect使整过代码段都可写,那么在h ...
我可以肯定的告诉你,我说的这种hook没有调用mprotect,因为我copy了那段类似: completion_func =dlsym(handle, "rl_attempted_completion_function") *completion_func = ss_rl_completion; 这个逻辑的代码到我的项目里,完美hook,没有调用mprotect。并且我的hook是需要调用原函数的,备份了原函数的地址后,可以用来直接调用原函数。可能你没有用过这种方式。我去仔细研究研究版主的回复吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
你直接把so放上来,让大家学习一下这么高明的hook方法。 凭一张嘴谁信?拿出so是最好的实证
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
哥们儿,你觉得我是闲的没事来骗人的吗?大家都是成年人,好好说话对大家都好不是。家里没有编译环境,公司项目的结果也不能放出来。我把同事那段代码改改英文单词,避免公司机器人扫描。代码是公司sdk hook artmethod后禁止被hook的方法再被jit编译的。其实sdk里是有一套inline hook的,但是唯独这个用的是这种方式。改天我把这个模块编译一个与公司无关的so放出来。
下面是代码:
#include <dlfcn.h>
#define DEF_ART_JIT_COMPILE_M_NAME "_ZN3art3jit3Jit19jit_compile_method_E"
typedef bool (*PJitCompMethod)(void*, void* pArtMethod, void *pThread, bool osr);
static PJitCompMethod _PJitCompMethod = NULL;
bool doJitCompHook(PJitCompMethod pCompileM, PJitCompMethod* ppOldCompileM ) {
...
void *libart = dlopen("libart.so", RTLD_LAZY | RTLD_GLOBAL);
PJitCompMethod * ppcompile_m = (PJitCompMethod*)dlsym(libart, DEF_ART_JIT_COMPILE_M_NAME);
...
*ppOldCompileM = *ppcompile_m;
*ppcompile_m = pCompileM;
dlclose(libart);
return true;
}
static bool hookJitCompileMethodJmp(void * pdata, void* pArtMethod, void *pThread) {
...
if (needjit) {
return _PJitCompMethod(pdata, pArtMethod, pThread);
}
...
return true;
}
doJitCompHook((PJitCompMethod)hookJitCompileMethodJmp, &_PJitCompMethod);
最后于 2020-3-24 15:02
被andwei编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
LowRebSwrd
可以参考https://bbs.pediy.com/thread-258239.htm
非常感谢版主  ,我再写个代码调试调试。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
前面还以为你hook没入门,看了你后面贴出来的代码,你c都没入门? *ppOldCompileM = *ppcompile_m; *ppcompile_m = pCompileM; 显然那个dlsym返回不是函数入口地址,而是存放函数地址的指针。而且这哪是inline hook?这相当于hook出口表。 https://bbs.pediy.com/thread-255671.htm
最后于 2020-3-21 20:33
被tDasm编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
tDasm
前面还以为你hook没入门,看了你后面贴出来的代码,你c都没入门? *ppOldCompileM = *ppcompile_m;  ...
我从没说这种方式是inline hook,是你误以为我说的是。
最后于 2020-3-21 22:30
被andwei编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
hook只有二种: 1、inline hook直接修改函数入口代码或函数内某处代码跳转到自己代码。 2、地址替换。包含入口表地址替换、出口表地址替换、结构体内地址替换等。这类hook最简单但不一定有效,不通过地址表的调用hook不到。 相当于hook出口表只是原理上一样,不等于hook出口表。
最后于 2020-3-21 22:07
被tDasm编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
tDasm
hook只有二种:1、inline hook直接修改函数入口代码或函数内某处代码跳转到自己代码。2、地址替换。包含入口表地址替换、出口表地址替换、结构体内地址替换等。这类hook最简 ...
“dlsym 返回的是指向函数的指针 ” 就是这句,我又回去看了 linker 的 resolve_symbol_address,应该是走的上面 call_ifunc_resolver 那个逻辑,那个逻辑就是计算导出表的。多谢多谢~~ 同事的hook工作正常,是因为那个函数被其他模块调用的,本模块内没有使用。
最后于 2020-3-21 22:34
被andwei编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
搞明白了,还是linker的代码没有看懂阿,结贴。这里有介绍 linker 的: 656K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3K9r3g2A6P5r3W2S2L8X3N6Q4x3V1k6H3i4K6u0r3x3e0l9&6z5o6M7^5x3K6S2Q4x3X3g2Z5N6r3#2D9
最后于 2020-3-21 22:38
被andwei编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
找到符号地址并保存一份, dlsym指向的地址被替换, 导出表hook差不多
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
typedef char **rl_completion_func_t(const char *text, int start, int end); rl_completion_func_t * rl_attempted_completion_function; 看下他的原型就知道了!你想太多而已···
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
楼主只是在向别人请教学习,但是这个tDasm的回复总感觉是一副高高在上的样子,还是楼主那句话 “大家都是成年人,好好说话”,
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
bluth
楼主只是在向别人请教学习,但是这个tDasm的回复总感觉是一副高高在上的样子,还是楼主那句话 “大家都是成年人,好好说话”,
哈哈,好好说话利于交流,对大家都好。我的原则是只要没有攻击性的语言都客客气气来。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
不止
|
|
|