2013年12月1日星期日

EPROCESS KPROCESS PEB 《寒江独钓》内核学习笔记(2) - .Little Hann

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
EPROCESS KPROCESS PEB 《寒江独钓》内核学习笔记(2) - .Little Hann  阅读原文»

在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB。把它们放到一起是因为这三个数据结构及其外延和windows中进程的表示关系密切,我们在做进程隐藏和进程枚举的时候一定会涉及到这3类数据结构,所以这里有必要及时做一下总结,做个学习笔记,理清思路。

1. 相关阅读材料

《windows 内核原理与实现》 --- 潘爱民

《深入解析windows操作系统(第4版,中文版)》 --- 潘爱民

《Windows核心编程(第四版)》中文版

首先我们来看一张windows的内核分布图,我们之后要讲的执行体和内核层都在上面。

每个windows进程都是由一个执行体进程块(EPROCESS)块来表示的。"EPROCESS块中除了包含许多与进程有关的属性之外,还包含和指向许多其他的相关数据结构"(这也是为什么能利用EPROCESS进行进程枚举的原因)。例如,每个进程都有一个或多个线程,这些线程由执行体线程块(ETHREAD)来表示。EPROCESS块和相关的数据结构位于系统空间中,不过,进程环境块(PEB)是个例外。它位于进程地址空间中(因为它包含一些需要由用户模式代码来修改的信息)。

除了EPROCESS块以外,windows子系统进程(Csrss.exe)为每个windows进程维护了一个类似的结构。而且,windows子系统的内核部分(Win32k.sys)有一个针对每个进程的数据结构(KPROCESS),当一个线程第一次调用windows的USER或GDI函数(它们在内核模式中实现的)时,此数据结构就会被创建。在学习的一开始,我们对这些数据结构在windows系统的层级位置和大致的作用有一个了解很关键。接下来,我们来详细了解这些数据结构。

一 . EPROCESS

EPEOCESS(执行体进程块,E是Execute的意思,注意和KPROCESS区分开来)位于内核层之上(KPROCESS就内核层,我们之后会学习到KPROCESS),它侧重于提供各种管理策略,同时为上层应用程序提供基本的功能接口。所以,在执行体层的进程和线程数据结构中,有些成员直接对应于上层应用程序中所看到的功能实体。

我们使用winDbg来查看windows XP下的EPROCESS数据结构(winDbg双机调试的方法在《寒江独钓》第一章以及网上有很多成熟的使用说明)。

我们接下来的例子都以windows XP下的notepad.exe作为实验材料。首先,启动winDbg后,找到notepad.exe这个进程(你在虚拟机里要先启动notepad.exe哦)

!process 0 0 //查看当前进程
....
PROCESS 823e5490 SessionId:
0 Cid: 0af0 Peb: 7ffd5000 ParentCid: 02b8
DirBase: 0f200340 ObjectTable: e283dc30 HandleCount:
106.
Image: alg.exe

PROCESS 824a7020 SessionId:
0 Cid: 00a0 Peb: 7ffda000 ParentCid: 0668
DirBase: 0f2001a0 ObjectTable: e292f898 HandleCount:
44.
Image: notepad.exe
...

可以看到 PROCESS 824a7020 ,824a7020 就是notepad.exe的_EPROCESS结构地址(这个地址在notepad的生命周期中就不会变了)

