首先声明,因为害怕被删帖,我肯定不会展示正确完整病毒代码,但是会介绍可行的学习方法。
网上有很多关于介绍PE病毒编写的帖子,但基本上都是分析源码FunLove和《计算机病毒分析与对抗》中PE病毒的代码翻版。事实上这两个代码是用于原理展示,前者根本通不过编译,后者编译后并不能正确运行,虽然有部分帖子对其做了修改,受到正统汇编教材代码的影响,导致其修改方法是错误的。
关于病毒编写充满了各种各样的迷信和谬论,因此在学习的过程中,我走了不少弯路,让我来一一说明:
误区1:PE病毒一定要用汇编来写,其生成文件小,效率高,病毒最好小于4KB
实际上,从DOS时代的文件型病毒开始,就有相当多的著名文件型病毒使用C、Pascal编写,到了windows时代,PE病毒的编写成员又加入了VB、dephi等重要角色。用这些高级语言开发病毒的优势相当明显,开发快,升级快,调试方便,Bug少,有时能跨平台。
如今病毒短小,再也不是汇编的优势,现在百G磁盘是常态,磁盘缺少几百MB不会引起用户的注意,大一点病毒文件反而增大了安全分析人员的分析难度。
但是还是有相当多的病毒编写技巧是汇编所独有的,不过本人十分懒惰并且汇编优化功底欠佳,可是偷懒的方法我是有的,我先用VC的写出初始代码,设置为Release,然后用它自带的调试器反汇编,copy到Radasm上,再进行手工修改,这样用汇编写的代码就成了。
误区2:DOS病毒毫无参考价值,FunLove代码是最好的入门教材
相当长的一段时间,我也秉持这种看法。然而我对PE病毒的顿悟,却完全来自DOS病毒的灵感,才写出我的第一个病毒代码。事实上,现在的PE病毒除了网络方面,各种技术的思想基本都是源自DOS病毒,只是技术上的另一种实现。
DOS病毒也不是都有用,比如引导区病毒的扇区引导方面就没什么参考价值,但作为早期病毒,它的很多其他思想至今仍在应用。
误区3:win32汇编与16位汇编有很大不同,可以直接学习win32汇编,16位汇编没什么价值
也许在其他地方,这是是正确的,虽然中断很少应用(不是不用,内核代码依然可用),但是像Radasm这样很好支持.if .while invoke 的高级宏汇编的编译,可我还是很少用它们,跳转、call、这两门功课不能回避。很多病毒独有的汇编技巧,是.if .while 所不能表达的
误区4:网上帖子PE代码的常见错误,建立(.data?)段或向(.code)段写入数据
虽然建立(.data?)段也不是不可以,但是建立(.data?)后,重定位技术单靠简单(call delt |delt: pop ebp)是不可能成功的,因为它不在.code里,还得建立单独的寻址表,感染时,还得将其写如.idata节里,重定位自然与.code里不一样,反正挺复杂,写多节感染PE病毒时可以试一试。
.code是只读的,虽然可以改为可写,但是杀毒软件可是不会轻易放过它的。在.code嵌入常量是可以,变量还是用sub esp,xxx申请堆栈吧
误区5:用汇编写病毒应该使用Tasm,大牛们都用它们
这个误解来自于DOS病毒的书籍,1989年,TASM早在1.0版本就有了对80386处理器指令的完全支持(MASM要到5.0版本才支持80386指令),Tasm4.0版是编写DOS程序使用比较广泛。它与Masm又比较大的差异,但Tasm5.0已经全面兼容Masm
目前,Tasm已经停止更新,而Masm随Visual Studio不断更新。
如果分要我推崇某个编译器,那么Nasm是个不错的选择,原因如下:
1.免费
2.使用Intel汇编格式
3.各个平台都有这个软件,学Masm的人写跨平台程序的首选
另外有人说fasm很好,我从未接触过,所以没有发言权
未完待续