Win32下病毒设计入门
进入Win32时代,病毒设计面临新的挑战与机遇。本文将带领你入门Win32环境下的病毒设计,假设你已经对DOS环境下的病毒和386PM有一定的了解。
在Win32环境中,病毒的设计与其宿主程序紧密相连。感染任何病毒都需要有寄主,病毒代码被嵌入到寄主程序中(伴侣病毒除外)。类似于DOS的可执行文件,PE(Portable Executable)文件的结构也分为多个部分,其中包括代码映像的几个SECTION。这些SECTION在文件中会对齐到页边界(4K)。文件会加载在000h开始的空间,而第一个SECTION在401000h处,入口地址也是401000h。
对于由高级语言编写的程序,每个SECTION的长度可能不是4K的倍数,因此在SECTION的末尾会存在一段未用的空间。这段空间的大小可以通过计算Section的PHYSICAL SIZE和VIRTUAL SIZE的差值得到,其在文件中的起始位置可以通过PHYSICAL OFFSET找到。这些空闲空间为设计精良的病毒提供了良好的隐藏场所。
在Win32环境下设计病毒,首先要深入理解PE文件的结构。接下来,我们需要考虑病毒如何分配驻留所需内存。在DOS环境下,由于所有应用程序都映射在相同的线性地址空间里,使用一般的内存分配调用就足够了。但在Win32环境下,每个应用程序都有自己的线性地址空间,因此必须使用特殊函数来分配2GB以上的系统地址,如VxD服务_PageAllocate和kernel32的VxDCALL _PageReserve。
病毒驻留后需要通过截留FILE I/O操作来激活。这可以通过使用VXD服务的IFSMgr_Install-FileSystemAPIHook,或者截留VxDCall中的DOS Services callback来实现。在Win32环境下编写病毒并非易事,需要注意的几个关键点包括:Win32下的系统功能调用并非通过中断实现,而是由DLL中导出。获取API入口并不容易,但在同一版本的Windows下,同一核心函数的入口是固定的。这些固定入口通常存在于由Kernel32、gdi32、use等导出的函数中。
病毒设计者还需要关注其他方面的细节。例如,需要深入研究Win32 API以及系统调用,理解如何利用这些API来执行恶意操作。还需要熟悉Windows系统的内存管理和进程调度机制,以便更好地隐藏病毒代码并成功感染其他程序。
函数入口的秘密:病毒编程中的关键步骤
在病毒编程的世界中,函数入口的获取是至关重要的。一种方法是通过特定的汇编指令来得到所需函数的地址,并在运行时直接使用。这一技术的实现依赖于特定的系统调用和API函数。在Windows系统中,这种方法通常涉及调用GetModuleHandleA来获取模块句柄,然后通过GetProcAddress获取函数的入口地址。
一旦获得了函数入口,病毒就可以截留文件I/O操作。在Windows环境下,截留文件I/O操作主要有两种方法:使用VxDCallIFSMgr_InstallFileSystemHook和截留Kernel32.dll中的VxDCall函数。VxDCall函数是Kernel32.dll导出的一个关键函数,它能够调用DOS的INT 21中断,为病毒开发者提供了一个截留系统调用的机会。
当VxDCall被调用时,它会将特定的地址指向一个过程入口,这个过程会捕获所有的VxDCall调用。在这个过程中,病毒可以获取到诸如服务号、寄存器值等关键信息,从而实现对文件I/O操作的截留和控制。例如,当DOS的INT 21被调用时,eax将包含特定的值,如服务号等,病毒可以通过分析这些值来判断并拦截相应的文件操作。
这个过程的具体实现需要深入理解汇编语言和Windows系统的内部机制。病毒开发者需要熟悉各种系统调用的参数和返回值,以便正确地截留和处理文件I/O操作。病毒还需要处理其他系统调用和API函数,以确保其功能的正常运行。
病毒编程中的函数入口获取和文件I/O操作的截留是一项复杂而精细的任务。这需要开发者具备深厚的编程知识和系统理解,以及对汇编语言和底层机制的熟练掌握。尽管这些技术具有潜在的危险性,但了解这些技术对于理解计算机安全和系统编程的深层次原理具有重要意义。
请注意,本文仅用于教育目的,任何未经授权的病毒编程都是违法的,并可能导致严重的后果。建议读者遵守法律和道德准则,合理使用计算机技术和知识。在Windows环境下API入口的艺术与挑战
在Windows操作系统下编写病毒时,获取API的入口通常是一项充满挑战的任务。通常,可以直接使用的API都包含在DLL(动态链接库)中,而VXDCALL则需要在RING0环境下才能使用。传统的DOS INT 21服务也无法直接调用。
获取DLL中的API入口有两种主要方法:
1. 加载时获取:建立IMPORT TABLE,在程序加载时,Windows会根据IMPORT TABLE定位API的入口地址。这是常规应用程序常用的方法,但对于病毒来说,这种方式可能不太适用。
2. 运行时获取:通过GetModuleHandle和GetProcAddress函数获取API的入口。这需要知道GetModuleHandle和GetProcAddress的入口地址。在病毒环境中,这同样是一项艰巨的任务。除了将相关代码复制到病毒中,别无他法。还需要在这2GB的空间内寻找Krnl32.dll的位置。
关于Windows的内存映射,从00000000开始有一段是无效地址,用于捕获应用程序错误的指针。接下来的空间直到0x7FFFFFFF是应用程序的空间,而系统空间则从0X80000000开始,DLL和VXD都映射在这里。病毒需要在这2GB的空间内找到Krnl32.dll的位置。
值得注意的是,Windows程序通常对齐在64k的边界,并且遵循MZ文件头结构。通过PE HEADER可以得到DLL的EXPORT TABLE的入口。从这个标记可以找出所有的DLL,包括Krnl32.dll。在ADDRESS TABLE中可以找到任何一个API的入口。在这2GB空间中并非所有地址都是有效的。病毒必须小心处理这种情况,通常通过Hook Exception来忽略访问无效地址导致的异常。
还有一些重要的点需要注意:
1. Windows下载入的DLL在不同的进程中会映射到同一个地址。
2. DLL中导出的函数在export table中记录相对DLL Image Base的偏移。这个偏移如果发生改变,使用GetProcAddress得到的地址也会改变。这为病毒编写者提供了一种可能的策略,例如改变CreateProcess的地址指向自己的DLL中的函数,或者截获GetDlgItemText来记录密码。
3. Kernel32.DLL的Section Table在特定位置结束,真正的代码从另一地址开始,之间有一段未使用的空间,可以用来存放病毒代码。Kernel32.DLL的Image Base可以通过GetModuleHandleA获得。
4. 在任何版本的Windows中,三个基本的DLL(Kernel32.DLL,Use.DLL,GDI32.DLL)总是被加载,而且对于同一版本的Windows,它们的Image Base和导出函数的地址是固定的。病毒编写者可以利用这一点来直接获取这些API的地址。
编写Windows病毒是一项复杂且富有挑战性的任务,需要对操作系统、编程和计算机安全有深入的了解。在这个过程中,理解并操纵API入口是至关重要的一环。
seo排名培训
- Win32下病毒设计入门
- mpvue 单文件页面配置详解
- MySQL 的启动选项和系统变量实例详解
- nodejs前端自动化构建环境的搭建
- 提高Web性能的前端优化技巧总结
- AJAX+Servlet实现的数据处理显示功能示例
- vue 怎么创建组件及组件使用方法
- AngularJs自定义服务之实现签名和加密
- php中AES加密解密的例子小结
- javascript中offset、client、scroll的属性总结
- 完美实现八种js焦点轮播图(上篇)
- 关于.NET Attribute在数据校验中的应用教程
- Vue.js事件处理器与表单控件绑定详解
- SQL Server 2012 多表连接查询功能实例代码
- 使用VueRouter的addRoutes方法实现动态添加用户的权
- PHP无限分类(树形类)