第三章 网络安全编程基础 3 吴献彩.

Slides:



Advertisements
Similar presentations
软件开发技术基础 第 3 章 操作系统及程序设计 讲授教师:卫颜俊. 主 要 内 容 主 要 内 容 操作系统及其功能 进程管理应用程序设计 内存管理应用程序设计 设备与文件管理应用程序设计 人机接口管理应用程序设计.
Advertisements

C语言程序设计 主讲教师 :张群燕 电话:
授课教师:江星玲 1.
UI(用户界面)集训班 Illustrator 高级班.
Oracle数据库 Oracle 子程序.
吉林大学远程教育课件 Windows A P I编 程 (第四十五讲) 主讲人 : 翟慧杰 学 时:48.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
计算机基础知识 丁家营镇九年制学校 徐中先.
Using C++ The Weird Way Something about c++11 & OOP tricks
第二讲 搭建Java Web开发环境 主讲人:孙娜
第4讲 Windows编程基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
第八章 菜单设计 §8.1 Visual FoxPro 系统菜单 §8.2 为自己的程序添加菜单 §8.3 创建快捷菜单.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序
第1章 Windows应用程序框架的 创建与消息处理
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
走进编程 程序的顺序结构(二).
辅导课程六.
第3章 Windows 应用程序基础 2018/12/6 第2讲 Windows 应用程序基础 VC++面向对象与可视化程序设计.
网络游戏开发语言基础 ——Windows程序设计
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第4章 MFC编程 4.1 MFC概述 4.2 MFC和Win CObject类 4.4 消息映射的实现
Windows 7 的系统设置.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
程序设计工具实习 Software Program Tool
版权所有 复制必究 第 6 章 MFC原理与方法.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第二章 登录UNIX操作系统.
C语言程序设计 主讲教师:陆幼利.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
第1章 c++概述 1.1 C++语言的简史及特点 1.2 简单的C++程序 1.3 C++语言的基本组成
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
项目二:HTML语言基础.
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
iSIGHT 基本培训 使用 Excel的栅栏问题
C++程序设计 吉林大学计算机科学与技术(软件)学院.
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
LOGIX500软件入门 西安华光信息技术有限公司 2008年7月11日.
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
挑戰C++程式語言 ──第9章 函數.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 消息的接收 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Python 环境搭建 基于Anaconda和VSCode.
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
_01自己实现简单的消息处理框架模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
实验六、COM类型病毒分析实验 实验开发教师: 刘乃琦 谌黔燕.
Presentation transcript:

第三章 网络安全编程基础 3 吴献彩

内容提要 ◎ 网络安全编程主要涉及的是系统编程,目前主要采用C和C++语言 ◎ 详细说明在网络安全领域如何使用C,C++语言实现Socket编程、注册表编程、定时器编程、驻留程序编程和多线程编程

网络安全编程概述 从理论上说,任何一门语言可以在任何一个操作系统上编程,C语言可以在Windows下编程,同样也可以在Linux下编程。 编程是一项比较综合的工作,除了熟练使用编程工具以外,还要了解系统本身的内部工作机理和编程语言。

Windows内部机制 Windows是一个“基于事件的,消息驱动的”操作系统。在Windows下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就会触发一个相应的“事件”。 系统每次检测到一个事件时,就会给程序发送一个“消息”,从而使程序可以处理该事件。 每次检测到一个用户事件,程序就对该事件做出响应,处理完以后,再等待下一个事件的发生。

八个基本概念 与Windows系统密切相关的八个基本概念分别是: 窗口、程序、进程、线程 消息、事件、句柄、API与SDK。

1、窗口 窗口是Windows本身以及Windows 环境下的应用程序的基本界面单位,但是很多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫窗口。 其实窗口的概念很广,例如按钮和对话框等也是窗口哦,只不过是一种特殊的窗口罢了。

2、程序 通常说的程序都是指一个能让计算机识别的文件 接触得最多的是以exe或者com作为扩展名的文件。

3、进程 进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。 一个以exe作为扩展名的文件,在没有被执行的时候称之为应用程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行了。 当关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。 进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。

4、线程 线程是进程的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一个堆栈。 进程本来就具有动态的含义,是通过线程来体现的。

5、消息 消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息 鼠标被移动会产生WM_MOUSEMOVE消息,鼠标左键被按下会产生WM_LBUTTONDOWN的消息,鼠标右键按下便产生WM_RBUTTONDOWN消息等等。

