首页
社区
课程
招聘
[讨论]PE中的SubSystem释疑
发表于: 2008-9-3 11:40 5839

[讨论]PE中的SubSystem释疑

2008-9-3 11:40
5839
hmmmmmmm
牛B的ccfer一句代码引咱去google了:WinMainCRTStartup

  操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。在VC下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用你自己编写的 main 函数;对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用你自己写的 WinMain 函数。
具体设置哪个入口点是由连接器的“/subsystem:”选项参数确定的,它告诉操作系统如何运行编译生成的.EXE文件。可以指定四种方式:“CONSOLE|WINDOWS|NATIVE|POSIX”如果这个选项参数的值为“WINDOWS”,则表示该应用程序运行时不需要控制台,有关连接器参数选项的详细说明请参考 MSDN 库

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )  // 设置连接器选项

这样设置后不会出现console了,这时也没怎注意,以后想要一样功能时候复制代码罢

可又看到了2回复

1.
楼上的方法果然没错,我把一个没有DOS窗口的程序,比如MFC编写的窗口程序用UltraEdit打开,然后把0x133~0x134的02改成03,然后保存,重新打开这个程序居然出现了黑窗口!为什么这个秘密之前没有人公开过呢? ( meteor135 发表于 2004-9-13 17:33:00)

2.
我有方法可以将一个原有的 DOS 程序变为看不见
先用 16 位编辑工具开了那个执行档
在位置 0x130~0x13f (通常是 0x13c 或 0x134) 的位置之间找个数值 03,将它变为02
原来就是这么简单喔 !! ( s000792003 发表于 2004-9-13 16:55:00)

hmmmmm
赶紧去查PE格式的NOTE

在接近的地址范围找到了
SubSystem

翻了下note,找到:
    * Subsystem(子系统)。此域是用来为可执行文件鉴定目标子系统的。在WINNT.H文件中,每个可能的子系统值都被列在了可选头(IMAGE_OPTIONAL_HEADER)结构之后。
指示可执行文件所需子系统 <     (用户界面类型)     >的一个枚举
值。在EXE文件中这个值比较重要。

哈,一拍脑瓜,以前看PE格式怎就傻傻的联想不到哦?

有时需要用控制台程序做一些没有用户交互的后台批量处理,不想显示命令行窗口。
那就在PE头里面改SubSystem

PELorder里面对SubSystem的读取是简单的判断数值
也就是只能一个PE只能是一种SubSystem。只要比较下这个位的数值就可以知道界面是怎么回事了

常见的有:
IMAGE_SUBSYSTEM_WINDOWS_GUI
//使用标准的win UI
IMAGE_SUBSYSTEM_NATIVE
//不需要子系统
IMAGE_SUBSYSTEM_WINDOWS_CUI
//使用控制台UI。设置了这位后,此程序运行时操作系统会为给创建个控制台并提供stdin、stdout和stderr对象

     具体的数值是:
#define IMAGE_SUBSYSTEM_UNKNOWN                0

// Image doesn't require a subsystem.

#define IMAGE_SUBSYSTEM_NATIVE                      1

// Image runs in the Windows GUI subsystem.

#define IMAGE_SUBSYSTEM_WINDOWS_GUI            2

// Image runs in the Windows character subsystem.

#define IMAGE_SUBSYSTEM_WINDOWS_CUI            3

// image runs in the OS/2 character subsystem.

#define IMAGE_SUBSYSTEM_OS2_CUI                  5

// image runs in the Posix character subsystem.

#define IMAGE_SUBSYSTEM_POSIX_CUI                   7

// image is a native Win9x driver.

#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS        8

// Image runs in the Windows CE subsystem.

#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9

最后骂萎软一句,什么玩意这是。
SubSystem,居然是指的UI...

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 305
活跃值: (36)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2


最后骂萎软一句,什么玩意这是。
SubSystem,居然是指的UI...


子系统(CONSOLE|WINDOWS|NATIVE|POSIX),就是靠 UI 表现出来的哦
2008-9-3 13:20
0
雪    币: 242
活跃值: (418)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
3
hmmmm,以前一直以为子系统不同指的是内核和用户层之间那层不一样的..
没有想过特指UI.....
2008-9-3 16:56
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
SubSystem什么的都是无所谓的,只要CODE能跑起来,要GUI CUI还是NATIVE,随便转换
限制的多半是自己的大脑而已
2008-9-3 22:19
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
如果将/subsystem这个连接参数去掉,那么连接器就会按照你给出的main函数来确定是那一个subsystem
2008-9-4 23:37
0
游客
登录 | 注册 方可回帖
返回
//