Static 替换内核模块中的静态函数

Static 替换内核模块中的静态函数,static,kernel,static-methods,static-linking,Static,Kernel,Static Methods,Static Linking,各位 我试图通过修改内核模块的符号来破解它。其基本思想是通过覆盖symtab中的地址,将原始函数替换为新函数。然而,我发现当声明函数为静态时,黑客攻击失败了。但它与非静态函数一起工作。我的示例代码如下: 文件名:orig.c int fun(void) { printk(KERN_ALERT "calling fun!\n"); return 0; } int evil(void) { printk(KERN_ALERT "===== EVIL ====\n");

各位

我试图通过修改内核模块的符号来破解它。其基本思想是通过覆盖symtab中的地址,将原始函数替换为新函数。然而,我发现当声明函数为静态时,黑客攻击失败了。但它与非静态函数一起工作。我的示例代码如下:

文件名:orig.c

int fun(void) {
    printk(KERN_ALERT "calling fun!\n");
    return 0;
}
int evil(void) {
    printk(KERN_ALERT "===== EVIL ====\n");
    return 0;
}
static int init(void) {
    printk(KERN_ALERT "Init Original!");
    fun();
    return 0;
}
void clean(void) {
    printk(KERN_ALERT "Exit Original!");
    return;
}
module_init(init);
module_exit(clean);
然后我按照styx的文章替换symtab中原来的函数“fun”来调用函数“evil”

通过执行elfchger

>./elfchger -s fun -v 1b orig.ko
[+] Opening orig.ko file...
[+] Reading Elf header...
    >> Done!
[+] Finding ".symtab" section...
    >> Found at 0xc630
[+] Finding ".strtab" section...
    >> Found at 0xc670
[+] Getting symbol' infos:
>> Symbol found at 0x159f8
>> Index in symbol table: 0x1d
[+] Replacing 0x00000000 with 0x0000001b... done!
我可以成功地将fun的符号表更改为evil,并插入模块查看效果:

000000000000001b g     F .text  000000000000001b evil
...
000000000000001b g     F .text  000000000000001b fun
> insmod ./orig.ko
> dmesg
[ 7687.797211] Init Original!
[ 7687.797215] ===== EVIL ====
虽然这个很好用。当我将fun的声明更改为“static int fun(void)”并按照上面提到的相同步骤操作时,我发现恶魔没有被调用。谁能给我一些建议吗

谢谢,
William

简短版本:将函数声明为“static”会使其成为本地函数,并阻止导出符号。因此,调用是静态链接的,动态链接器在加载时不会以任何方式影响调用


长版本 将符号声明为“静态”可防止编译器导出符号,使其成为本地符号而不是全局符号。您可以通过在objdump输出中查找(缺少的)“g”,或者在“nm”输出中查找小写的“t”(而不是“t”)来验证这一点。编译器还可以内联本地函数,在这种情况下,符号表根本不包含它

局部符号必须仅对定义它们的翻译单元是唯一的。如果您的模块由多个翻译单元组成,那么每个单元中都可以有一个static fun()。finished.ko的nm或objdump可能包含多个称为fun的本地符号

这也意味着本地符号仅在其各自的翻译单元中有效,并且只能从该单元内部引用(在您的情况下:调用)。否则,链接器现在就不会了,你指的是哪一个。因此,在加载模块之前,对static fun()的调用已在编译时链接

加载时,动态链接器不会篡改本地符号或对其的引用(特别是:调用),因为:

  • 其本地连接已经完成
  • 可能会有更多名为“乐趣”的符号,而动态链接器无法分辨您指的是哪一个

  • 谢谢你的解释!这对我帮助很大!
    000000000000001b g     F .text  000000000000001b evil
    ...
    000000000000001b g     F .text  000000000000001b fun
    > insmod ./orig.ko
    > dmesg
    [ 7687.797211] Init Original!
    [ 7687.797215] ===== EVIL ====