编写Windows NT子系统[关闭
-
09-10-2019 - |
题
我想尝试在Windows 7上编写自己的最小NT子系统出于纯粹的教育目的 - 类似于Microsoft子系统中的Posix.exe的裸露,用于基于UNIX的应用程序。
但是我似乎找不到有关此主题的任何公开文档。子系统需要实施什么API?如何使用Windows注册?如何构建子系统图像(在PE标题中需要设置哪些标志等)?
我最想找到一个书籍或网站,概述了整个主题,甚至是其他人所写的“ Hello World” NT子系统的源代码。但是,如果您可以在这里指向正确的方向,那么任何事情都将不胜感激...
解决方案
这是子系统的主要组成部分:
- 用户模式服务器。该服务器创建一个(A)LPC端口,并聆听和处理客户端请求。
- 用户模式客户端DLL。在DLL_INIT_ROUTINE中,您可以连接到服务器设置的端口。该DLL将揭示您的子系统的API,并且某些功能将需要与服务器进行通信。
- 内核模式支持驱动程序(您可能不需要此)。
您将需要将流程或线程状态存储在服务器或驱动程序中。如果您将其存储在服务器中,则可能需要类似 NtRegisterThreadTerminatePort
为了确保在过程或线程退出时可以清理。如果您正在使用驱动程序,则需要 pssetCreateProcessNotifyRoutine.
最后,如果您在XP及以下,则可以添加新的系统调用。您可以通过打电话来做到这一点 KeAddSystemServiceTable
. 。要调用来自用户模式的系统调用,您需要创建像这样的存根(x86):
; XyzCreateFooBar(__out PHANDLE FooBarHandle, __in ACCESS_MASK DesiredAccess, ...)
mov eax, SYSTEM_CALL_NUMBER
mov edx, 0x7ffe0300
call [edx]
retn 4
在Vista及以上,您无法再添加新的系统服务表,因为只有两个空间:内核的系统调用和Win32K的系统调用。
经过一番谷歌搜索后,我发现了以下内容: http://winntposix.sourceforge.net/. 。我认为这与您想要的内容非常相似,并使用了很多我提到的东西。
其他提示
我也对本地API着迷。 :)
我很高兴地说,它与某些人所说的那样危险或无证件。 :]
没有针对“ Hello,World”的源代码,因为本机API与控制台不太容易交互,因为它是Win32子系统的一部分,并且需要与端口的客户端/服务器通信。如果您需要编写控制台应用程序,则需要直接与CSRS进行通信,CSRS的消息格式是无证的(尽管它的某些格式可以在 ReactOS的来源 - 如果您熟悉ReactOS,它将为您带来很多好处)。
我很快就会在这里发布一个示例,您可能会发现有趣的;现在,请注意您的 只要 选项曾经是与ntdll.dll链接,为此,您需要驱动程序开发套件(因为您需要LIB文件)。
更新: : 看一下这个!
(我感觉没有其他人会发布像这样的叛逆的东西。用本地API展示GUI?!我一定疯了!)
#include <Windows.h>
typedef DWORD NTSTATUS;
//These are from ReactOS
typedef enum _HARDERROR_RESPONSE_OPTION
{
OptionAbortRetryIgnore,
OptionOk,
OptionOkCancel,
OptionRetryCancel,
OptionYesNo,
OptionYesNoCancel,
OptionShutdownSystem
} HARDERROR_RESPONSE_OPTION, *PHARDERROR_RESPONSE_OPTION;
typedef enum _HARDERROR_RESPONSE
{
ResponseReturnToCaller,
ResponseNotHandled,
ResponseAbort,
ResponseCancel,
ResponseIgnore,
ResponseNo,
ResponseOk,
ResponseRetry,
ResponseYes,
ResponseTryAgain,
ResponseContinue
} HARDERROR_RESPONSE, *PHARDERROR_RESPONSE;
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
//You'll need to link to NTDLL.lib
//which you can get from the Windows 2003 DDK or any later WDK
NTSYSAPI VOID NTAPI RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString);
NTSYSAPI NTSTATUS NTAPI NtRaiseHardError(IN NTSTATUS ErrorStatus,
IN ULONG NumberOfParameters, IN ULONG UnicodeStringParameterMask,
IN PULONG_PTR Parameters,
IN HARDERROR_RESPONSE_OPTION ValidResponseOptions,
OUT PHARDERROR_RESPONSE Response);
#define STATUS_SERVICE_NOTIFICATION_2 0x50000018
int main()
{
HARDERROR_RESPONSE response;
ULONG_PTR items[4] = {0};
UNICODE_STRING text, title;
RtlInitUnicodeString(&text,
L"Hello, NT!\r\nDo you like this?\r\n"
L"This is just about as pretty as the GUI will get.\r\n"
L"This message will self-destruct in 5 seconds...");
RtlInitUnicodeString(&title, L"Native Message Box!");
items[0] = (ULONG_PTR)&text;
items[1] = (ULONG_PTR)&title;
items[2] = (ULONG_PTR)OptionYesNo;
items[3] = (ULONG_PTR)5000;
NtRaiseHardError(STATUS_SERVICE_NOTIFICATION_2, ARRAYSIZE(items),
0x1 | 0x2 /*First two parameters are UNICODE_STRINGs*/, items,
OptionOk /*This is ignored, since we have a custom message box.*/,
&response);
return 0;
}
如果您有任何问题随时问!我不怕本地API! :)
编辑2:
如果您想制作自己的DLL版本的kernel32,并像kernel32一样加载它(因此是一个新子系统),我只是想让您知道我认为这是不可能的。这与 这个问题 几天前我问过,看来您无法扩展NT PE加载程序以了解新的子系统,因此我认为这是不可能的。