如何利用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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python入门

使用Python这么多年,才发现Python还有这些实用的功能和特点

在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Pytho...

10510
来自专栏PPV课数据科学社区

适用于 PHP 开发人员的 Python 基础知识

您是一名 PHP 开发人员。您在过去 五年(或更长时间)中可能一直都编写应用程序,您已经将许多想像变成了可能 — 电子商务系统、简单内容管理系统、Twitte...

414150
来自专栏PHP在线

什么是堆和栈,它们在哪儿?

问题描述 编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。...

39750
来自专栏Java职业技术分享

使用Python这么多年,才发现Python还有这些实用的功能和特点

在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Pytho...

16330
来自专栏全栈工程师成长之路

PHP开发学习笔记(基础篇)

46350
来自专栏向治洪

Android热修复技术总结

插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能,插件化的知识可以查我我之前的介绍:Android插件化。本...

31760
来自专栏嵌入式程序猿

教你MODBUS程序符合MISRA规则

做嵌入式开发的广大工程师应该对MISRA C不陌生,他是Motor Industry Software Reliability Association 的缩写,...

16930
来自专栏祝威廉

Spark Tungsten in-heap / off-heap 内存管理机制前言

分析方式基本是自下而上,也就是我们分析的线路会从最基础内存申请到上层的使用。我们假设你对sun.misc.Unsafe 的API有一些最基本的了解。

12830
来自专栏北京马哥教育

原来 Python 还有这些实用的功能和特点!

在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性。一些可以说是非常有用,但却没有充分利用。考虑到这一点,我编辑了一些你应该了解的Pytho...

13820
来自专栏北京马哥教育

不吹不擂,你想要的Python面试都在这里了【315+道题】

29540

扫码关注云+社区

领取腾讯云代金券