在学习了C语言和操作系统的理论知识之后,我决定分析一个用于Linux的内核rootkit,但是我不懂一行代码,也不知道该怎么读:
*(void **)&((char *)h->original_function)[ASM_HOOK_CODE_OFFSET] = h->modified_function;
全文:
#if defined __i386__
// push 0x00000000, ret
#define ASM_HOOK_CODE "\x68\x00\x00\x00\x00\xc3"
#define ASM_HOOK_CODE_OFFSET 1
// alternativly we could do `mov eax 0x00000000, jmp eax`, but it's a byte longer
//#define ASM_HOOK_CODE "\xb8\x00\x00\x00\x00\xff\xe0"
#elif defined __x86_64__
// there is no push that pushes a 64-bit immidiate in x86_64,
// so we do things a bit differently:
// mov rax 0x0000000000000000, jmp rax
#define ASM_HOOK_CODE "\x48\xb8\x00\x00\x00\x00\x00\x00\x00\x00\xff\xe0"
#define ASM_HOOK_CODE_OFFSET 2
#else
#error ARCH_ERROR_MESSAGE
#endif
struct asm_hook {
void *original_function;
void *modified_function;
char original_asm[sizeof(ASM_HOOK_CODE)-1];
struct list_head list;
};
/**
* Patches machine code of the original function to call another function.
* This function should not be called directly.
*/
void _asm_hook_patch(struct asm_hook *h)
{
DISABLE_W_PROTECTED_MEMORY
memcpy(h->original_function, ASM_HOOK_CODE, sizeof(ASM_HOOK_CODE)-1);
*(void **)&((char *)h->original_function)[ASM_HOOK_CODE_OFFSET] = h->modified_function;
ENABLE_W_PROTECTED_MEMORY
}
Rootkit链接:
https://github.com/nurupo/rootkit/blob/master/rootkit.c
(rootkit.c的第314行)
我不想解释rootkit的方式,只想了解如何阅读该行代码,该行的第一部分让我感到头晕。
最佳答案
如果我没记错的话,那就从最里面开始
h->original_function
然后我们在右边看到一个括号,因此现在我们向左扫描以找到匹配的括号。但是请稍等片刻,我们看到对
(char *)
的强制转换,因此它是一个指向char的指针,现在括号关闭了。现在,在右侧我们看到一个数组索引以获取元素
[ASM_HOOK_CODE_OFFSET]
,在左侧我们现在看到了&
获取其地址。现在我们有了一个字符的地址。现在,我们只能向左转到
*(void **)
,它将该地址强制转换为指向空指针的指针,然后将其取消引用并将右侧部分分配给该地址。