事件 句柄: 6、事件 从字面意思就可以明白它的含义,如在程序运行的过程中改变窗口的大小或者移动窗口等,都会触发相应的“事件”,从而调用相关的事件处理函数。 7、句柄: 单单一个“柄”字便可以解释它的意思了,句柄是一个指针,通过句柄就可以控制该句柄指向的对象。编写程序总是要和各种句柄打交道的,句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。

8、API与SDK API是英文Application Programming Interface 的缩写,意思是“应用程序接口”,泛指系统为应用程序提供的一系列函数接口。 在编程的时候可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了。 SDK是英文Software Development Kit的缩写,意思是“软件开发工具包”,微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等等。

学习Windows下编程 学习语言,选择语言和工具是第一步,而且是非常重要的一步工作,目前的编程语言那么多,有C、C++、C#、Java和汇编语言等等。 虽然有很多语言,只要精通一门就够了。从实用的角度来讲,C/C++是最好的选择,而微软公司的Visual C++和Insprise公司(原Borland公司)的C++ Builder是其相应开发工具的两大主流。

开发工具 在开发工具上,选择比较流行的VC++6.0,而且最好是英文版本,主界面如图3-2所示。

学习编程需要经历三大步 学习编程需要经历三大步:一、读程序;二、写程序;三、积累功能代码段。 1、读程序 在没有阅读过一份完整的源代码之前,别指望能写出有多好的程序!读程序必须具备一定的语言基础知识,基础知识主要是指语法知识,最起码要能读懂程序的每一行意思。有没有程序的设计思想,在这个时期并不重要,只要具备一定的语法基础就可以了。 学一门语言并不需要刻意去记条条框框的语法,看代码的时候,遇到了不明白的地方再去查相关的资料,补充基础知识再配合源程序的思路,这时的理解才是最深刻的。 2、写程序 刚开始写程序,不要奢望一下子写出很出色的程序来,“万丈高楼平底起”,编程贵在动手,只要动手去写就可以了。此外,还要依照自身的能力循序渐进地写,开始的时候写一点功能简单的、篇幅短小的代码,力求简洁、完整,然后在此基础上进行扩充,一点点的添加功能。 3、积累功能代码 积累非常的重要,将平时自己写的和自己已经读通的程序分类保存起来,建一个属于自己的代码库,需要相关功能的时候,就到代码库中找相关的代码。这样既提高编码的效率又提高了正确率。

选择编程工具 目前流行两大语法体系:Basic语系和C语系。同一个语系下语言的基本语法是一样。两大语系如图3-3所示。 C语系中,目前两大语言如日中天:C++和Java。C++适宜做系统软件的开发、Java更适宜做网络应用开发。 虽然VC++.NET已经面世很久了,但是C++的开发工具目前主流依然是VC++6.0和C++ Builder6.0。 Java流行的开发工具比较多,比如:IBM公司的Visual Age和Websphere Studio,Insprise公司JBuilder等等。

VC++6.0 VC++是基于C/C++的集成开发工具,目前最常用的版本是VC++6.0。VC++有一套集成开发工具,其中包括各种编辑器、编译工具、集成调试器等等。在编写程序的过程中,各种操作都可以通过单击相应的菜单完成。

新建的是一个控制台程序 可以看到许多工程类型,这里新建的是一个控制台程序,选择“Win32 Console Application”,选择工程存放的路径,然后输入工程名“proj3_1”,然后点击按钮“OK”。出现的界面如图3-5所示。 在图3-5的界面下选择创建工程的模板,选择空模板“An empty project”,点击按钮“Finish”,出现工程总结窗口,如图3-6所示。

编程工具的使用 案例名称:编程工具的使用 程序名称:proj3_1.cpp #include <iostream.h>   #include <iostream.h> void main() { cout <<"Hello C++"<<endl; }

编程工具的使用 程序proj3_1.cpp代码包括三行 第一行:“#include <iostream.h>”意思是引入C++的基本输入输出函数库,在C语言中引入的是“stdio.h”库。在iostream.h文件中定义了cout的功能是输出,endl的功能是回车换行。 第二行:“void main()”,main()函数是C/C++的主函数,void表示该函数没有返回值。 第四行:“cout <<"Hello C++"<<endl;”,“cout<<”功能是向屏幕输出。