dt _eprocess 824a7020 //查看notepad.exe的_EPROCESS
kd> dt _eprocess 824a7020
ntdll
!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER 0x1ceee34`5d8ce8a2
+0x078 ExitTime : _LARGE_INTEGER 0x0
+0x080 RundownProtect : _EX_RUNDOWN_REF
+0x084 UniqueProcessId : 0x000000a0
+0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x8055b158 - 0x823e5518 ]
+0x090 QuotaUsage : [3] 0xa50
+0x09c QuotaPeak : [3] 0xc48
+0x0a8 CommitCharge : 0x184
+0x0ac PeakVirtualSize : 0x244d000
+0x0b0 VirtualSize : 0x1f87000
+0x0b4 SessionProcessLinks : _LIST_ENTRY [ 0xf8b6a014 - 0x823e5544 ]
+0x0bc DebugPort : (null)
+0x0c0 ExceptionPort : 0xe1982848
+0x0c4 ObjectTable : 0xe292f898 _HANDLE_TABLE
+0x0c8 Token : _EX_FAST_REF
+0x0cc WorkingSetLock : _FAST_MUTEX
+0x0ec WorkingSetPage : 0xc6af
+0x0f0 AddressCreationLock : _FAST_MUTEX
+0x110 HyperSpaceLock : 0
+0x114 ForkInProgress : (null)
+0x118 HardwareTrigger : 0
+0x11c VadRoot : 0x82401480
+0x120 VadHint : 0x8256a530
+0x124 CloneRoot : (null)
+0x128 NumberOfPrivatePages : 0xc0
+0x12c NumberOfLockedPages : 0
+0x130 Win32Process : 0xe109b210
+0x134 Job : (null)
+0x138 SectionObject : 0xe19d2c18
+0x13c SectionBaseAddress : 0x01000000
+0x140 QuotaBlock : 0x82cf5db8 _EPROCESS_QUOTA_BLOCK
+0x144 WorkingSetWatch : (null)
+0x148 Win32WindowStation : 0x0000003c
+0x14c InheritedFromUniqueProcessId : 0x00000668
+0x150 LdtInformation : (null)
+0x154 VadFreeHint : (null)
+0x158 VdmObjects : (null)
+0x15c DeviceMap : 0xe21f5258
+0x160 PhysicalVadList : _LIST_ENTRY [ 0x824a7180 - 0x824a7180 ]
+0x168 PageDirectoryPte : _HARDWARE_PTE_X86
+0x168 Filler : 0
+0x170 Session : 0xf8b6a000
+0x174 ImageFileName : [16] "notepad.exe"
+0x184 JobLinks : _LIST_ENTRY [ 0x0 - 一个用微软官方的OpenXml读写Excel 目前网上不太普及的方法。 - 辰  阅读原文»

新版本的xlsx是使用新的存储格式,貌似是处理过的XML。

传统的excel处理方法,我真的感觉像屎。用Oldeb不方便,用com组件要实际调用excel打开关闭,很容易出现死。

对于OpenXML我网上搜了一下,很多人没有介绍。所以我就这里推荐下,相信会成为信息系统开发的必备。

先写出个例子,会发现如此的简介:

using System;
using System.Collections.Generic;
using System.Text;
using XFormular.config;
using System.IO;
using com.xtar.amfx;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;

namespace XFormular.test
{
class Class1
{
public void test()
{
DataTable table
= new DataTable("1");
table.Columns.Add(
"2");
for (int i = 0; i < 10; i++)
{
DataRow row
= table.NewRow();
row[
0] = i;
table.Rows.Add(row);
}

List
<DataTable> lsit = new List<DataTable>();
lsit.Add(table);

OpenXmlSDKExporter.Export(AppDomain.CurrentDomain.BaseDirectory
+ "\\excel.xlsx", lsit);
}
}
}

写出代码:

using System;
using System.IO;
using System.Windows.Forms;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Extensions;
using System.Collections.Generic;
using System.Data;
using System.Text.RegularExpressions;

namespace XFormular
{
//http://simpleooxml.codeplex.com/
//http://www.pin5i.com/showtopic-21817.html
//http://blog.csdn.net/lbj147123/article/details/6603942
class OpenXmlSDKExporter
{
private static string[] Level = {"A", "B", "C", "D", "E", "F", "G",
"H", "I", "G", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z" };

public static List<DataTable> Import(string path)
{
List
<DataTable> tables = new List<DataTable>();

if (path.EndsWith(ExcelHelper.POSTFIX_SVN))
return tables;

using (MemoryStream stream = SpreadsheetReader.StreamFromFile(path))
{
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, true))
{
foreach (Sheet sheet in doc.WorkbookPart.Workbook.Descendants<Sheet>())
{
DataTable table
= new DataTable(sheet.Name.Value);

WorksheetPart worksheet
= (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);

List
<string> columnsNames = new List<string>();

阅读更多内容

没有评论:

发表评论