专栏首页FreeBuf如何利用IDA Python浏览WINDOWS内核

如何利用IDA Python浏览WINDOWS内核

写在前面的话

当我去参加安全会议时,我总喜欢跟大神们讨论关于逆向工程方面的东西。因为这样我就可以从别人的经验中了解到他们是如何自动化实现那些繁琐操作的了。值得一提的是,很多人已经习惯使用IDA的人却不喜欢使用内置的API来完成他们的工作。为了改变这个现状,今天我准备给大家演示IDA配合上Python之后会有怎样强大的效果。

在这篇文章中,我将给大家介绍如何利用IDA Python来枚举Windows的系统调用表。

背景知识

Windows系统中所有发生的系统调用都会被分配一个ID,这个ID是一个唯一值,用于标识一个系统调用在执行时具体使用的是哪一个函数。在不同的Windows版本中,这些ID的变化可能会非常大,对于Windows 10来说,每一个发行版本中的这些ID都不同。但是对于普通应用程序而言,由于使用的是用户模式下的代码库,因此ID不会变化。

接下来,我将给大家演示如何手动枚举调用表,然后再演示如何通过Python实现自动化枚举。

手动枚举Windows系统调用表

在解析系统调用表时我们还有三个重要的符号需要识别:表的基址、表的大小和参数在栈中所占的字节大小。对于ntoskrnl.exe来说,这三个参数的名称分别为:KiServiceTable、KiServiceLimit和KiArgumentTable。对于win32k.sys来说,这三个参数就变成了W32pServiceTable、W32pServiceLimit和W32pArgumentTable。在32位系统架构中,这些符号名称中都会包含下划线。

比如说,我们来看一看Windows 7 64位版本中ntoskrnl.exe(版本6.1.7601.24117)的信息。KiServiceLimit数据如图1所示:

根据这些信息,我们可以看到这里有401个系统调用(0x191)。KiServiceTable数据如图2所示:

根据图2的数据,我们就可以将函数和它们的ID手动映射出来了。其中,NtMapUserPhysicalPagesScatter对应的ID为0x0000,NtWaitForSingleObject对应的ID为0x0001,NtCallbackReturn对应的ID为0x0002,后面的依此类推。

这里有两种特殊情况需要专门处理。如果我们分析的是win32k.sys,在枚举函数ID时需要在表地址上加0x1000。同样的,对于64位Windows10(build 1607)我们也需要进行不同的处理。在这个版本的系统中,系统调用表包含了四个字节的函数偏移量。

下面给出的是版本号为10.0.17134.48的ntoskrnl.exe信息。KiServiceTable数据如图3所示:

这也就意味着,我们需要每次读取四个字节的值,然后将它们与基地址相加。

利用IDA完成自动化映射

首先我们来看一看需要调用的IDA函数:

  1. idaapi.get_imagebase:这个函数将会在我们所查看的模块中返回基地址。
  2. idc.GetInputFile:该函数可以返回IDB加载的文件名称。
  3. idc.BADADDR:这是一个值为-1(无符号整形)的常量,我们还可以用它来判断当前系统为32位还是64位模式。
  4. idc.Name:该函数可以返回给定地址的名称。
  5. idc.LocByName:它的功能跟idc.Name正好相反,它用于返回给定名称的地址。
  6. idc.Dword:该函数能返回给定地址的四字节值。
  7. idc.Qword:该函数可返回给定地址的八字节值。
  8. idautils.DataRefsFrom:该函数可根据任意数据引用枚举给定地址。

首先,我们需要确定正在分析的对象是ntoskrnl.exe还是win32k.sys:

接下来,我们需要判断使用哪一个符号名称,并判断是否需要在变量中添加下划线:

如果表不存在,LocByName将返回BADADDR,所以我们就可以利用这一点来测试符号名称是否存在或是否需要添加下划线。

得到了正确的符号名称之后,我们需要获取表的实际大小:

首先获取LocByName的地址,然后利用Dword获取地址值。下面给出的是64位Windows 10的处理方法:

DataRefsFrom将会利用数据引用来遍历表的基地址,但如果目标是新版本的Windows 10系统,我们就需要在基地址上加上相应的值。接下来需要做的就是从表的基地址开始读取连续的值。我们可以使用Qword函数处理64位版本,用Dword处理32位版本。下面给出的是输出结果样本:

总结

逆向工程分析本来就是一个枯燥乏味的工作,但任务的自动化实现却能够在无聊中添加一些趣味。希望大家能够喜欢这篇文章,并在日常工作中发现IDA和Python的更多功能。

* 参考来源:zerodayinitiative,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

本文分享自微信公众号 - FreeBuf(freebuf),作者:Alpha_h4ck

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Web安全学习:如何自我定位与制定学习计划

    一 简介 通过本篇文章,您可以了解一个web安全从业人员所具备的大致知识面,同时我也制定了一个循序渐进的学习计划,用以帮您找准自己的定位,并可以自己制定适合自己...

    FB客服
  • 矛与盾 | 二进制漏洞攻防思想对抗

    有人的地方就有江湖,有江湖的地方就有争斗,有争斗就有攻防。人类争斗最初是利用拳脚,冷兵器时代是刀枪,热兵器时代是枪炮,而在计算机平台上,人们的武器换成了——代码...

    FB客服
  • VaultPasswordView:可用于查看windows Vault密码的工具

    VaultPasswordView是Windows 10/8/7系统的密码破解工具,你可以用它来解密当前正在运行的系统的Windows Vault数据,以及存储...

    FB客服
  • 堆栈溢出渗透实战-part3

    Stack Overflows for Beginners: 1这个靶机还剩下三个flag没有拿到,继续加油。

    光明SAMA
  • 从SEO的角度,如何打造非专业领域内容?

    在做SEO的过程中,你一定会遇到这样的问题,我们会在不同行业中,扮演相同的角色:搜索引擎优化师,但如果对方并没有提供内容团队的话。

    蝙蝠侠IT
  • Cisco——DHCPv6小实验

    1.在DHCP-Server上配置IPv6的地址池——2019:0:0:0:100:100::/96,域名为ccie.cn。

    释然
  • 手把手教你训练 RNN

    在之前的文章中,我们介绍了 RNN 的基本结构并将其按时间序列展开成 Cells 循环链,称为 RNN cells。下面,我们将揭示单个 RNN Cell 的内...

    AI研习社
  • 如何成为一名合格的 Linux C/C++ 后台开发者?

    我从学生时代到进入软件开发这个行业,不知不觉已经十余年了。这些年,先后在网游公司做过游戏服务器,为上海某交易所做过金融交易系统、在金融证券公司做过股票证券交易系...

    范蠡
  • 精通Excel数组公式007:函数参数数组运算

    下图1展示了一个使用LEN函数计算单元格中字符数的公式。LEN函数接受单个项目作为其参数text,输出单个项目作为其返回值。

    fanjy
  • Jquery Ajax请求文件下载操作失败的原因分析及解决办法

    jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。

    用户5640963

扫码关注云+社区

领取腾讯云代金券