C语言发展的四个阶段 C语言经过不断的发展,在编程体系中可以将其分成四个阶段。 1、面向过程的C语言。 2、面向对象的C++语言。 3、SDK编程。 4、MFC编程(Microsoft Foundation Class:微软基类库)。

面向过程的C语言 C语言功能非常强大,Linux/Unix操作系统就是用C语言写的, C语言直接调用操作系统提供的API函数可以编写非常前大的程序。 C和C++的最主要区别是:C语言中没有类的概念,C++在C的语法基础上引入了类(Class),所以C++和C的语法是基本相同的。面向过程编程,最基本的程序用C语言编写如proj3_2.cpp所示。 案例名称:使用C语言编程 程序名称:proj3_2.cpp   #include <stdio.h> main() { printf("Hello DOS\n"); }

案例3-1 读取命令行参数 main函数是程序的主函数,程序执行的时候先从main函数开始。 该函数可以带参数,第一个参数是int型的,第二个参数是字符指针,具体使用方法如proj3_3.cpp所示。 案例名称:读取命令行参数 程序名称:proj3_3.cpp   #include <stdio.h> int main(int argc, char *argv[ ]) { int i; for (i = 1; i < argc; i++) printf("%s\n", argv[i]); } return 0;

面向对象的C++语言 面向对象程序设计语言可以将一些变量和函数封装到类(Class)中,当变量被类封装后,称之为属性或者数据成员,当函数被类封装后,称之为方法或者成员函数。 定义好的一个类,然后定义一个类的实例,这个实例就叫做对象,在C++中可以用类定义对象,使用方法如程序proj3_4.cpp所示。

在C++中使用类 案例名称:在C++中使用类 程序名称:proj3_4.cpp #include <iostream.h>   #include <iostream.h> class person { public: int heart; char *name; int run() //定义成员函数run() heart=heart+20; return heart; } }; void main() int iRunStop; person ZhangSan; ZhangSan.name = "张三"; ZhangSan.heart = 72; cout<<"姓名:"<<ZhangSan.name <<endl; cout<<"跑步前心跳"<<ZhangSan.heart<<endl; //run()为对象的方法 iRunStop = ZhangSan.run(); cout<<"跑步后心跳"<<iRunStop<<endl;

SDK编程 C库提供了许多函数,可以直接拿来使用。比如利用C库提供的DeleteFile函数来删除一个文件,如程序proj3_6.cpp所示。 案例名称:调用C库函数 程序名称:proj3_6.cpp   #include <stdio.h> #include <windows.h> int main() { DeleteFile("C:\\test.txt"); printf("删除成功\n"); return 0; }

编写窗口应用程序 案例名称:编写对话框 程序名称:proj3_7.cpp #include <windows.h>   #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox (NULL, TEXT ("Hello, Windows!"), TEXT ("HelloMsg"), MB_OK) ; return 0 ; }

编写窗口应用程序 参数一:hInstance 是当前实例的句柄。句柄是windows编程极其重要的概念。它是一个整数,用于标识程序、窗口和资源等。在这里hInstance表示应用程序本身。 参数二:hPrevInstance总是为NULL,在Windows早期版本中,当多次同时运行同一个程序时,系统会创建该程序的多个“实例”,同一程序的所有实例共享代码和内存。程序需要检查hPrevInstance来判断自身的其他实例是否正在运行,以便从已经存在的实例中获取数据。在32位版本中,统一程序运行方式改变了,不在需要了! 参数三:lpCmdLine是运行程序的命令行。用户可以单击”开始”菜单中的”运行“选项,然后输入命令来运行一个程序,并且可以指定运行程序所需的参数,这里的命令由lpCmdLine传入。 参数四:nCmdShow用于指定程序窗口最初的显示模式,可以正常显示,也可以在初始化就最大化或者最小化。

