• sys_call_table HOOK


    sys_call_table 这个东西,其实和 Windows 下的 SSDT 表,在功能上完全相同。

    前一阵子学Linux驱动,遇到了这个系统调用表,然后我就想到Windows的SSDT表,既然SSDT表都可以HOOK,系统调用表是不是也可以。

    然后,就开始HOOK了。

    首先,SSDT表,是微软自己导出的,我就在想,Linux是不是也导出了 sys_call_table 呢,一顿上网查。。

    结果,确实,2.4以前的版本内核Linux导出了系统调用表,但是到了2.4以后,就不导出了。

    然后我就想了第二种方法,Windows内核里面遇到未导出的东西的话,也是可以用的,顶多就是暴利搜索一下呗,Linux下是不是也可以,然后继续一顿上网查,

    结果,我的想法是正确的,得到了一段暴力搜索的方法。。。

    首先,使用 sidt ,得到idt表,由于Linux陷入内核使用的是 0x80 号中断,所以关键点在这里。

    其次,从idt表里面得到 0x80 号中断的响应函数位置,得到了这个位置之后,就好办了。

    然后,从0x80号中断响应函数起始位置开始搜索硬编码 xffx14x85 ,搜索前100个字符就可以搜索到它们了

    最后,硬编码的位置找到了,这块硬编码的后面紧接着就是系统调用表的地址了

    大功告成了,剩下的就不是什么事了,系统调用表内部系统调用的函数索引保存在 include 文件夹里,asm文件夹下,unistd.h 头文件中,这个头文件又分别用宏引入了两个头文件,一个是 unistd_32.h 另一个 unistd_64.h ,其实就是32位和64位版本,64位的不太懂,但是看里面的实现,和32位的相差不大,

    (这个include文件夹不是内核源码里面的文件夹,内核源码里面的include/asm里面没有unistd.h,我的内核版本是2.6.29.4,我这里是没有)

    根据系统调用表,加上这里得到的信息索引,再用自己准备好的HOOK函数,就可以直接对 sys_call_table 来 HOOK 了,

    Windows 下的 SSDT HOOK,我喜欢用原子操作来保存值,而且原子操作很容易,直接一个 interlocedexchange 就可以原子交换两个东西的值,安全、方便、简单、快捷,

    Linux下。。。似乎比较麻烦。我知道的,也就 atomic 原子操作,还得定义个 atomic_t 变量,麻烦得要死,

    所以。。。索性就直接赋值操作就好了,虽然可能编译器要把一句赋值拆成两句指令,但是方便一点。

    这样就实现了 HOOK sys_call_table 。

    其实 HOOK 危险性高,不安全,稳定性差,站在个人的角度上来说,我是很讨厌HOOK操作的,

    但是,不HOOK还能怎么搞,Windows还可以下回掉,Linux有这功能么,可能我学得少,不知道。

  • 相关阅读:
    appium===报错Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.settings without first uninstalling.的解决办法
    Appium===Appium+Python API(转)
    appium===出错时截图的方法,自动截图
    appium===setup/setupclass的区别,以及@classmathod的使用方法
    appium===元素定位
    appium===Python+Appium环境部署教程
    appium===报错adb server version (31) doesn’t match this client (39); killing…的解决办法
    appium===安卓SDK下载很慢的解决办法
    HTTP===通用首部字段的各种指令解释
    HTTP===http首部字段
  • 原文地址:https://www.cnblogs.com/suanguade/p/4024189.html
Copyright © 2020-2023  润新知