| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2932 人关注过本帖, 2 人收藏
标题:在VC中直接写屏的方法
只看楼主 加入收藏
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:10 
在linux下的用户态可以操作所有寄存器,也就是说基本上可以操作又有硬件。
访问硬件就只有几种情况
    设备直接用地址线和数据线连接,包括一些网卡和显存等,操作系统将这个物理地址映射到虚拟地址,通过访问这个地址可以操作它。访问/dev/memory可以访问到所有物理地址。
    通过io地址空间访问,即io,out指令访问。操作系统会设置这个权限,iopl,ioperm可以修改相应权限。
    通过其他的控制芯片来访问,如pci总线上挂在一些控制芯片可以控制网卡。当然访问这个控制芯片的方法可以用上面的方法。

windows下应该也有相对应的api.
2015-07-09 11:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用TAAAAB在2015-7-9 11:21:51的发言:

收藏中,总有一天会看明白的

这些代码,在语法上并不难,也没什么高深的技术,无非是相关的系统知识,也就是我一向说的“专业”。调用Win32 API不属于C/C++语言的范畴,同样调用标准库也不是(其实标准库和Win32 API对于C/C++语言的作用是一样,都是外部写好的工具库)。之前有人感叹,说出来后,总是学各种各样的API,没有意思、没有激情,那是错误理解语言了。语言本身很简单,学它用不了多少时间,终身要学的,正是专业。举个例子,比如在这里,若不知道文本模式的颜色是怎么构造的,则无论你把C/C++语言学得多精深,都是不会,因为是不知道相关的专业知识,而不是不懂语言和编程。

还有人说,C只能在黑乎乎的控制台窗口中写程序,殊不知控制台下的文本程序也可以是多姿多彩的,凡是从DOS时代过来的人都知道那时候的程序,比如Turbo C的IDE,就是纯粹的文本模式界面,当时的程序员写程序,很多是按照那样的效果做的,有下拉菜单、响应热键、弹出式窗口、窗口也有阴影等等,都是以这里的写屏手段为基础。说C写不了好用的程序,是假的,自己有没有用心去做而已,也不一定非要用图形态的MFC编程才是(其实C++和面向对象编程,也是在DOS时代就兴起的,那个时候哪有什么Windows窗口,在DOS下也要面向对象)。不了解这些历史,很多荒唐的说法,是驳不胜驳,在这里只是顺便吐一下罢了,再遇到,我也不会说。

[ 本帖最后由 TonyDeng 于 2015-7-9 11:55 编辑 ]

授人以渔,不授人以鱼。
2015-07-09 11:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 13楼 wfoo
写驱动程序有特殊的授权,可以访问和控制硬件。我说的普通的程序不能那样做,保护模式的操作系统必须禁止这种动作,放滥了就是DOS那样的结果,各种死机。其实Linux那样的,只是假定程序员有自觉性,他们考虑系统内同时运行的各种程序有无冲突,与C的设计理念一致,即责任由程序员自己承担,而不是由系统主动保护。这样的理念,写程序当然好写,有最大的自由度,可是也同样有最大的风险。所谓Unix/Linux安全,其实是寄托在没多少人使用和懂这种系统上,像Windows那样普及,被研究的透,集中攻击的自然也多,苹果的iOS在其手机泛滥之后,也暴露出大量的漏洞和遭受破解,道理是一样的。至于开源,也是理想主义,源代码公开了,还有不清楚工作原理遭攻击的?无非是你的源代码太庞大和复杂,普通人和一般有心者不愿去看和研究全部源代码而已(Linux的维护,多年来就那么一两个人在承包,那个心脏漏洞,大家都拥有源代码,却是谁都没看出来,结果透露是只有一个人在维护的)。拿开源的代码做实际工作,你不加上开源之外的私货,敢出来用?开源迷信,也是早破早好,开源社区拥有最多目空一切的自大狂,也是事实,制造神话营造宗教氛围而已。

[ 本帖最后由 TonyDeng 于 2015-7-9 11:59 编辑 ]

授人以渔,不授人以鱼。
2015-07-09 11:54
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:10 
学习并膜拜

剑栈风樯各苦辛,别时冰雪到时春
2015-07-09 12:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
返回正题。在Windows控制台下,最好只处理ansi编码的中文,即GBK的,用其他的会遇到较多的麻烦,尤其是在按键的控制上(写文字编辑功能用)。所以,1楼的代码,用的是CHAR_INFO结构中的AsciiChar段,而不是UnicodeChar段,輸出的API也是用A版本。

