首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何以编程方式判断Windows PE文件是控制台子系统还是Windows子系统?

以下是关于如何以编程方式判断Windows PE文件是控制台子系统还是Windows子系统的答案:

首先,需要了解Windows PE文件的基本结构和内容。Windows PE文件是一种可执行文件,其中包含了操作系统所需的基本信息和代码。在Windows PE文件中,有一个特殊的头部结构,称为IMAGE_DOS_HEADER,它包含了文件的基本信息,包括文件类型、文件大小等。

要判断Windows PE文件是控制台子系统还是Windows子系统,可以通过读取IMAGE_DOS_HEADER结构中的e_magic字段来实现。该字段包含了一个16位的魔数,用于标识文件类型。对于Windows PE文件,该字段的值为0x5A4D,即"MZ"。

接下来,可以通过读取IMAGE_NT_HEADERS结构中的Subsystem字段来判断子系统类型。该字段包含了一个16位的值,用于标识子系统类型。对于控制台子系统,该字段的值为0x3,对于Windows子系统,该字段的值为0x2。

以下是一个简单的示例代码,用于判断Windows PE文件的子系统类型:

代码语言:c++
复制
#include<windows.h>
#include <winnt.h>

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        printf("Usage: %s<filename>\n", argv[0]);
        return 1;
    }

    const char* filename = argv[1];
    HANDLE file = CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (file == INVALID_HANDLE_VALUE)
    {
        printf("Failed to open file: %s\n", filename);
        return 1;
    }

    IMAGE_DOS_HEADER dos_header;
    DWORD bytes_read;
    if (!ReadFile(file, &dos_header, sizeof(dos_header), &bytes_read, NULL) || bytes_read != sizeof(dos_header))
    {
        printf("Failed to read DOS header: %s\n", filename);
        CloseHandle(file);
        return 1;
    }

    if (dos_header.e_magic != IMAGE_DOS_SIGNATURE)
    {
        printf("Not a Windows PE file: %s\n", filename);
        CloseHandle(file);
        return 1;
    }

    IMAGE_NT_HEADERS nt_headers;
    if (!ReadFile(file, &nt_headers, sizeof(nt_headers), &bytes_read, NULL) || bytes_read != sizeof(nt_headers))
    {
        printf("Failed to read NT headers: %s\n", filename);
        CloseHandle(file);
        return 1;
    }

    if (nt_headers.Signature != IMAGE_NT_SIGNATURE)
    {
        printf("Not a Windows PE file: %s\n", filename);
        CloseHandle(file);
        return 1;
    }

    if (nt_headers.OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
    {
        printf("Windows PE file is a console application: %s\n", filename);
    }
    else if (nt_headers.OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI)
    {
        printf("Windows PE file is a Windows application: %s\n", filename);
    }
    else
    {
        printf("Unknown subsystem: %s\n", filename);
    }

    CloseHandle(file);
    return 0;
}

该代码首先打开指定的文件,然后读取IMAGE_DOS_HEADER和IMAGE_NT_HEADERS结构,并检查其中的e_magic和Subsystem字段。最后,根据Subsystem字段的值输出相应的结果。

需要注意的是,该代码仅适用于32位Windows PE文件。对于64位Windows PE文件,需要使用IMAGE_NT_HEADERS64结构来替换IMAGE_NT_HEADERS结构。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

子系统出现BAD_SYSTEM_CONFIG_INFO蓝屏问题

使用PE系统,在PE系统里拷贝镜像文件里的DEFAULT、SAM、SECURITY、SOFTWARE、SYSTEM文件覆盖当前C盘Windows\System32\Config的文件。...教程须知 确认在使用影子系统出现的BAD_SYSTEM_CONFIG_INFO蓝屏,有些小伙伴可能在安装影子系统重启后就进入了这个无限循环蓝屏,有些跟博主一样,在使用了一段时间后才出现。...按win+R呼出运行框,输入regedit打开注册表,这时显示的我们PE系统的注册表,我们选择HKEY_LOCAL_MACHINE,然后点左上角文件,加载配置单元。...到时候我们要还原这个文件的时候没有备份文件还原就麻烦了。 注:博主也是第一次碰到这个问题,以前用的影子卫士,没出现过这种问题,今年2月份换成了影子系统,今天就出了这个毛病。...而且有些电脑在当时装了影子系统后,因为影子系统需要重启生效,所以有些电脑重启后就无限蓝屏了,博主应该是属于触发了什么东西导致影子系统无限蓝屏,所以在使用了一段时间才蓝屏,总结起来就是影子系统这个软件还是有些问题