利用SDK函数创建窗口 #include <windows.h> WNDCLASS wc; HWND h_wnd; MSG msg; /* 消息处理函数wndProc的声明*/ long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM); /* winMain 函数的声明*/ int PASCAL WinMain(HINSTANCE h_CurInstance,HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show) { /*初始化wndclass结构变量*/ wc.lpfnWndProc =WindowProc; wc.hInstance =h_CurInstance; wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszClassName ="TheMainClass"; /* 注册WndClass结构变量*/ RegisterClass(&wc); /* 创建窗口*/ h_wnd=CreateWindow("TheMainClass","Our first Window", WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0); /* 显示窗口*/ ShowWindow(h_wnd,SW_SHOWMAXIMIZED); /*消息循环*/ while(GetMessage(&msg,NULL,0,0)) DispatchMessage(&msg); return (msg.wParam ); }   /* 定义消息处理函数*/ long WINAPI WindowProc(HWND h_wnd,UINT WinMsg,WPARAM w_param,LPARAM l_param) if(WinMsg==WM_DESTROY) PostQuitMessage(0); return DefWindowProc(h_wnd,WinMsg,w_param,l_param);

MFC编程 SDK的功能非常强大,需要记很多的函数,当面向对象编程成为主流的时候,微软将SDK的函数分类进行封装,这样就诞生了MFC(Microsoft Foundation Class)。 MFC程序的最基本的程序骨架如proj3_9.cpp所示。

MFC编程 #include<afxwin.h> class sample:public CFrameWnd { public: Create(NULL,"My Window"); MessageBox("My Window","CFrame constructor"); } };   class App:public CWinApp BOOL InitInstance(); BOOL ExitInstance(); //InitInstance函数的定义// BOOL App ::InitInstance() MessageBox(0,"My Window","InitInstance", MB_OK|MB_ICONASTERISK); sample *obj; obj=new sample; m_pMainWnd=obj; obj->ShowWindow(SW_SHOWMAXIMIZED); return TRUE; //ExitInstance函数定义 BOOL App::ExitInstance() MessageBox(0,"My Window","ExitInstance", MB_OK|MB_ICONHAND); //创建应用程序对象 App appobject;

网络安全编程 网络安全基础编程技术主要包括6个方面: Socket编程 注册表编程 文件系统编程 定时器编程 驻留程序编程 多线程编程。

Socket编程 谈网络安全编程离开网络编程就会大失其味,凡是基于网络应用的程序都离不开Socket。 使用Winsock提供的API函数是最基本的网络编程技术,程序proj3_11.cpp利用Socket获得本机的IP地址和机器名。

Socket编程 案例名称:使用Socket得到IP地址 程序名称:proj3_11.cpp   #include <winsock.h> #include <stdio.h> void CheckIP(void) //CheckIP函数,用于获取本机IP地址 { WORD wVersionRequested;//WORD类型变量,用于存放Winsock版本的值 WSADATA wsaData; char name[255];//用于存放主机名 PHOSTENT hostinfo; wVersionRequested = MAKEWORD( 2, 0 ); //调用MAKEWORD()函数获得Winsock的版本,用于加载Winsock库 if ( WSAStartup( wVersionRequested, &wsaData ) == 0 ) //加载Winsock库,如果WSAStartup()函数的返回值为0,说明加载成功 if( gethostname ( name, sizeof(name)) == 0) //判断是否成功的将本地主机名存放入由name参数指定的缓冲区中 if((hostinfo = gethostbyname(name)) != NULL) //如果获得主机名成功的话,调用inet_ntoa()函数取得IP地址 LPCSTR ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list); printf("本机的IP地址是:%s\n",ip);//输出IP地址 printf("本机的名称是:%s\n",name); } WSACleanup( );//卸载Winsock库,并释放所有资源 int main() CheckIP();//调用CheckIP()函数获得并输出IP地址 return 0;

注册表编程 注册表在计算机中由键名和键值组成,注册表中存储了Window操作系统的所有配置。黑客90%以上对Windows的攻击手段都离不开读写注册表。 在运行窗口中输入“regedit”命令可以进入注册表,注册表的界面如图3-37所示。

注册表编程 注册表的句柄可以由调用RegOpenKeyEx()和RegCreateKeyEx()函数得到的,通过函数RegQueryValueEx()可以查询注册表某一项的值 通过函数RegSetValueEx()可以设置注册表某一项的值。RegCreateKeyEx()函数和RegSetValueEx()函数的使用方法如程序proj3_12.cpp所示。

操作注册表 #include <stdio.h> #include <windows.h> main() {   main() { HKEY hKey1; DWORD dwDisposition; LONG lRetCode; //创建 lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\IniFileMapping\\WebSecurity", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey1, &dwDisposition); //如果创建失败,显示出错信息 if (lRetCode != ERROR_SUCCESS){ printf ("Error in creating WebSecurity key\n"); return (0) ; } //设置第一个键值 lRetCode = RegSetValueEx ( hKey1, "Hack_Name", 0, REG_SZ, (byte*)"sixage", 100); //设置第二个键值 "Hack_Hobby", (byte*)"Running", if (lRetCode != ERROR_SUCCESS) { printf ( "Error in setting Section1 value\n"); printf("注册表编写成功!\n"); return(0);