授人以渔,不授人以鱼。
2015-07-09 12:52
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
回复 15楼 TonyDeng
windows下好像也有"\\Device\\PhysicalMemory",应该可以直接访问物理内存的。
linux下只要给我root权限基本上可以为所欲为(只要用普通程序使用mmap函数),windows应该也差不多。用linux的人比较少,都会有点基础,至少不至于日常使root用户(好像也有很多人使用sudo,但并没有配置sudo),但windows使用的人那么多,绝对有很多人使用的管理员帐号。这样即使软件被攻击了,也只是被获取了当前用户的权限。
所谓Unix/Linux安全,其实是寄托在没多少人使用和懂这种系统上   我不同意这句话,当然这是一个原因。开源系统也有漏洞,但是全球有很多人都能研究这份代码,经过这么多年漏洞也会越来越难出现,即使出现了很快就能有补丁。像iOS,windows是闭源的软件,研究的人多了,漏洞也多了,但是能打补丁的估计得是大公司,有些人都是利用这里漏洞谋求自己的利益,尽可能不公开漏洞。
2015-07-09 17:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 18楼 wfoo
那种是系统允许的,实际上通过系统调用(Windows是主动式系统),它放了一些权限出来,比如实际上可以在程序中绕过UAC提高权限而不用用户干预之类。看看在Windows编程中写串口通讯就知道了,以前在DOS,只要直接对串行端口in、out即可读写,但在Windows下要用Winsock协议才行,这虽然也算得上是操控硬件,但不是以前那种直接操控。我这里调用API输出,跟这个道理是一样的。操作系统给程序什么权,是既定的,无非是我们知道多少,却不可能超越限制,像以前那样直接读写磁盘扇区的,现在根本不可能。CIH病毒可以破坏硬件,就是因为Windows95/98/Me的内核是DOS或与DOS兼容,到了NT内核,这种病毒就无效了。

授人以渔,不授人以鱼。
2015-07-09 17:25
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
回复 19楼 TonyDeng
windows 我不熟,linux下root用户在用户态是可以操作所有硬件和物理地址的,也可以操作io地址空间。
/dev/memory的存在可以操作所有物理地址。ioperm的存在可以操作所有io,out指令。也就是在操作之前,调用mmap和ioperm系统调用,然后就可以直接操作硬件。这就是你说的系统自己开放出来的程序,也就是普通程序,虽然不是很好的方法,但是在性能方面却要比让内核来管理要高。只要弄清楚网卡对应的物理地址,对/dev/memory文件在这个偏移处的读写,可以完全控制网卡。有了ioperm,当然可以用io,out操作串口的读写。只是mmap,ioperm的调用成功系统必须验证调用者的权限,所有要root用户才能成功。
我想,windows下管理员用户应该也有这样的权限吧。
2015-07-09 18:33
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
以下是引用wfoo在2015-7-9 18:33:14的发言:

windows 我不熟,linux下root用户在用户态是可以操作所有硬件和物理地址的,也可以操作io地址空间。
/dev/memory的存在可以操作所有物理地址。ioperm的存在可以操作所有io,out指令。也就是在操作之前,调用mmap和ioperm系统调用,然后就可以直接操作硬件。这就是你说的系统自己开放出来的程序,也就是普通程序,虽然不是很好的方法,但是在性能方面却要比让内核来管理要高。只要弄清楚网卡对应的物理地址,对/dev/memory文件在这个偏移处的读写,可以完全控制网卡。有了ioperm,当然可以用io,out操作串口的读写。只是mmap,ioperm的调用成功系统必须验证调用者的权限,所有要root用户才能成功。
我想,windows下管理员用户应该也有这样的权限吧。

管理员好像没有 system有一定的权限

还是驱动级的权限大


[ 本帖最后由 zklhp 于 2015-7-9 18:44 编辑 ]
2015-07-09 18:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
Windows的System用户不可以直接操纵硬件,驱动程序可以。我们对虚拟设备操作,模拟操纵硬件,但是要被Windows接管的。事实上在Windows NT内核下,由于是主动式的系统,程序的所有机器码都是由操作系统在适当时候主动调用的,链接出的可执行文件与DOS下的完全不同(所以我一向说现在研究DOS下汇编和旧PE机制的是浪费时间精力),这里是片段式的,系统剪取一段执行,程序的执行时机不由自己控制。主动抢截式的系统机制,完全把握了用户程序的一切动作,对系统定义为危险的行为,不会给你执行的机会。Linux下的,我也不清楚,但它是分时系统,也应该是保护模式,原理上不会直接操纵硬件,也是对虚拟设备和虚拟地址操作,可能它的保护套超薄。

直接操纵硬件在多用户多任务环境中的危害,是访问冲突,硬件的响应总是单一的,不能同时响应,这一点就决定了用户独立操控硬件是不可行的。DOS是单用户实时系统,它可以,哪怕是多任务,也是单用户,勉强可以。

授人以渔,不授人以鱼。
2015-07-09 21:03
快速回复:在VC中直接写屏的方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027127 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved