首页
社区
课程
招聘
[旧帖] [求助]一个重定位的基础问题 0.00雪花
发表于: 2014-7-9 11:21 1167

[旧帖] [求助]一个重定位的基础问题 0.00雪花

王cb 活跃值
11
2014-7-9 11:21
1167
_NewEntry:是写入感染目标pe文件的新加节点的位置,为什么只从_NewEntry:为写入偏移量写入,再这之前还会加上;getkernelapi里面的那些函数也添加到写入pe文件的代码里是不是用了call        @F重定位就会把重定位的代码写到感染目标pe文件的新加节点里面
                @@:
_NewEntry:
;********************************************************************
; 重定位并获取一些 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+szUser32]        ;获取User32.dll基址
                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
;********************************************************************
; 执行原来的文件
;********************************************************************
_ToOldEntry:
                db        0e9h        ;0e9h是jmp xxxxxxxx的机器码
_dwOldEntry:
                dd        ?        ;用来填入原来的入口地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
APPEND_CODE_END        equ        this byte

;
;getkernelapi
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 错误 Handler
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SEHHandler        proc        C _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext

                pushad
                mov        esi,_lpExceptionRecord
                mov        edi,_lpContext
                assume        esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
                mov        eax,_lpSEH
                push        [eax + 0ch]
                pop        [edi].regEbp
                push        [eax + 8]
                pop        [edi].regEip
                push        eax
                pop        [edi].regEsp
                assume        esi:nothing,edi:nothing
                popad
                mov        eax,ExceptionContinueExecution
                ret

_SEHHandler        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在内存中扫描 Kernel32.dll 的基址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetKernelBase        proc        _dwKernelRet
                local        @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
;********************************************************************
; 查找 Kernel32.dll 的基地址
;********************************************************************
                mov        edi,_dwKernelRet
                and        edi,0ffff0000h
                .while        TRUE
                        .if        word ptr [edi] == IMAGE_DOS_SIGNATURE
                                mov        esi,edi
                                add        esi,[esi+003ch]
                                .if word ptr [esi] == IMAGE_NT_SIGNATURE
                                        mov        @dwReturn,edi
                                        .break
                                .endif
                        .endif
                        _PageError:
                        sub        edi,010000h
                        .break        .if edi < 070000000h
                .endw
                pop        fs:[0]
                add        esp,0ch
                popad
                mov        eax,@dwReturn
                ret

_GetKernelBase        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 从内存中模块的导出表中获取某个 API 的入口地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetApi                proc        _hModule,_lpszApi
                local        @dwReturn,@dwStringLength

                pushad
                mov        @dwReturn,0
;********************************************************************
; 重定位
;********************************************************************
                call        @F
                @@:
                pop        ebx
                sub        ebx,offset @B
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
                assume        fs:nothing
                push        ebp
                lea        eax,[ebx + offset _Error]
                push        eax
                lea        eax,[ebx + offset _SEHHandler]
                push        eax
                push        fs:[0]
                mov        fs:[0],esp
;********************************************************************
; 计算 API 字符串的长度(带尾部的0)
;********************************************************************
                mov        edi,_lpszApi
                mov        ecx,-1
                xor        al,al
                cld
                repnz        scasb
                mov        ecx,edi
                sub        ecx,_lpszApi
                mov        @dwStringLength,ecx
;********************************************************************
; 从 PE 文件头的数据目录获取导出表地址
;********************************************************************
                mov        esi,_hModule
                add        esi,[esi + 3ch]
                assume        esi:ptr IMAGE_NT_HEADERS
                mov        esi,[esi].OptionalHeader.DataDirectory.VirtualAddress
                add        esi,_hModule
                assume        esi:ptr IMAGE_EXPORT_DIRECTORY
;********************************************************************
; 查找符合名称的导出函数名
;********************************************************************
                mov        ebx,[esi].AddressOfNames
                add        ebx,_hModule
                xor        edx,edx
                .repeat
                        push        esi
                        mov        edi,[ebx]
                        add        edi,_hModule
                        mov        esi,_lpszApi
                        mov        ecx,@dwStringLength
                        repz        cmpsb
                        .if        ZERO?
                                pop        esi
                                jmp        @F
                        .endif
                        pop        esi
                        add        ebx,4
                        inc        edx
                .until        edx >=        [esi].NumberOfNames
                jmp        _Error
@@:
;********************************************************************
; API名称索引 --> 序号索引 --> 地址索引
;********************************************************************
                sub        ebx,[esi].AddressOfNames
                sub        ebx,_hModule
                shr        ebx,1
                add        ebx,[esi].AddressOfNameOrdinals
                add        ebx,_hModule
                movzx        eax,word ptr [ebx]
                shl        eax,2
                add        eax,[esi].AddressOfFunctions
                add        eax,_hModule
;********************************************************************
; 从地址表得到导出函数地址
;********************************************************************
                mov        eax,[eax]
                add        eax,_hModule
                mov        @dwReturn,eax
_Error:
                pop        fs:[0]
                add        esp,0ch
                assume        esi:nothing
                popad
                mov        eax,@dwReturn
                ret

_GetApi                endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

[课程]Android-CTF解题方法汇总!

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