2.3K30

PE文件详解二

因此这两个结构联合起来,才是一个完整的 “PE文件结构” 。...也就是说当文件被执行时,如果可能的话,Windows优先将文件装入到由ImageBase字段指定的地址中。...Subsystem字段:指定使用界面的子系统,这个字段决定了系统如何为程序建立初始的界面,链接时的/subsystem:**选项指定的就是这个字段的值,在前面章节的编程中我们早已知道:如果将子系统指定为...Windows CUI,那么系统会自动为程序建立一个控制台窗口,而指定为Windows GUI的话,窗口必须由程序自己建立。...虽然PE文件中的数据按照装入内存后的页属性归类而被放在不同的节中的,但是这些处于各个节中的数据按照用途可以被分为导出表、导入表、资源、重定位表等数据块,这16个IMAGE_DATA_DIRECTORY

86030

OpenGL学习笔记:Console工程下如何不显示控制台黑窗口只显示Windows窗口

其实要去除控制台窗口非常简单,只需要修改工程设置,把子系统改成Windows,程序的入口点改成mainCRTStartup。 下面我先把几中解决办法列举出来,再解释下我的理解。...”,如果找不到就添加,最后的效果/subsystem:windows /entry:”mainCRTStartup”。...主要是因为Windows系统下有几种子系统,一种控制台,一种窗口子系统,如果建立了控制台工程肯定是要创建控制台子系统程序了,建立了Windows Application和MFC之类的工程则是窗口子系统了...现在我们使用OpenGL编程,又建立的控制台工程,如果不进行设置肯定会出现黑窗口的,所以我们把工程的子系统改成Windows,但是我们不想改主函数为WinMain了,因为这样会很麻烦,所以我们再把程序入口改成...同样如果win32 App工程下,我们可以把子系统改成控制台,再设置程序入口为WinMainCRTStartup,应该就会得到相反的效果了。

1.5K70

PE文件结构

EXE和DLL文件之间的区别完全是语义上的,他们使用完全相同的PE格式。唯一的区别就是用一个字段标识出这个文件EXE还是DLL。...还有许多DLL的扩展,OCX控件和控制面板程序(.CPL文件)等都是DLL,它们有一样的实体。 64位的Windows只是对PE格式做了一些简单的修饰,新格式叫PE32+。...这个值也通常被用来判断是否为标准的PE文件。...(通常是跟MZ头一起判断) 2、NT头结构信息-PE文件头 IMAGE_FILE_HEADER(PE文件头)结构包含了PE文件的一些基本信息,最重要的其中一个域指出了IMAGE_OPTIONAL_HEADER...(1)Magic:一个标记字,说明文件ROM映像(0107h),还是普通可执行的映像(010Bh),一般010Bh,如是PE32+,则是020Bh。

8710

U盘PE系统详解