判断是否中了“冰河” 中了“冰河”的计算机注册表都将被修改了,修改了扩展名为txt的文件的打开方式,在注册表中txt文件的打开方式定义在HKEY_CLASSES_ROOT主键下的“txtfile\shell\open\command”中,如图3-40所示。

判断是否中了“冰河” 案例名称:判断是否中了“冰河” 程序名称:proj3_13.cpp #include <stdio.h>   #include <stdio.h> #include <windows.h> main() { HKEY hKEY; LPCTSTR data_Set = "txtfile\\shell\\open\\command"; long ret0 = (RegOpenKeyEx(HKEY_CLASSES_ROOT, data_Set, 0, KEY_READ,&hKEY)); if(ret0 != ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行 return 0; } //查询有关的数据 LPBYTE owner_Get = new BYTE[80]; DWORD type_1 = REG_EXPAND_SZ ; DWORD cbData_1 = 80; long ret1=RegQueryValueEx(hKEY, NULL, NULL, &type_1, owner_Get, &cbData_1); if(ret1!=ERROR_SUCCESS) if(strcmp((const char *)owner_Get,"%systemroot%\\system32\\notepad.exe %1") == 0) printf("没有中冰河"); else printf("可能中了冰河"); printf("\n");

案例3-6 更改登录用户名 当用户登录系统以后,注册表中就会自动记下用户名,下次登录时再把登录名显示出来,如图3-42所示。

案例3-6 更改登录用户名 当非法入侵计算机以后,同样会留下非法登录的用户名,所以需要将用户名修改会原来的值。 该用户名记录在注册表的HKEY_LOCAL_MACHINE主键下的SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon子键中,键的名称是:DefaultUserName,如图3-43所示。

更改系统登录用户 案例名称:更改系统登录用户 程序名称:proj3_14.cpp #include <stdio.h>   #include <stdio.h> #include <windows.h> main() { HKEY hKey1; LONG lRetCode; lRetCode = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", 0, KEY_WRITE, &hKey1 ); if (lRetCode != ERROR_SUCCESS){ printf ("Error in creating appname.ini key\n"); return (0) ; } lRetCode = RegSetValueEx ( hKey1, "DefaultUserName", 0, REG_SZ, (byte*)"Hacker_sixage", 20); if (lRetCode != ERROR_SUCCESS) { printf ( "Error in setting Section1 value\n"); printf("已经将登录名该成Hacker_sixage"); return(0);

文件系统编程 案例名称:添加系统用户 程序名称:proj3_15.cpp #include <stdio.h> 文件系统编程非常的重要,可以在DOS命令行下执行的操作都可以使用程序实现。 在DOS命令行下使用命令“net user Hacker /add”添加一个用户,同样可以在程序中实现,如程序proj3_15.cpp所示。 案例名称:添加系统用户 程序名称:proj3_15.cpp   #include <stdio.h> #include <windows.h> main() { char * szCMD = "net user Hacker /add"; BOOL bSuccess; PROCESS_INFORMATION piProcInfo; STARTUPINFO Info; Info.cb=sizeof(STARTUPINFO); Info.lpReserved=NULL; Info.lpDesktop=NULL; Info.lpTitle=NULL; Info.cbReserved2=0; Info.lpReserved2=NULL; bSuccess=CreateProcess(NULL,szCMD,NULL,NULL,false,NULL,NULL,NULL,&Info,&piProcInfo); if(!bSuccess) printf("创建进程失败!"); return 1; }

文件拷贝和移动 案例名称:文件拷贝和移动 程序名称:proj3_16.cpp #include <stdio.h>   #include <stdio.h> #include <windows.h> main() { CopyFile("C:\\File1.txt","C:\\File2.txt",TRUE); MoveFile("C:\\File1.txt","C:\\File3.txt"); return 1; }

系统时间 案例名称:系统时间 程序名称:proj3_17.cpp #include <windows.h>   #include <windows.h> #include <stdio.h> main() { SYSTEMTIME sysTime; GetLocalTime(&sysTime); printf("%d年%d月%d日%d时%d分%d秒\n", sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour, sysTime.wMinute,sysTime.wSecond); return 1; }

