病毒程序是怎么写的( 二 )


如果找到了它,我们就能找到其他任何的东东 。第一步,搜寻kernel32.dll的基地址 。
当然了,整个地址空间有4GB,可供搜索的用户进程空间也有2GB 。在2GB中搜索,太吓人了 。
总不能在执行被感染的目标程序时,先让用户喝杯茶吧?或者斗斗地主?这里有两个技巧向大家介绍 。在程序被加载后,加载程序会调用程序的主线程的第一条指令的位置 。
它使用的指令是CALL,就是说,你程序还没执行,堆栈区里就有了一个返回地址了,这个返回地址指向的是加载程序,而加载程序是包含在KERNEL32.dll中的,我们顺着它向上找,就能找到kernel32.dll的基地址了 。当然也不是一个字节一个字节的挨者找,而是一个页面一个页面地找 。
因为win32下,代码或数据的开始位置总是页面单位(windows平台下为4kb)对齐的 。Kernel32.dll是一个PE文件,我们按比较PE文件dos签名标志和PE签名标志的方法找 。
另外还有个办法是通过SHE技术找 。这是最好的办法了,前一个办法因为堆栈是动态的原因不稳定,一般只能将获取地址的代码块放在最开头,这个方法完全是与堆栈无关的,放在哪里执行都不会出错,如果你的病毒需要用一些远程线程之类的技术,最好用这个方法 。
SHE结构,第一个成员指向下一个SEH结构,如果是最后一个那么它的值就是0ffffffffh 。第二个成员指向异常处理函数,如果是最后一个SHE结构且没有指定的话,缺省的是SetUnhandlederExceptionFilter函数地址 。
当异常触发这个函数时就会弹出一个对话框,问你发不发送错误 。98下显示蓝屏 。
这个函数是包含在KERNEL32.dll中的,只要取得它的地址向上找就能找到KERNEL32.dll的基地址了 。在说SHE时总忘不了TEB,TEB是创建一个线程时分配的线程相关的数据结构,SHE只是它开头第一个数据结构体而已 。
它还包含了其他许多重要的东西,TEB由FS段选择器指向,有兴趣的查查资料,这里篇幅原因就不再多说了 。接着上面的,看看如何找SetUnhanderExceptionFilter函数地址 。
先根据“下一个”SHE结构的值定位到最后一个SHE结构,这时取出she处理函数的地址,就是SetUnHandleredEceptionFilter函数地址了,以页面为单位向上找就可以找到Kernel32.dll了/ 得到Kernel32.dll的基地址后,定位到它的导出表,找出GetProcAddress地址再利用GetProcAddress就能找到其他任何所需要的函数了 。在搜索API时应该注意API的名 。
3. 第一个写出病毒程序的人是 电脑病毒的起源 你可知道,电脑病毒的概念来自一场游戏? 电脑病毒的概念其实源起相当早,在第一部商用电脑出现之前好几年时,电脑的先驱者冯·诺伊曼(John Von Neumann)在他的一篇论文《复杂自动装置的理论及组识的进行》里,已经勾勒出病毒程序的蓝图 。
不过在当时,绝大部分的电脑专家都无法想像会有这种能自我繁殖的程序 。1975年,美国科普作家约翰·布鲁勒尔(John Brunner)写了一本名为《震荡波骑士》(Shock Wave Rider)的书,该书第一次描写了在信息社会中,计算机作为正义和邪恶双方斗争的工具的故事,成为当年最佳畅销书之一 。
1977年夏天,托马斯·捷·瑞安(Thomas.J.Ryan)的科幻小说《P-1的春天》(The Adolescence of P-1)成为美国的畅销书,作者在这本书中描写了一种可以在计算机中互相传染的病毒,病毒最后控制了 7,000 台计算机,造成了一场灾难 。虚拟科幻小说世界中的东西,在几年后终于逐渐开始成为电脑使用者的噩梦 。
而差不多在同一时间,美国著名的AT&T贝尔实验室中,三个年轻人在工作之余,很无聊的玩起一种游戏:彼此撰写出能够吃掉别人程序的程序来互相作战 。这个叫做"磁芯大战"(core war)的游戏,进一步将电脑病毒"感染性"的概念体现出来 。