病毒感染简写怎么写( 三 )


而病毒作为一个残废是享受不到这个待遇的 。因为你在把病毒的代码插入目标程序时没有把这些描述数据存放位置的数据结构信息也弄进去 。
它被插入到其他目标程序后就成了只有代码的残废儿童:(所以作为一个残废儿童,应当自力更生 。自己搜寻自己需要的API地址 。
目标程序文件就包含了我们需要的东西,需要自己去找 。目标程序文件只要还是win32程序,它的地址空间中就包含的有Kernel32.dll 。
如果找到了它,就能找到其他任何的东东 。第一步,搜寻kernel32.dll的基地址 。
当然了,整个地址空间有4GB,可供搜索的用户进程空间也有2GB 。在2GB中搜索,太吓人了 。
在程序被加载后,加载程序会调用程序的主线程的第一条指令的位置 。它使用的指令是CALL,就是说,程序还没执行,堆栈区里就有了一个返回地址了,这个返回地址指向的是加载程序,而加载程序是包含在KERNEL32.dll中的,顺着它向上找,就能找到kernel32.dll的基地址了 。
当然也不是一个字节一个字节的挨者找,而是一个页面一个页面地找 。因为win32下,代码或数据的开始位置总是页面单位(windows平台下为4kb)对齐的 。
Kernel32.dll是一个PE文件,按比较PE文件dos签名标志和PE签名标志的方法找 。另外还有个办法是通过SHE技术找 。
这是最好的办法了,前一个办法因为堆栈是动态的原因不稳定,一般只能将获取地址的代码块放在最开头,这个方法完全是与堆栈无关的,放在哪里执行都不会出错,如果你的病毒需要用一些远程线程之类的技术,最好用这个方法 。SHE结构,第一个成员指向下一个SEH结构,如果是最后一个那么它的值就是0ffffffffh 。
第二个成员指向异常处理函数,如果是最后一个SHE结构且没有指定的话,缺省的是函数地址 。当异常触发这个函数时就会弹出一个对话框,问你发不发送错误 。
【病毒感染简写怎么写】98下显示蓝屏 。这个函数是包含在KERNEL32.dll中的,只要取得它的地址向上找就能找到KERNEL32.dll的基地址了 。
在说SHE时总忘不了TEB,TEB是创建一个线程时分配的线程相关的数据结构,SHE只是它开头第一个数据结构体而已 。它还包含了其他许多重要的东西,TEB由FS段选择器指向,有兴趣的查查资料,这里篇幅原因就不再多说了 。
接着上面的,看看如何找函数地址 。先根据“下一个”SHE结构的值定位到最后一个SHE结构,这时取出she处理函数的地址,就是函数地址了,以页面为单位向上找就可以找到Kernel32.dll了/ 得到Kernel32.dll的基地址后,定位到它的导出表,找出GetProcAddress地址再利用GetProcAddress就能找到其他任何所需要的函数了 。
在搜索API时应该注意API的名字,API的名字实际的导出名字很有可能不是你调用时的名字,windows下很多API都有两个版本ANSI版和UNICODE版,ANSI版函数名后缀带个A,比如CreateWindowExA,,而UNICODE版的函数名带个W后缀,比如CreateWindowExW 。不过考虑到麻烦问题,现有的很多编译器都不让你写后缀,只是在编译的时候根据你程序是ANSI版的还是UNICODE版的自动改名字 。
Win2K以后的API函数都是Unicode 版本的,如果调用ANSI版本的函数,系统只是将函数中的字符串通过进程默认堆将其转换成Unicode字符串,再调用Unicode版的API 。Unicode是个发展方向,大家应该养成使用它的习惯而不是ANSI 。
(三)搜索文件、目录 主要是用FindFirstFile,FindNextFile,FindClose.这三个函数实现 。值得注意的是在用“*.*”搜索字符串时得到的是程序文件所在目录的所有文件和目录 。
而GetCurrentDirectory取得的是系统当前的目录 。后者是随时会随着用户的操作而改变的,前者只会随着目标程序文件的位置改变而改 。