windows实验Wrk源码编译与进程模块分析.docx
《windows实验Wrk源码编译与进程模块分析.docx》由会员分享,可在线阅读,更多相关《windows实验Wrk源码编译与进程模块分析.docx(11页珍藏版)》请在冰豆网上搜索。
windows实验Wrk源码编译与进程模块分析
Wrk源码编译与进程模块分析
实验人员:
实验内容:
1.在虚拟机上装载windows2003SP1,编译wrk,用编译后的内核重新启动操作系统
2.列举wrk进程模块分析
实验目的:
通过实验,将操作系统基本原理和商业操作系统内核联系起来,进一步加深对操作系统整体的理解。
实验过程:
Wrk源码编译
1.虚拟机环境搭建。
使用软件VirtualBox,安装WindowsServer2003sp1
2.将WRK源码拷贝到系统下C盘,将文件夹取名wrk
3. 将系统中的环境变量Path设置为C:
\wrk\tools\x86;%path%
4.(在命令提示符中输入)cdc:
\wrk\base\ntos
5. (在命令提示符中输入)nmake-nologox86=
(内核正在编译...编译完后在wrk\base\ntos\BUILD\EXE下生成内核文件)
编译过程出现找不到msvcr71.dll和MSVCP71.DLL两个文件,原因是VC7运行库中缺少这两个文件,直接从网上下载后拷进\WINDOWS\system32\即可
6.成功编译后,将wrk\base\ntos\BUILD\EXE下的内核文件wrkx86.exe拷贝到C:
\windows\system32下
7.(在命令提示符中输入)在C:
\windows\system32路径下输入link-dump-allhal.dll|findstrpdb命令,查看你的hal按照下面对照:
halacpi.dll->halacpim.dll;ACPIPIC-basedPC[usedbyVirtualPC]
halaacpi.dll->halmacpi.dll;ACPIAPIC-basedPC
halapic.dll->halmps.dll;MPS
8.进入C:
\wrk\WS03SP1HALS\x86目录下,将相应的hal文件夹下的文件(2个)拷贝到C:
\windows\system32下
9.在“我的电脑”上右击鼠标,在弹出菜单中选择“属性”,打开系统属性
对话框,选中高级选项卡,在“启动与故障与修复”栏中单击“设置”按钮,弹出“启动与故障与修复”,在其中单击“编辑”按钮,将在记事本中打开boot.ini
在最后一行加入:
multi(0)disk(0)rdisk(0)partition
(1)\WINDOWS="test"/kernel=wrkx86.exe/hal=hamacpim.dll
10. 重新启动,进入新编译好的内核,wrk的编译也就成功了
wrk进程模块源码分析
列举出所有加载到进程的模块,是所有安全软件都要实现的功能,在psapi.dll中有一组函数可以达到这个目的。
现在来实现这个功能。
进程环境块(processenvironmentblock)
要想列举出进程的模块,首先要了解进程环境块的概念。
进程环境块是一个数据结构,它寄宿在EPROCESS结构中。
找到它的结构定义,
如下:
typedef struct _PEB {
BYTEReserved1[2];
BYTEBeingDebugged;
BYTEReserved2[1];
PVOIDReserved3[2];
PPEB_LDR_DATALdr;
PRTL_USER_PROCESS_PARAMETERSProcessParameters;
BYTEReserved4[104];
PVOIDReserved5[52];
PPS_POST_PROCESS_INIT_ROUTINEPostProcessInitRoutine;
BYTEReserved6[128];
PVOIDReserved7[1];
ULONGSessionId;
} PEB, *PPEB;
//inntpsapi.h
typedef struct _PEB_LDR_DATA {
ULONGLength;
BOOLEANInitialized;
HANDLESsHandle;
LIST_ENTRYInLoadOrderModuleList;
LIST_ENTRYInMemoryOrderModuleList;
LIST_ENTRYInInitializationOrderModuleList;
PVOIDEntryInProgress;
} PEB_LDR_DATA,*PPEB_LDR_DATA;
结构中包含有三个双向链表结构,这三个都是KLDR_DATA_TABLE_ENTRY的双向链表
用dd命令获取PEB地址内容,发现内容全是?
这表明这是一个不能访问的地址,最终确定这个地址是进程所私有的,而不是在所有进程所共享的内核空间里。
搜索代码中所有对EPROCESS中的Peb的引用,最终发现了一个函数:
KeAttachProcess。
这是ntoskrnl.exe中的导出函数,就是它了,我们在每次访问peb之前,先调用KeAttachProcess,完成访问后再调用KeDetachProcess
进程基本结构