快捷搜索:  网络  后门  CVE  渗透  木马  扫描  黑客  as

MindshaRE:怎么样行使IDA Python阅读WINDOWS内核

1.png

写在前面的话

当我去参加安全会议时,我总喜好跟大神们讨论关于逆向工程方面的器械。因为如许我就可以从别人的经验中了解到他们是怎么样自动化完成那些繁琐操作的了。值得一提的是,很多人已经习性使用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所示:

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

3.png根据图2的数据,我们就可以将函数以及它们的ID手动映照出来了。其中,NtMapUserPhysicalPagesScatter对应的ID为0×0000,NtWaitForSingleObject对应的ID为0×0001,NtCallbackReturn对应的ID为0×0002,后面的依此类推。

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

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

4.png这也就象征着,黑客工具,我们需要每一次读取四个字节的值,然后将它们与基地址相加。

行使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:

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

6.png

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

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

7.png

起首获取LocByName的地址,然后行使Dword获取地址值。下面给出的是64位Windows 10的处理要领:

8.png

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

9.png

工具下载

完备源码获取:【GitHub传送门】

总结

逆向工程阐发原先就是一个索然无味的工作,但义务的自动化完成却能够在无聊中添加一些趣味。希翼人人能够喜好这篇文章,并在一样平常工作中发现IDA以及Python的更多功能。

* 参考来源:zerodayinitiative,Alpha_pck编译,

您可能还会对下面的文章感兴趣: