如何编写病毒
那首先要对系统底层的东西比较熟悉,如果编网络病毒,还要对网络协议很了解。并且要精通至少一门编程语言,一般写病毒用asm(汇编语言)的比较多,用其他也可以,比如vbs(vb脚本语言)或者.bat的批处理,都可以。如果写unix 类系统的病毒用c语言的多一些。但汇编知识是写高级病毒必须的知识。
自己怎样用编程给计算机杀毒?
首先吧。得有个病毒库,知道病毒有那些。然后得使计算机自己扫描硬盘里的文件。然后跟病毒库里的对比。 单单靠编程只能制造病毒。
以下专业回答
病毒在理论上是不可判定的
病毒是一段程序,不同种类的病毒,它们的代码千差万别,任何人都不可能预测明天将会出现什么新病毒。但有一点可以肯定,只要出现了一项新的计算机技术,充分利用这项新技术编制的新病毒就一定离我们不远了。而由于软件种类极其丰富,且某些正常程序也使用了类似病毒的操作甚至借鉴了某些病毒的技术。所以,虽然有些人利用病毒某些共有的操作(如驻内存,改中断)这种共性,制作了声称可查所有病毒的程序,但这种方法对病毒进行检测势必会造成较多的误报情况,不够可靠,目前都只能作为辅助的手段配合使用,无法独立推广。
实际上,计算机病毒学鼻祖早在80年代初期就已经提出了计算机病毒的模型,证明只要延用现行的计算机体系,计算机病毒就存在“不可判定性”。杀病毒必须先搜集到病毒样本,使其成为已知病毒,然后剖析病毒,再将病毒传染的过程准确地颠倒过来,使被感染的计算机恢复原状。因此可以看出,一方面计算机病毒是不可灭绝的,另一方面病毒也并不可怕,世界上没有杀不掉的病毒。
常用的反病毒软件技术
特征码技术:基于对已知病毒分析、查解的反病毒技术
目前的大多数杀病毒软件采用的方法主要是特征码查毒方案与人工解毒并行,亦即在查病毒时采用特征码查毒,在杀病毒时采用人工编制解毒代码。
特征码查毒方案实际上是人工查毒经验的简单表述,它再现了人工辨识病毒的一般方法,采用了“同一病毒或同类病毒的某一部分代码相同”的原理,也就是说,如果病毒及其变种、变形病毒具有同一性,则可以对这种同一性进行描述,并通过对程序体与描述结果(亦即“特征码”)进行比较来查找病毒。而并非所有病毒都可以描述其特征码,很多病毒都是难以描述甚至无法用特征码进行描述。使用特征码技术需要实现一些补充功能,例如近来的压缩包、压缩可执行文件自动查杀技术。
但是,特征码查毒方案也具有极大的局限性。特征码的描述取决于人的主观因素,从长达数千字节的病毒体中撷取十余字节的病毒特征码,需要对病毒进行跟踪、反汇编以及其它分析,如果病毒本身具有反跟踪技术和变形、解码技术,那么跟踪和反汇编以获取特征码的情况将变得极其复杂。此外,要撷取一个病毒的特征码,必然要获取该病毒的样本,再由于对特征码的描述各个不同,特征码方法在国际上很难得到广域性支持。
怎么编程病毒?
搂主`你多C语言懂多少呀?通常只要在病毒代码的开始计算出delta offset,通过变址寻址的方式书写引用数据的汇编代码,即可保证病毒代码在运行时被正确重定位。假设ebp 包含了delta offset,使用如下变址寻址指令则可保证在运行时引用的数据地址是正确的:
;ebp 包含了delta offset 值
401000:
mov eax,dword ptr [ebp+0x402035]
......
402035:
db "hello world!",0
在书写源程序时可以采用符号来代替硬编码的地址值,上述的例子中给出的不过是编译器对符号进行地址替换后的结果。现在的问题就转换成如何获取delta offset的值了,显然:
call delta
delta:
pop ebp
sub ebp,offset delta
在运行时就动态计算出了delta offset 值,因为call要将其后的第一条指令的地址压入堆栈,因此pop ebp 执行完毕后ebp 中就是delta的运行时地址,减去delta的编译时地址“offset delta”就得到了delta offset 的值。除了用明显的call 指令外,还可以使用不那么明显的fstenv、fsave、fxsave、fnstenv等浮点环境保存指令进行,这些指令也都可以获取某条指令的运行时地址。以fnstenv 为例,该指令将最后执行的一条FPU 指令相关的协处理器的信息保存在指定的内存中fpu_addr:
fnop
call GetPhAddr
sub ebp,fpu_addr
GetPhAddr:
sub esp,16
fnstenv [esp-12]
pop ebp
add esp,12
ret
delta offset 也不一定非要放在ebp 中,只不过是ebp 作为栈帧指针一般过程都不将该寄存器用于其它用途,因此大部分病毒作者都习惯于将delta offset 保存在ebp 中,其实用其他寄存器也完全可以。
在优化过的病毒代码中并不经常直接使用上述直接计算delta offset 的代码,比如在Elkern开头写成了类似如下的代码:
call _start_ip
_start_ip:
pop ebp
;...
;使用
call [ebp+addrOpenProcess-_start_ip]
;...
addrOpenProcess dd 0
;而不是
call _start_ip
_start_ip:
pop ebp
sub ebp,_start_ip
call [ebp+addrOpenProcess]
为什么不采用第二种书写代码的方式?其原因在于尽管第一种格式在书写源码时显得比较罗嗦, 但是addrOpenProcess-_start_ip 是一个较小相对偏移值,一般不超过两个字节,因此生成的指令较短,而addrOpenProcess在32 Win32编译环境下一般是4 个字节的地址值,生成的指令也就较长。有时对病毒对大小要求很苛刻,更多时候也是为了显示其超俗的编程技巧,病毒作者大量采用这种优化,对这种优化原理感兴趣的读者请参阅Intel手册卷2中的指令格式说明。
API 函数地址的获取
在能够正确重定位之后,病毒就可以运行自己代码了。但是这还远远不够,要搜索文件、读写文件、进行进程枚举等操作总不能在有Win32 API 的情况下自己用汇编完全重新实现一套吧,那样的编码量过大而且兼容性很差。
Win9X/NT/2000/XP/2003系统都实现了同一套在各个不同的版本上都高度兼容的Win32 API,因此调用系统提供的Win32 API实现各种功能对病毒而言就是自然而然的事情了。所以接下来要解决的问题就是如何动态获取Win32 API的地址。最早的PE病毒采用的是预编码的方法,比如Windows 2000 中CreateFileA 的地址是0x7EE63260,那么就在病毒代码中使用call [7EE63260h]调用该API,但问题是不同的Windows 版本之间该API 的地址并不完全相同,使用该方法的病毒可能只能在Windows 2000的某个版本上运行。
因此病毒作者自然而然地回到PE结构上来探求解决方法,我们知道系统加载PE 文件的时候,可以将其引入的特定DLL 中函数的运行时地址填入PE的引入函数表中,那么系统是如何为PE引入表填入正确的函数地址的呢?答案是系统解析引入DLL 的导出函数表,然后根据名字或序号搜索到相应引出函数的的RVA(相对虚拟地址),然后再和模块在内存中的实际加载地址相加,就可以得到API 函数的运行时真正地址。在研究操作系统是如何实现动态PE文件链接的过程中,病毒作者找到了以下两种解决方案:
A)在感染PE 文件的时候,可以搜索宿主的函数引入表的相关地址,如果发现要使用的函数已经被引入,则将对该API 的调用指向该引入表函数地址,若未引入,则修改引入表增加该函数的引入表项,并将对该API 的调用指向新增加的引入函数地址。这样在宿主程序启动的时候,系统加载器已经把正确的API 函数地址填好了,病毒代码即可正确地直接调用该函数。
B)系统可以解析DLL 的导出表,自然病毒也可以通过这种手段从DLL 中获取所需要的API地址。要在运行时解析搜索DLL 的导出表,必须首先获取DLL 在内存中的真实加载地址,只有这样才能解析从PE 的头部信息中找到导出表的位置。应该首先解析哪个DLL 呢?我们知道Kernel32.DLL几乎在所有的Win32 进程中都要被加载,其中包含了大部分常用的API,特别是其中的LoadLibrary 和GetProcAddress 两个API可以获取任意DLL 中导出的任意函数,在迄今为止的所有Windows 平台上都是如此。只要获取了Kernel32.DLL在进程中加载的基址,然后解析Kernel32.DLL 的导出表获取常用的API 地址,如需要可进一步使用Kernel32.DLL 中的LoadLibrary 和GetProcAddress 两个API 更简单地获取任意其他DLL 中导出函数的地址并进行调用。
电脑病毒是怎样编出来的?(详细回答)
编程方面就是vb/c/汇编 (虽然这些学起来比较难,不过做出来的软件有很高的自由度) 如果是用写病毒的 如冰河 灰鸽子等(这些实际上不能算编病毒,只能说是应用这种病毒,比如用专门写灰鸽子的,就只能写出灰鸽子,有很大的局限性,不过比较适合新手) 除非你已经对电脑方面很专业了,否则不要乱动病毒,因为后果通常都很严重。没损到别人反而自己被自己的毒挂了。
如何让手机编程简单的病毒?
编程是一项非常重视实战的技能。如果仅仅只是阅读和听课,数个艾宾浩斯记忆曲线之后,你的脑海所剩知识将归零。学习编程需要经历 3 个步骤:阅读 READ→ 练习 PRACTICE → 创造BUILD。—— 事实上,这是学会任何技能都需要经历的 3 个步骤而编程尤甚。点击安装APP xue.cn 可以直接随时随地学习编程知识、编写运行代码。除此之外,附送10条过来之人的忠告。忠告 1:设备从来都不是学习的阻碍,仅凭手机也能学习编程。有人问,我没有电脑,仅有一台手机或者ipad,能学编程吗?能呀,当然能!现在的手机都是智能手机,等同于一部贴身移动的随身电脑;当然可以用手机来学习编程!文末我将推荐几款可以在手机上直接运行代码、学写代码的 APP 产品。忠告 2:从0开始不成问题,任何具备阅读能力的人都能学会编程。有人问,我是萌新,我是文科生,我毫无编程经验,我没有相关基础,我英语很烂……这样的我,还能学习编程吗?能呀,当然能!从0开始,并不是问题;事实上可以认为任何学习都是从 0 开始的。不足10岁的小学生能学编程,80多岁的老奶奶也能学会编程。困扰你的仅仅是,“我是否比其他人少了某些优势” 。在你不擅长的领域,你永远都比擅长的人少了一些优势。正因为你不懂不会、你想要掌握某项技能积累自己的优势,所以才决定学编程的呀!编程作为一项技能,是任何具备阅读能力的人都可以学会的。很多人也曾学过编程,只是绝大部分学而未用的知识,早已经还给书本或老师。关键并非“能不能学会”,而是“学习方法存在什么问题”。忠告 3:不要做搜刮囤积资料的松鼠,囤再多知识也不能变成你的技能。决定学习编程后,很多人开始到处搜刮学习资料:哪里有合适的书籍、视频、文章、专栏、回答、电子书、付费课程……我还需要装哪些app或者软件……然后通通下载、收藏、购买、安装、付钱……搜刮和囤积能带来满足感,你的大脑正在欺骗你自己,囤积让你觉得自己的学习取得了关键进展。冰冷的事实是,你所囤积的学习资料,永远都不属于你,永远都无法转变为你的技能。它们仅仅是冰冷的字节或交出去的智商税。请直奔主题 —— 立即读一个编程的知识点,立即运行和改写代码,立即写下自己的第一行代码说“Hello world!”。把知识输入自己的大脑才是获取技能的真正开端。忠告4:并不存在完美的学习计划,做好心理建设比什么都重要。如果你曾为学编程做计划:今天读几页,明天搞定某个知识点,后天刷几道题等——计划越细致,落实越困难,真正的收获,恐怕是挫败感。对于绝大多数人来说,代码的世界是崭新的世界,全然未知的世界。面对未知世界,怎么可能提前预想设定出一个能被100%执行到位的学习计划呢?抛开学习计划吧。有做学习计划的精力,不妨做足心理建设,反复回答自己几个问题:我为什么必须要学会编程?学会编程会给我带来哪些好处?列举足够多的动力,充分看到掌握编程后带给自己的好处,鼓足劲。刚决定学编程就立即做足心理建设是必要的, 但心理建设不能仅仅只做一次;相反,你需要反复给自己做心理建设,打鸡血,喝鸡汤,让自己有充分的动力去学编程。忠告 5:花再多钱也买不来技能,时间是你需要支付的最大成本。你愿意花几百元、几千元或者几万元购买编程课程,这并不代表你能花钱买来“编程”这门技能。决定你是否掌握编程技能的唯一关键是:是否给出足够的时间预算。时间精力是你需要为掌握编程技能而支付的唯一成本。短期没有足够的时间,那就长期;没有整块的时间,那么就碎片时间学。你需要付出足够的时间投入,反复阅读、练习、创造来锤炼自己的编程技能。当你有足够的动力来学会编程,那么就支付足够的时间预算,对自己的学习进程保持耐心。降低时间成本的方法有许多,但花钱无法代替你反复的阅读、练习与创造。着急花钱,还不如好好反思学习方法、刻意思考如何刻意练习自己的编程技能。有关编程的绝大多数知识都是免费的、开源的,与其花那么多钱,不如花点时间锤炼自己的搜索能力,训练自己的信息整合能力。互联网如此发达,你善于搜索,能得到非常多有价值的信息。忠告6:仅有阅读远远不够,实战才是学会编程的重点。编程是一项非常重视实战的技能。如果仅仅只是阅读和听课,数个艾宾浩斯记忆曲线之后,你的脑海所剩知识将归零。学习编程需要经历 3 个步骤:阅读 READ→ 练习 PRACTICE → 创造BUILD。—— 事实上,这是学会任何技能都需要经历的 3 个步骤而编程尤甚。阅读,让你获知一个编程知识点;练习,通过阅读代码,改写代码、做习题等方式,检查并巩固知识点的掌握程度;创造,综合运用所学,从无到有编写代码完成一个需求。你并不需要等到读完整本书,才开始练习。从你接触到第一个编程知识点,你就应该有意地重复“阅读 READ→ 练习 PRACTICE → 创造BUILD” 这个循环。哪怕你刚知道 print("Hello world!") ,你也应该立即运行一下这行代码,观察它的反应,然后自己默写一遍再运行试试看。忠告7:不要因为怕丢丑就不敢提问,勇于承认自己就是新手。刚起步就被某个难题困住。许多问题仅仅通过认真阅读、搜索或是认真检查,都能能解决。但依然有少数问题,你搞不定且搜不到答案。你不敢向人求助或提问,你在担心自己的问题太low,或者觉得那是自己应该能搞定的。无法准确地描述问题,是刚学编程的人,最常遇到的困难。既然问题都未能被准确描述,想要搜索得到答案,自然非常困难。某些时候需要勇于求助。有时答案来自同学的经验——那些同样从0开始学习该编程语言的同学;有时答案仅仅是有人帮你指出了关键词,更正了问题描述,让你能直接搜索命中答案。当你从0开始学编程,你在编程这件事上就是一个完完全全的新手。这个事实这并不会因为你的财富,你在其它领域的建树,你的身份地位而改变。真正强大的人敢于直面事实,并勇于解决问题,并善于整合资源——同学,也是你的学习资源。忠告8:伸手党固然可恶,教却是最好的学。确实有一些人不付出任何努力,一旦遇到困难或报错就立即向人求助。—— 伸手党是所有人深恶痛绝的一类人。但如上所述,编程新手遇到的问题和困难,却又花样百出,自己还暂无能力准确描述。即便你已经掌握某个编程知识点,但通过理解他人的问题,帮忙解决该困难,却是你的知识点练习场合。把你懂的知识教给不懂的人,你才是最大的受益者,因为你由此更深地理解了知识,巩固了技能。一个好的学习交流环境,不是直接告诉每个提问者那个答案是什么,而是教会每个提问者如何更好地提问。一个好的学习交流环境,每个人在群里提问前,都将在几个方向上自己作出尝试,自己先试着找到答案。自己实在无法解决的,才会向人求助的同时附上自己已经尝试的思路……忠告 9:学习并非没有终点,学而不用,学来做甚?学无止境,终有一天,你发现自己已经具备了一定的编程能力:你可以自己写代码解决一些常见的需求,即便自己无法从零写出,你也懂得如何通过搜索、阅读并整合网上已有的代码来构造自己的解决方案。但是否需要继续学习下去呢?学习永无止境。但编程技能如果仅仅持续地学,学而不用,拿来作甚?如果你刚开始学编程,请记得随时记录你想要用编程技能解决的一个个需求,并在自己具备一定能力时开始试着实现它们。适时停止涉猎“新知识点”,整合已有能力,运用它们解决一个实际的问题,才是更上一层楼的“学”,是更高级的学。忠告 10:工具只是工具,再好的产品也仅是为你所用,最重要的还是人。基于“阅读 READ→ 练习 PRACTICE → 创造BUILD”这个技能学习的方法论:满足“阅读”的途径非常多。实体书、电子书在线阅读、编程类文章等等,都有很多选择。比如:微信读书、微信公众号、知乎、甚至微博,B站,仅仅是看和听来得到编程知识,选择非常多。满足“练习”和“创造”的途径开始变少。最好能直接在手机上阅读代码,代码的显示非常清晰、语法也是准确的;甚至能改改代码,立即运行一下。同时满足“阅读”、“练习”和“创造”的产品,仅有 xue.cn唯此一家。虽然尚未发现更好的产品,但即便更好的产品有非常多,每一款产品都仅仅是你的工具,为你所用,帮助你获取编程技能。再好的手机端编程学习产品,也仅仅是你学习编程的工具。最重要的还是你这个人:你相信零基础也能学会编程,你具备强大的动力学习编程,你掌握编程学习的方法论,你持续重复着阅读、练习和创造的循环你有充足的实践:你对自己有足够的耐心并给出足够的时间预算,你善于整合资源:你善于通过搜索解决问题,更善于结识和融入同学之中,借用一切可借用的力量帮助自己习得编程技能。手机上一边阅读,一边运行代码上方视频:在xue.cn上能一边阅读知识,一边能运行代码、编写代码。