原生进程
前些日子看老雷的的软件调试卷二,提到了原生进程。后来又看了某国际同行的视频,学会了如何用vs编译一个Native Process。特此记录
概述
不依赖任何Windows子系统。
只会链接ntdll库
Ntdll里面实现的功能
- 镜像加载,堆管理器,一些线程池的支持
- 各种类似c运行时的函数,比如说memset,sprintf
- 系统调用
特点
运行在系统启动时
- 经典的例子:autochk.exe
- 原生进程的pe格式中,子系统定义为Native
smss.exe运行注册表HKLM\System\CurrentControlSet\Control\Session Manager键下BootExecute指定的原生进程
Demo
#include <Windows.h>
#include <winternl.h>
extern "C" {
NTSTATUS NTAPI NtTerminateProcess(
_In_opt_ HANDLE ProcessHandle,
_In_ NTSTATUS ExitStatus);
NTSTATUS NTAPI NtDelayExecution(_In_ BOOLEAN Alertable, _In_opt_ PLARGE_INTEGER DelayInterval);
NTSTATUS NTAPI NtDrawText(_In_ PUNICODE_STRING Text);
}
#define NtCurrentProcess() ((HANDLE)(LONG_PTR)-1)
extern "C" void NTAPI NtProcessStartup(PPEB peb) {
PROCESS_BASIC_INFORMATION info;
NtQueryInformationProcess(NtCurrentProcess(), ProcessBasicInformation, &info, sizeof(info), nullptr);
UNICODE_STRING text;
RtlInitUnicodeString(&text, L"Hello, Native World!");
NtDrawText(&text);
LARGE_INTEGER interval;
interval.QuadPart = -10000 * 5000;
NtDelayExecution(FALSE, &interval);
NtTerminateProcess(NtCurrentProcess(), 0);
}
vs编译选项
- 禁用c++异常
- 禁用安全检查
- 运行时检查为默认值
- 子系统设置为Native
- 附加依赖项设置为ntdll.lib
- 忽略所有默认库
运行效果
|