一、概述: 1.名词解释: PE系统一般指windows PE,即windows预安装环境,windows内核上构建的具有有限服务的最小win32子系统,它用于安装windows而准备计算机,以便从网络文件服务器复制磁盘映像并启动...Windows PE 不是设计为计算机上的主要操作系统,而是作为独立的预安装环境和其他安装程序和恢复技术(例如 Windows 安装程序、Windows 部署服务 (Windows DS)、系统管理服务器...2.功能: windows 系统安装 磁盘分区 磁盘、内存检测 手动ghost 系统密码清除 虚拟光驱 3.分类 PE系统可以安装在CD,DVD和U盘等介质中,但因为u盘使用方便且易于携带等,所以大多都是安装在...u盘里(具体优点见下图),所以是u盘pe系统,常见u盘pe系统有电脑店u盘pe系统,大白菜u盘pe系统等等。...二、制作U盘PE系统 准备工作:U盘一个,相关pe系统软件,电脑店,大白菜 具体步骤:以大白菜u盘pe系统为例 完成上面5步大白菜U盘PE系统即制作完成。

3.1K10

PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头3

PE2》中介绍了一些可选文件头中重要的属性,为了全面起见,本文将会讲解那些不是那么重要的属性。虽然不重要,但是还是可以发现很多好玩的情况。首先看一下32位的可选文件头详细定义。...注意该属性不能说明这个文件64位文件还是32位文件,至于判断是多少位文件的方案我在《PE2》中已经有了说明。         ...注意:我们在资源中定义的文件版本号不是通过这两个属性来体现的!目前我也没找到在VC工程设置中可以设置这两个属性的地方。         Subsystem文件运行于的子系统信息。...熟悉windows的朋友应该知道,微软刚开始设计系统时,设计成一个平台性质——可以运行3个子系统(OS/2、POSIX和Windows)的系统。这个就是这两个属性的由来。         ...我发现我电脑上很多文件的该PE字段和计算出来的不等。官方解释说当驱动程序、在引导时被加载的Dll以及加载到关键windows进程中的DLL都需要校验该字段以确认其合法性。

1.2K30

2018年8月30日winPE系统和启动盘格式的区别和win安装系统启动方式的区别

*********************************** winPE系统: Windows Preinstallation Environment(Windows PE),Windows...预安装环境, 带有有限服务的最小Win32子系统,基于以保护模式运行的Windows XP Professional 及以上内核。...用途:操作系统损坏无法进入的情况下启动硬盘上的Windows PE可以方便地修复或者 取出电脑中的数据。...GHO文件:GHO文件只是将系统安装好后的硬盘分区进行了文件封装,其自身无 法用于启动系统的,所以必须配合PE系统和Ghost程序使用。...WIM文件:WIM微软推出的一种全新的系统封装方式,其运行模式类似于GHO文件 封装方式,但是更灵活,可以在把镜像文件恢复到硬盘之前,选择恢复分区,并 进行其他简单的配置。

1.4K40

安装 pyinstaller 出错的解决办法及 csdn 工具实例打包

image.png 用过命令pip install pyinstaller安装失败,此包依赖于 pywin32,安装前需要先pip install pywin32, 我安装了还是出错,稍微百度了一下也没有看到解决办法...最新版 pyinstaller 3.4,可运行在 Windows,Mac 和 Linux 操作系统下。...基本语法: pyinstaller options myscript.py 常用的可选参数如下: --onefile 将结果打包成一个可执行文件 --onedir 将所有结果打包到一个文件夹中,该文件夹包括一个可执行文件和可执行文件执行时需要的依赖文件...windows 子系统执行,不会打开命令行(只对 windows 有效) --nowindowed 使用控制台子系统执行(默认)(只对 windows 有效) --icon= 将 file.ico...添加为可执行文件的资源(只对 windows 有效) pyinstaller --paths="D:\" test.py CSDN 访问量脚本实例 比如,拿以前写的一个刷 csdn 访问量工具

1.3K30

PE文件小知识

其中我们最常见的exe和dll,那么它们两个有什么区别呢,exe和dll的区别完全是语义上的,他们使用完全相同的PE格式。唯一的区别就是用一个字段标识出这个文件exe还是dll。...还有许多dll的扩展,ocx控件和控制面板程序(.cpl文件)这些都是dll,它们拥有一样的实体。 64位的Windows只是对pe文件格式做了一些简单的修饰,新格式交PE32+。...对于c++代码,windows文件头的配置使其拥有不明显的区别。 PE文件中的数据结构一般都有32位和64位之分,IMAGE_NT_HEADERS32、IMAGE_NT_HEADER64等。...这个值也通常被用来判断是否为标准的PE文件。...(1)Magic:一个标记字,说明文件ROM映像(0107h),还是普通可执行的映像(010Bh),一般010Bh,如是PE32+,则是020Bh。

7810

硬件服务器,到底安装Linux操作系统好?还是Windows操作系统好?

集成子系统(Subsystem): 集成子系统包括各种进程和服务,会话管理器、登录进程、任务调度程序、打印后台处理程序服务等。这些进程负责管理用户会话、任务调度和打印作业等。...系统调用接口(Shell): 系统调用接口用户空间和内核空间之间的桥梁。它允许用户应用程序通过调用特定的系统调用来请求内核执行特定任务,文件操作、进程控制等。...命令行Shell和图形Shell: 命令行Shell:命令行ShellLinux系统中最基本的shell类型,用户通过命令行界面(终端或控制台)输入文本命令来与系统交互。...它包括常见的命令行shell,Bash(Bourne Again Shell),用于执行系统管理任务、编程文件操作等。命令行shell提供了高度的控制和自动化能力,适用于系统管理员和开发人员。...它在处理各种编程语言和开源软件方面表现出色。 Windows服务器使用整体架构,提供了直观的用户界面,适合初学者和用户友好。

1.1K40

​一个隔开hal与langsys,用户态专用OS的设想

本文关键字:efi based os,native hosting oriented OS与 APP hosting oriented OS,将OS编程与硬件编程独立,将用户OS变为真正的APP空间。...打造实用的基于osxsystembase的融合OS管理器》《一种追求高度融合,包容软硬方案的云主机集群,云OS和云APP的架构全设计》《去windows去PC,打造for程序员的碎片化programming...通用高级BIOS。...那篇文章中我们还谈到EFI实际上可以发展为pe的替代,比如它可以发展内存管理相当于一个OS代替PE OS,更复杂化还可以集成hypervisor,这样做的好处可以在一台PC上并行boot主OS和host...也降低了通用编程学习新手的入阶难度— 因为它们从此不用再学习任何系统知识,处理任何系统编程

37920

气象编程 | 适用于 Linux 的 Windows 子系统安装指南 (Windows 10)

,将打开一个控制台窗口,要求你等待将文件解压缩并存储到电脑上。...首次启动新安装的 Linux 分发版时,将打开一个控制台窗口,系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。 未来的所有启动时间应不到一秒。...虚拟硬盘文件必须解压缩的且未加密的,并且不能稀疏的。 取消选中“压缩内容”(如果已选中“加密内容”,请一并取消选中),方法打开 Linux 发行版的配置文件文件夹。...如果系统询问要将此应用到当前文件还是应用到所有子文件夹和文件,请选择“仅此文件夹”,因为你只是要清除压缩标志。 完成此操作后,wsl --set-version 命令应正常工作。...文中部分图片来源于网络,涉及作品内容、版权和其他问题,请后台联系小编处理。

5.5K60

Unix程序员的Win10二三事

Windows从版本10开始做出的最大改变,可能就是内置的linux子系统,原本的安装方式很简单,网上很多介绍,一般就是三步:1.设置中打开开发人员模式;2.windows组件中安装linux子系统;3...有聪明人想了办法,比如首先从第三方下载tar安装包,利用fiddle之类的软件截获win10安装linux子系统时候的下载路径,随后替换为本地的tar文件,虽然麻烦点,但还是能很快的完成安装。...可以在桌面进入linux子系统,编辑一下/etc/ssh/sshd_config文件,把其中的22号端口,修改为比如23,修改完这样子的: Port 23 如果你的win10开了防火墙,记着修改防火墙设置...如果测试没有问题,在开始菜单->Windows管理程序文件夹中启动win10的“任务计划程序”,增加一个开机自动执行任务,操作启动程序,程序内容就是刚刚编写的这个autostartssh.vbs脚本。...已知有几项限制,开发过程中可能会碰到: 本质上Linux子系统还是接近虚机的运行方式,因此,比较偏向底层的网络编程,比如socks udp操作,测试的时候你要考虑到实际上linux通过win10的网络系统转发的

1K50

Windows 11 及其安卓子系统折腾记

,所以桌面上的程序图标还是原来的样子,有些可以直接用,有些还是需要重新安装的: 激活使用 HEU KMS Activator v24.4.0(关注图中的微信公众号获取): 自动使用数字许可证方式激活了...: 已激活,底下还是有评估副本字样,可能是因为预览版的原因: 更新到最新版: 二、尝试安装安卓子系统 说明:安卓子系统的官方名称为 Windows Subsystem for Android,简称为...Beta 渠道的: 而我现在的系统 Dev 渠道的(我也不知道当时怎么会下载了这么一个系统),而且 Beta 渠道切换不了: 我还是对改语言的方式不死心,把能改的都改成美国的了,然后注销: 再次尝试...勾上 “虚拟机平台” 然后点击确定: 应用完需要重启一下: 重启后点击启动安卓子系统应用(安装好后点击固定到开始屏幕的): 在打开的设置界面,再次点击文件栏的弹出按钮,显示正在启动子系统: 原来真的一个文件管理应用啊...,ES 文件浏览器还是打不开。

3K10

PE知识复习之PE的各种头属性解析

机器型号.表名了我们CPU执行的这个PE文件x86的还是x64的.有一系列宏标识....一个操作系统判断是什么系统运行的文件.一个当前PE的节个数.一个表明了扩展头的大小.一个表明了文件属性 总结: 一行零4个字节.其中前4个字节很重要.分别表示机器型号.以及节个数....fields. // WORD Magic;              //标志.表名了我们的PEx86还是x64 BYTE MajorLinkerVersion...windows CE除外.他0x00010000 DWORD SectionAlignment; //PE文件加载到内存中.的内存对齐.按照这个成员进行对齐 DWORD...sizeofHeaders / FileAlignment == 0    DWORD SubSystem           //表名PE文件是什么程序. 1驱动程序2窗口程序3控制台程序(

90540

2.2 PE结构:文件头详细解析

PE结构Windows系统下最常用的可执行文件格式,理解PE文件格式不仅可以理解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,DOS头PE文件开头的一个固定长度的结构体,这个结构体的大小为...DOS头包含了很多有用的信息,该信息可以让Windows操作系统使用正确的方式加载可执行文件。...PE文件格式的一部分,它包含了PE头和可选头的信息,用于描述PE文件的结构和属性。...DOS头包含了很多有用的信息,该信息可以让Windows操作系统使用正确的方式加载可执行文件。...,在某些时候可通过删除此标识已让PE文件缩小空间占用,总的来说DOS头PE文件中的一个重要的标志,它使得Windows操作系统能够在正确的位置开始加载可执行文件

25510

微软为WSL2提供原生Systemd 支持

简介 微软发布了一个新的 0.67.6 版本的适用于 Linux 的 Windows 子系统 ,其中包括期待已久的 systemd 支持。...升级WSL版本到0.67.6 Microsoft 最新发布的适用于 Linux 的 Windows 子系统版本 0.67.6 为 WSL 添加了 systemd 支持。...检查当前使用的 WSL 版本的一种简单方法运行: wsl --version 请记住,如果该命令失败,则您使用的 Windows 内版本的 WSL,并且必须升级到 Store 版本。...因此,打开服务管理控制台,突出显示“Windows Subsystem for Linux Preview”服务,然后从右键单击上下文菜单中选择“停止”。...幸运的,这很容易。 在发行版内部,使用您喜欢的文本编辑器打开 /etc 目录中的 wsl.conf文件。如果该文件不可用,只需创建一个新文件

92320

Windows 下 wsl2 的使用及问题记录

什么适用于 Linux 的 Windows 子系统?...并且另一个致命的问题 每次重启 wsl2 都会自动分配一个 ip 地址,连同宿主机的虚拟网段中的 ip也会改变,所以每次都需要获取并更改服务的地址, : 通过 docker 开启了一个服务并监听了一个端口...环境变量 在子系统中有一项特色,但也可以说是缺点,就是可以互相操作。在 linux 中可以使用 windows 中的应用来打开 linux 下的文件。比如在子系统中使用 explorer ....source ~/.zshrc 如果用的自带的 bash 则修改 bashrc ,修改完同样进行重新加载配置 建议 : 虽然 Windows 提供了这中互操的方式,比较方便.但是两个环境还是独立的好...的终端不好用从而从 linux 的终端中来操作 Windows文件,一个权限问题,一个就是环境变量问题,要知道那个才是重要的,虽然 终端不好用,但还是有其他的方式进行改善的,这个以后会说,主要基于

7K20
领券