如果运算结果与/etc/shadow所存储的加密后的口令相同,则口令被猜出来。 步骤5:用c语言编写实现口令检查的程序 关键部分的代码如下:
通过读取/etc/shadow的每一行,获得一个关于用户的数据结构,存放在pwd中。
char saltstr[21]; //存放种子,最多是20个字节 bzero(saltstr,sizeof(saltstr));//将变了全部清0
strncpy(saltstr,pwd->pw_passwd,20);
//将salt取出,最多20个字节,以其中$作为边界
cp = crypt (guess, saltstr); //调用crypt加密函数
if (strcmp (cp, pwd -> pw_passwd)) //与口令文件中存储的信息比较 return (0); //若不一致则返回
printf (\
pwd -> pw_name, guess); //找到口令,显示口令
步骤6:编译程序
gcc –o passchk pass.c –lcrypt
其中-o选项指定编译后的可执行文件名,-l选项表示使用crypt函数库
步骤7:执行口令检查程序
./passchk –P myshadow –w words –p
其中passchk是可执行文件名,myshadow是口令文件,如果没有-P选项,则缺省使用Linux系统的/etc/shadow文件,words是存放弱口令的口令字典文件,选项-p表示将破解后的口令输出。
实验5
目的:练习Gtk+编程和gcc工具的使用。
需要的知识:C/C++语言的基本技能、第12章gcc的使用与开发、第13章Gtk+图形程序设计;
题目:日志的查询统计是系统管理的一项重要任务。Linux系统的日志以文本文件的形式存在,使用Gtk+编写一个图形界面的系统日志管理器(针对日志文件/var/log/messages*),它可以列出系统当前的日志个数(/var/log/message, /var/log/message.1, /var/log/message.2,……共多少个),对指定的日志文件可以查询哪些条目含有(include)指定信息(比如含有“succeed”的条目),哪些不含有(exclude)指定信息。
图5-1是一个示例程序的效果图:
? 数字1为一个标签,显示日志文件的数量;
? 显示succeed的单行文本框用来输入包含的指定信息; ? 显示kernel的单行文本框用来输入不包含的指定信息;
? 点击标签为“/var/log/messages”的按钮后,可以选择日志文件; ? 点击标签为“View”的按钮后,可以根据输入的条件查看日志内容; 下面的多行文本框用来显示日志内容。
图5-1程序效果图
程序目录结构如图 5- 1所示:
Util.h,Util.cpp core/ LogRecord,LogRecord.cpp LogContent,LogContent.cpp 当前目录./ widgets/ widget.h,widget.cpp main.cpp 图 5- 1程序目录结构图
其中:
? 文件main.cpp:为程序的主函数所在文件,通过对其它文件的调用启动和结
束程序;
? 目录core:其中的文件分为三组,每一组的一个.h文件和一个.cpp文件共同
定义了一个类,其中的类名和对应的文件名相同。目录core下定义的类实现了与界面无关的大部分功能。包括:检索日志文件个数、检索和根据条件过滤日志内容等作用。
? 目录widgets:包括两个文件,实现程序界面,并和目录core下的类交互,
利用图形界面接收用户的输入和显示程序的运行结果。 实现步骤:
1) 根据目录结构创建目录和文件;
为了方便组织程序代码,可以将本实验的代码放到单独的目录下。因此,先建立一个目录作为项目的根目录,本例中根目录命名为:ViewLogGtk。
? 在当前工作目录下,建立项目根目录:mkdir ViewLogGtk ? 进入根目录:cd ViewLogGtk
? 创建空白主程序文件:touch main.cpp ? 创建目录core:mkdir core
? 创建目录widgets:mkdir widgets ? 进入目录core:cd core
? 创建目录core下的空白程序文件: touch Util.h touch Util.cpp
touch LogRecord.h touch LogRecord.cpp touch LogContent.h touch LogContent.cpp
? 进入目录widgets:cd ../widgets
? 创建目录widgets下的空白程序文件: touch widget.h touch widget.cpp ? 目录文件创建完毕。
2) 编辑并实现代码文件:这里仅给出关键部分的代码。 Util.h定义了类Util:
Util.h 1 #ifndef UTIL_H 2 #define UTIL_H 3 class Util{ 4 public: 5 static int queryFileCount(const char* dir,const char* keyword); 6 }; 7 #endif 类Util中只定义了一个静态的方法:queryFileCount()用来查询指定目录下指定类型的文件个数。其中方法的第一个参数为指定查询文件的目录,第二个参数为指定文件名中包含的字符串。对于本例,第一参数固定的传入字符串“/var/log/”,第二个参数固定的传入字符串“message”,即查询目录/var/log/下文件名中包含message的文件。
LogRecord.h 1 #ifndef LOGRECORD_H 2 #define LOGRECORD_H 3 #include 5 #include\6 using namespace std; class LogContent { private: string contains; //记录中需要出现的关键字 string notcontains; //记录中不能出现的关键字 string file_name; //记录文件名 list
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新医药卫生LINUX实验指导书新 (2)全文阅读和word下载服务。
相关推荐: