转自:http://yanshurong.spaces.live.com/blog/cns!33C6A79B73579F0!275.entry
2004年2月12号,有人将Microsoft Windows NT 4和Microsoft Windows 2000的部分核心源代码泄露出来,并在网上传播。对此,微软公司发言人汤姆·皮拉表示:“我们发现Windows 2000和NT 4.0的部分源代码非法地出现在互联网上。”并警告说,任何第三方传播这些源代码都是非法的行为,微软将对此采取严肃行动。不过相信很多对Windows内核感兴趣的朋友还是在第一时间下载到了这些压缩文件。如果你没有,也不用着急,虽然我不能告诉你直接的下载地址,但即使到今天,你仍然可以尝试通过emule或迅雷等P2P工具搜索到,关键字分别是“nt source“和“windows_2000_source_code”。请记住,为了不必要的法律纠纷,不要把这些代码用于商业目的,也不要传播这些代码,学习完后应该立刻把这些代码删除,如果由此引起任何法律问题,本人概不负责。
在泄露当天我得到了相关代码,至于从哪下的忘掉了,好像是一个国外网站。NT4的代码压缩包大小是229M,2000的是203M。通过研究分析,NT4代码相对比较全,可以编译出绝大部分系统核心文件(起码我想编译的大都编译出来了),2000代码基本上只能看,不能编译,因为缺失了太多的头文件。今天突然起了怀旧之心,想来个故地重游,本以为轻车熟路,应该很快就能搞定,不料还是碰到不少问题,虽然凭记忆最终还是得以解决,但还是花了不少时间。其间也借助google尝试查找这方面的信息,但结果并不是很理想,尤其是NTLDR的编译可以说没有任何相关信息,为了方便大家也为了方便自己以后查找,特意把步骤记录下来。发表是最好的记忆。
这篇文章主要讨论代码的编译环境搭建,后面有时间的话我会陆续写出编译NTLDR,ntoskrnl.exe,hal.dll以及win32k.sys等文件的详细编译步骤。由于我可爱的小黑一直用的是XP,下面就介绍XP系统下编译环境的搭建,在这你需要准备好VC6.0,NT4DDK以及NT4的源代码压缩包。NT4DDK可以从这下载。(可惜MS对中国还不开放SkyDrive,否则我可以把相应修改后的文件放上去了)
1. 安装VC6.0
2. 由于在XP和2003下没办法安装NT4 DDK,只好在另外一台WIN2K的机器(可以是虚拟机)上安装, 选自定义安装,仅安装库和头文 件。假定安装到c:\ddk。
3. 把上一步中的c:\ddk目录整个拷到XP系统的d:\下,这样就类似于把NT4 DDK安装到XP系统下的d:\ddk中。
4. 把nt4源代码解压到d:\nt下,里面应包含private和public两个目录。
5. 在d:\ddk目录下创建buildchk.bat文件,其内容是:
cmd.exe /k D:\DDK\bin\setenv.bat D:\DDK checked
在d:\ddk目录下创建buildfre.bat文件,其内容是:
cmd.exe /k D:\DDK\bin\setenv.bat D:\DDK free
6. 拷贝D:\nt\public\sdk\lib\coffbase.txt到D:\DDK\lib\i386\free目录。
7. 点击d:\ddk\buildfre.bat,切换到D:\nt\private\sdktools目录,尽可能多的编译其中的文件,并把编好的文件拷贝到D:\nt\public\tools。其中至少应包括chmode.exe ech.exe gensrv.exe hextract.exe hsplist.exe listmung.exe masm386.exe strcto.exe touch.exe wcshdr.exe ws2hdr.exe。如果在编译过程中碰到类似“link() : error LNK1104: cannot open file "obj\i386\free\structo.exe"”的错误,手动在其i386目录下创建free目录,再重新编译。
8. 在d:\nt目录下创建ntos.bat文件,其内容是:
set CPUTYPE=I386
set USE_PDB=1
set NTDEBUG=ntsd
set NTDEBUGTYPE=windbg
set BASEDIR=\nt
set _NTDRIVE=d:
set _NTROOT=\nt
set NT_UP=1
rem set C_DEFINES=%C_DEFINES% -D_UNICODE -DUNICODE
path d:\nt\public\tools;%PATH%
9. 修改d:\ddk\inc下的MAKEFILE.DEF文件,其中原来的92-101行更改为:
#modified by David
SDK_INC_PATH = D:\nt\public\sdk\inc
CRT_INC_PATH = D:\nt\public\sdk\inc\crt
OAK_INC_PATH = D:\nt\public\oak\inc
#SDK_LIB_PATH = $(BASEDIR)\lib\*\$(DDKBUILDENV)
#DDK_LIB_PATH = $(BASEDIR)\lib\*\$(DDKBUILDENV)
#CRT_LIB_PATH = $(BASEDIR)\lib\*\$(DDKBUILDENV)
#modified by David
SDK_LIB_PATH = D:\nt\public\sdk\lib\*
DDK_LIB_PATH = D:\nt\public\sdk\lib\*
CRT_LIB_PATH = D:\nt\public\sdk\lib\*
USE_PDB=1
#BROWSER_INFO=1
BUILD_OPTIONS=fe
LINKER_FLAGS=$(LINKER_FLAGS) $(SDK_LIB_PATH)\exsup.lib
MASTER_VERSION_FILE = $(BASEDIR)\inc\ntverp.h
#modified by David
#COFFBASE_TXT_FILE = $(BASEDIR)\lib\*\$(DDKBUILDENV)\coffbase.txt
COFFBASE_TXT_FILE = $(BASEDIR)\public\sdk\lib\coffbase.txt
10. 如果你安装NT4DDK的WIN2K系统不是英文环境,修改D:\ddk\bin下的SETENV.BAT文件,其中原来的95行更改为:
set LANGUAGE=USA
原来的109行更改为:
set LANGUAGE=USA
11. 修改D:\nt\public\sdk\inc下的ntdbg.h文件,其中原来的213-221行更改为:
//modified by David
/*typedef enum _DBGUI_APINUMBER {
DbgUiWaitStateChangeApi,
DbgUiContinueApi,
DbgUiMaxI
}
CsrGetProcessLuid(
HANDLE ProcessHandle,
PLUID LuidProcess
);*/
//added by David
#define PCSR_API_ROUTINE ULONG
#define PCSR_1P_API_ROUTINE ULONG
#define PCSR_SERVER_CONNECT_ROUTINE ULONG
#define PCSR_SERVER_DISCONNECT_ROUTINE ULONG
#define PCSR_SERVER_ADDTHREAD_ROUTINE ULONG
#define PCSR_SERVER_DELETETHREAD_ROUTINE ULONG
#define PCSR_SERVER_INITTHREAD_ROUTINE ULONG
#define PCSR_SERVER_EXCEPTION_ROUTINE ULONG
#define PCSR_SERVER_HARDERROR_ROUTINE ULONG
#define PCSR_SERVER_ADDPROCESS_ROUTINE ULONG
#define PCSR_SERVER_SHUTDOWNPROCESS_ROUTINE ULONG
#define PCSR_API_DISPATCH_ROUTINE ULONG
原来的262行后插入:
//added by David
#define NTCSRAPI
#define PCSR_THREAD ULONG
原来的276行后插入:
//added by David
#define PCSR_NT_SESSION ULONG
原来的298行后插入:
//added by David
#define PCSR_PROCESS ULONG
原来的313行后插入:
//modified by David
#define PDBGSS_DBGKM_APIMSG_FILTER ULONG
原来的319-320行更改为:
OUT PCSR_PROCESS *Process,
IN ULONG NTCSoutine OPTIONAL,
原来的337行后插入:
//added by David
#define PDBGUI_WAIT_STATE_CHANGE ULONG