hook read函数status为19 #69
-
bytehook Version Android OS Version Android ABIs Device Manufacturers and Models hook read函数时绝大部分的so都返回19的status: 其他函数如write、open等都不存在这个问题。 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 1 reply
-
19: https://github.com/bytedance/bhook/blob/main/doc/status_code.zh-CN.md#19 意思是:bytehook在替换GOT中的函数地址值之前,会检查一下GOT中的原值,预期是“这个原值通过dladdr获取到的信息中的函数名”与“你当前hook的函数名”是一致的,在你的例子中就是“read”。如果不一致,就说明很可能在你hook之前已经有人hook了这个函数,这时候bytehook不会再尝试hook这个函数。 这样设计的理由大概是:进程中每个函数符号的caller so对应的GOT表中的值,都是全局的信息,理论上所有的hook库(或者任意的native代码逻辑)都可以随时修改这个值,“修改”本身并没有什么技术难度,所以有时候一个进程中会出现很多hook库都在尝试去修改GOT中的值,这些hook/unhook的时序都是不受控制,这种情况作为app整体来说可能是不希望看到的。bytehook是希望作为一个统一的plt/got hook平台来管理这些hook行为,希望app中所有的plt/got hook都通过bytehook来完成,而不是成为app中又一个新的不受控制的hook参与者。 但是如果你的目的只是要“完成hook”,可以修改一下这里的代码,把verify的过程去掉,让bh_hook_manager_verify_got_value函数直接返回0就可以跳过上面说的检查: bhook/bytehook/src/main/cpp/bh_hook_manager.c Line 197 in 23bf3c6 或者你也可以调试下,看看在你hook之前,对应got中的值已经被谁改了,以及hook到了哪里。 |
Beta Was this translation helpful? Give feedback.
19: https://github.com/bytedance/bhook/blob/main/doc/status_code.zh-CN.md#19
意思是:bytehook在替换GOT中的函数地址值之前,会检查一下GOT中的原值,预期是“这个原值通过dladdr获取到的信息中的函数名”与“你当前hook的函数名”是一致的,在你的例子中就是“read”。如果不一致,就说明很可能在你hook之前已经有人hook了这个函数,这时候bytehook不会再尝试hook这个函数。
这样设计的理由大概是:进程中每个函数符号的caller so对应的GOT表中的值,都是全局的信息,理论上所有的hook库(或者任意的native代码逻辑)都可以随时修改这个值,“修改”本身并没有什么技术难度,所以有时候一个进程中会出现很多hook库都在尝试去修改GOT中的值,这些hook/unhook的时序都是不受控制,这种情况作为app整体来说可能是不希望看到的。bytehook是希望作为一个统一的plt/got hook平台来管理这些hook行为,希望app中所有的plt/got hook都通过bytehook来完成,而不是成为app中又一个新的不受控制的hook参与者。
但是如果你的目的只是要“完成hook”,可以修改一下这里的代码,把verify的过程去掉,让bh_hook_manager_verify_got_value函数直接返回0就可以跳过上面说的检查:
bhook/bytehook/src/main/cpp/bh_hook_manager.c
Line 197 in 23bf3c6