定时器编程 著名的“CIH病毒”每年定时发作,其中需要利用定时器来控制程序的执行。定时器程序分成两大类, 一类是循环执行 另一类是根据条件只执行一次。在程序中加载定时器,如程序proj3_18所示。

定时器编程 案例名称:定时器编程 程序名称:proj3_18.cpp #include <windows.h>   #include <windows.h> WNDCLASS wc; HWND h_wnd; MSG msg; /* 消息处理函数wndProc的声明*/ long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM); /* winMain 函数的声明*/ int PASCAL WinMain(HINSTANCE h_CurInstance, HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show) { /*初始化wndclass结构变量*/ wc.lpfnWndProc =WindowProc; wc.hInstance =h_CurInstance; wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszClassName ="TheMainClass"; /* 注册WndClass结构变量*/ RegisterClass(&wc); /* 创建窗口*/ h_wnd=CreateWindow("TheMainClass","Our first Window", WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0); /* 显示窗口*/ ShowWindow(h_wnd,SW_SHOWMAXIMIZED); /*消息循环*/ while(GetMessage(&msg,NULL,0,0)) DispatchMessage(&msg); return (msg.wParam ); } #define ID_TIMER 1

定时器编程 /* 定义消息处理函数*/ long WINAPI WindowProc(HWND h_wnd,UINT WinMsg, WPARAM w_param,LPARAM l_param) { static BOOL fFlipFlop = FALSE ; HBRUSH hBrush ; HDC hdc ; PAINTSTRUCT ps ; RECT rc ; switch (WinMsg) case WM_CREATE: SetTimer (h_wnd, ID_TIMER, 1000, NULL) ; return 0 ; case WM_TIMER : MessageBeep (-1) ; fFlipFlop = !fFlipFlop ; InvalidateRect (h_wnd, NULL, FALSE) ; case WM_PAINT : hdc = BeginPaint (h_wnd, &ps) ; GetClientRect (h_wnd, &rc) ; hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ; EndPaint (h_wnd, &ps) ; DeleteObject (hBrush) ; case WM_DESTROY : KillTimer (h_wnd, ID_TIMER) ; PostQuitMessage (0) ; } return DefWindowProc(h_wnd,WinMsg,w_param,l_param);

驻留程序编程 案例名称:内存驻留程序的编写 程序名称:proj3_19.cpp #include <windows.h>   #include <windows.h> WNDCLASS wc; HWND h_wnd; MSG msg; /* 消息处理函数wndProc的声明*/ long WINAPI WindowProc(HWND,UINT,WPARAM,LPARAM); /* winMain 函数的声明*/ int PASCAL WinMain(HINSTANCE h_CurInstance, HINSTANCE h_PrevInstance,LPSTR p_CmdLine,int m_Show) { /*初始化wndclass结构变量*/ wc.lpfnWndProc =WindowProc; wc.hInstance =h_CurInstance; wc.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszClassName ="TheMainClass"; /* 注册WndClass结构变量*/ RegisterClass(&wc); /* 创建窗口*/ h_wnd=CreateWindow("TheMainClass","Our first Window", WS_OVERLAPPEDWINDOW,0,0,400,500,0,0,h_CurInstance,0); /* 显示窗口*/ ShowWindow(h_wnd, SW_HIDE); /*消息循环*/ while(GetMessage(&msg,NULL,0,0)) DispatchMessage(&msg); return (msg.wParam ); }

驻留程序编程 #define ID_TIMER 1 /* 定义消息处理函数*/   /* 定义消息处理函数*/ long WINAPI WindowProc(HWND h_wnd,UINT WinMsg, WPARAM w_param,LPARAM l_param) { static BOOL fFlipFlop = FALSE ; HBRUSH hBrush ; HDC hdc ; PAINTSTRUCT ps ; RECT rc ; switch (WinMsg) case WM_CREATE: SetTimer (h_wnd, ID_TIMER, 1000, NULL) ; return 0 ; case WM_TIMER : MessageBeep (-1) ; fFlipFlop = !fFlipFlop ; InvalidateRect (h_wnd, NULL, FALSE) ; case WM_PAINT : hdc = BeginPaint (h_wnd, &ps) ; GetClientRect (h_wnd, &rc) ; hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ; EndPaint (h_wnd, &ps) ; DeleteObject (hBrush) ; case WM_DESTROY : KillTimer (h_wnd, ID_TIMER) ; PostQuitMessage (0) ; } return DefWindowProc(h_wnd,WinMsg,w_param,l_param);

案例3-7 “冰河”原型 第一种方法实现起来比较简单,注册表的自启动项的键值在“HKEY_LOCAL_MACHINE”主键下的“SOFTWARE\Microsoft\Windows\CurrentVersion \Run”子键中,如图3-51所示。

多线程编程 用多线程技术编程有两大优点: 1、提高CPU的利用率。由于多线程并发运行,用户在做一件事情的时候还可以做另外一件事。特别是在多个CPU的情况下,更可以充分地利用硬件资源的优势,将一个大任务分成几个任务,由不同的CPU来合作完成。 2、采用多线程技术,可以设置每个线程的优先级,调整工作的进度。 在实际开发过程中,一定要有一个主进程,其他线程可以共享该进程也可以独立运行,每个线程占用CPU的时间有限制,可以设置运行优先级别。

独立线程程序的编写 案例名称:独立线程程序的编写 程序名称:proj3_21.cpp #include <process.h>   #include <process.h> #include <stdlib.h> #include <stdio.h> int addem(int); int main(int argc, char *argv[]) { _beginthread((void (*)(void *))addem, 0, (void *)10); _beginthread((void (*)(void *))addem, 0, (void *)11); addem(12); return 0; } int addem(int count) int i; long sum; sum = 0; for (i=0; i<=count; ++i) { printf("The value of %d is %d\n", count, i); sum += i; printf("The sum is %d\n", sum);

多个线程共享参数 案例名称:多个线程共享参数 程序名称:proj3_22.cpp #include <process.h>   #include <process.h> #include <stdlib.h> #include <stdio.h> int addem(int); int x; //全局变量 int main(int argc, char *argv[]) { x=0; _beginthread((void (*)(void *))addem, 0, (void *)1); _beginthread((void (*)(void *))addem, 0, (void *)2); addem(3); return 0; } int addem(int index) while (x <= 50){ x = x+1; printf("%d: %d\n", index, x);

本章总结 本章需要重点掌握Windows操作系统的内部机制,理解C语言四个阶段编程的特点。 重点掌握网络安全编程领域的Socket编程、注册表编程、驻留程序的编程和多线程编程。

本章习题 一、选择题 1. ___________就是应用程序的执行实例(或称一个执行程序),是程序动态的描述。 A. 线程 B. 程序 C. 进程 D. 堆栈 2. 在main()函数中定义两个参数argc和argv,其中argc存储的是___________,argv数组存储___________。 A. 命令行参数的个数 B. 命令行程序名称 C. 命令行各个参数的值 D. 命令行变量 3. 凡是基于网络应用的程序都离不开___________。 A. Socket B. Winsock C.注册表 D. MFC编程 4. 由于___________并发运行,用户在做一件事情时还可以做另外一件事。特别是在多个CPU的情况下,可以更充分地利用硬件资源的优势。 A. 多进程 B. 多线程 C. 超线程 D. 超进程

本章习题 二、填空题 1.目前流行两大语法体系:___________和___________,同一个语系下语言的基本语法是一样的。 2. ___________是一个指针,可以控制指向的对象。 3. ___________中存储了Windows操作系统的所有配置。 4. 使用多线程技术编程有两大优点。(1)___________(2)___________。 5. 在___________文件中定义了cout的功能是输出,endl的功能是回车换行。 6. DOS命令行下使用命令“___________”添加一个用户Hacke,同样可以在程序中实现。

本章习题 三、简答题与程序设计题 1. 简述Windows操作系统的内部机制。 2. 简述学习Windows下编程的注意点。 3. 比较C语言4个发展阶段编程的特点。 4. 用程序说明MFC的事件处理机制。 5. 编写程序实现功能:清除“冰河”程序和文本文件的关联。(上机完成) 6. 编写程序实现功能:在每天夜里十二点,自动删除C盘下的File4.txt文件。(上机完成) 7. 编写程序实现功能:登录系统以后,自动执行一个程序,该程序将系统登录名改成Administrator。(上机完成) 8. 编写程序实现功能:当用户用鼠标双击一个文本文件时,自动删除该文件。(上机完成)