首页
社区
课程
招聘
[原创]菜鸟注释PEMaker6源代码(四)
发表于: 2007-9-25 23:16 8782

[原创]菜鸟注释PEMaker6源代码(四)

2007-9-25 23:16
8782

这是最后一篇了,最近被调去急诊科,三天一个夜班,头都大了,注释的很乱,连自己都搞晕了。
#include "stdafx.h"
#include "loader.h"
#include "itmaker.h"

#ifdef _DEBUG
#define DEBUG_NEW
#endif

__stdcall void DynLoader();
//---------------------------------------------------------
// Thanks FEUERRADER [AHTeam] for idea about using _emit 0!
//---------------------------------------------------------
// byte ptr        (1 bytes)
//定义一个字节
#define byte_type(x)            __asm _emit x
// word ptr        (2 bytes)
//低位放低字节
#define word_type(x)            byte_type((x>>(0*8))&0xFF)    byte_type((x>>(1*8))&0xFF)
// dword ptr    (4 bytes)
#define dword_type(x)            byte_type((x>>(0*8))&0xFF)    byte_type((x>>(1*8))&0xFF)    byte_type((x>>(2*8))&0xFF)    byte_type((x>>(3*8))&0xFF)
// dword64 ptr    (8 bytes)
#define dword64_type(x)            dword_type(x)    dword_type(x)
// dword64 ptr    (16 bytes)
#define dword128_type(x)        dword64_type(x)    dword64_type(x)
//---------------------------------------------------------
//定义字节
#define bb(x)                    __asm _emit x
#define db                        byte_type(0xCC)
#define __random_code1__        dword64_type(0X90909090) // Reserve for random code generation
//jmp
#define __jmp_api                byte_type(0xFF)    byte_type(0x25)

//----------------------------------------------------------------
__stdcall void DynLoader()
{
_asm
{
//----------------------------------
    dword_type(DYN_LOADER_START_MAGIC)
//----------------------------------
_main_0:
    pushad    // save the registers context in stack
    //重定向编码放EBP
    call _main_1
_main_1:
    pop ebp
    sub ebp,offset _main_1 // get base ebp
    //----------------------------------------------------
    //====================================================
    //---------------- support dll, ocx  -----------------
_support_dll_0:
    jmp _support_dll_1 // nop; nop; // in the secon time OEP
    jmp _support_dll_2
_support_dll_1:
    //定义在下面,就是那个类似t_DATA_1结构的东西
    test [ebp+_p_dwFileType],IMPORT_TABLE_OCX
    jz _no_dll_pe_file_0
        //esp怎么来的?
        mov eax,[esp+24h]// imagebase
        //AddressOfEntryPoint成员
        mov ebx,[esp+30h]// oep
        cmp eax,ebx
        ja _no_dll_pe_file_0
            cmp word ptr [eax],IMAGE_DOS_SIGNATURE
            jne _no_dll_pe_file_0
                //存入镜像地址
                mov [ebp+_p_dwImageBase],eax
//无DLL的PE文件?
_no_dll_pe_file_0:
    //----------------------------------------------------
    //====================================================
    mov eax,[ebp+_p_dwImageBase]
    add eax,[eax+03Ch]
    add eax,080h
    //获取导入表RVA
    mov ecx,[eax]    // image_nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
    //ecx为导入表地址
    add ecx,[ebp+_p_dwImageBase]
    add ecx,010h    // image_import_descriptor.FirstThunk
    //取FirstTHUNk值
    mov eax,[ecx]
    add eax,[ebp+_p_dwImageBase]
    mov ebx,[eax]
    //存入API地址
    mov [ebp+_p_LoadLibrary],ebx
    add eax,04h
    mov ebx,[eax]
    //存入API地址
    mov [ebp+_p_GetProcAddress],ebx
    //----------------------------------------------------
    //------- load library and build api call-jmp --------
    call _api_load
    //----------------------------------------------------

    push MB_OK | MB_ICONINFORMATION
    lea eax,[ebp+_p_szCaption]
    push eax
    lea eax,[ebp+_p_szText]
    push eax
    push NULL
    call _jmp_MessageBox
    // MessageBox(NULL, szText, szCaption, MB_OK | MB_ICONINFORMATION) ;

    //...
    //...
    //...

    // Place your code here ...

    //...
    //...
    //...

    //----------------------------------------------------
    //====================================================
    //----------- get write access for headers -----------
    mov edi,[ebp+_p_dwImageBase]
    add edi,[edi+03Ch]// edi -> IMAGE_NT_HEADERS
    // get write permission by VirtualProtect()
    lea eax,[ebp+_p_ptempbuffer]
    push eax
    push PAGE_READWRITE
    push [edi+0x54]//IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeaders
    push [ebp+_p_dwImageBase]
    call _jmp_VirtualProtect
    //VirtualProtect(dwImageBase,image_nt_header.OptionalHeader.SizeOfHeaders,PAGE_READWRITE,ptempbuffer);
    //----------------------------------------------------
    //----------------------------------------------------
    //--------------- import table fix up ----------------
    lea eax,[ebp+_p_szKERNEL32_r]
    push eax
    push [ebp+_p_dwImportVirtualAddress]
    push [ebp+_p_dwImageBase]
    //以上传递参数
    call _it_fixup_1

    //--------------- import table fix up ----------------
    //call _it_fixup
    //----------------------------------------------------
    //====================================================
    //---------------- support dll, ocx  1 ---------------
    //by set second way to oep and relocation table effect
    mov edi,[ebp+_p_dwImageBase]
    add edi,[edi+03Ch]// edi -> IMAGE_NT_HEADERS
    mov ax,word ptr [edi+016h]// edi -> image_nt_headers->FileHeader.Characteristics
    // .IF ((image_nt_headers->FileHeader.Characteristics&IMAGE_FILE_DLL) ==IMAGE_FILE_DLL)
    test ax,IMAGE_FILE_DLL
    jz _no_dll_pe_file_1
        //--------------- relocation fix up --------------
        call _reloc_fixup
        //------------------------------------------------
        mov ax,9090h
        mov word ptr [ebp+_support_dll_0],ax
    // .ENDIF
_no_dll_pe_file_1:
    //----------------------------------------------------
    //====================================================
_support_dll_2:
    //----------------------------------------------------
    //====================================================
    //--------- Prepare the SEH for OEP approach ---------
    mov eax,[ebp+_p_dwImageBase]
    add eax,[ebp+_p_dwOrgEntryPoint]
    mov [esp+10h],eax    // pStack.Ebx <- eax
    lea eax,[ebp+_except_handler1_OEP_Jump]
    mov [esp+1Ch],eax    // pStack.Eax <- eax
    popad    // restore the first registers context from stack
    //----------------------------------------------------
      // the structured exception handler (SEH) installation
    push eax
    xor  eax, eax
    push dword ptr fs:[0]        // NT_TIB32.ExceptionList
    mov fs:[0],esp    // NT_TIB32.ExceptionList <-ESP
    dword_type(0xCCCCCCCC)// raise a (int 3) exception
    //----------------------------------------------------
    //====================================================
//--------------------------------------------------------
//========================================================
//------------- t_size strlen(LPCTSTR lpStr) -------------
__strlen:
    push ebp
    mov ebp,esp
    push ecx
    push esi
    push ebx
    //取得参数
    mov esi,[ebp+08h]// -> destination
    mov ecx,255// -> length
    xor ebx,ebx
_strlenloop:
        lods byte ptr ds:[esi]
        cmp al,00h
        jz _endbufstrlen
        //ebx计数
        inc ebx
    loop _strlenloop
_endbufstrlen:
    mov eax,ebx
    //返回值在eax
    inc eax
    pop ebx
    pop esi
    pop ecx
    mov esp,ebp
    pop ebp
    ret
//--------------------------------------------------------
//========================================================
//------------------- fix up relocation ------------------
// I have stolen this reloc fix-up code from Morphine 2.7 !!
// so Thanks Holy_Father && Ratter/29A for it. (www.hxdef.org)
_reloc_fixup:
    mov eax,[ebp+_p_dwImageBase]
    //edx首地址
    mov edx,eax
    mov ebx,eax
    //ebx-->NT文件头
    add ebx,[ebx+3Ch] // edi -> IMAGE_NT_HEADERS
    //其实RVA等于FC
    mov ebx,[ebx+034h]// ebx ->image_nt_headers->OptionalHeader.ImageBase
    //有可能为0
    sub edx,ebx // edx -> reloc_correction
    je _reloc_fixup_end
    mov ebx,[ebp+_p_dwRelocationVirtualAddress]
    test ebx,ebx
    jz _reloc_fixup_end
    //ebx是RVA
    add ebx,eax
_reloc_fixup_block:
    //一个32位的“SizeOfBlock(块大小)”
    mov eax,[ebx+004h]            //ImageBaseRelocation.SizeOfBlock
    test eax,eax
    jz _reloc_fixup_end
    lea ecx,[eax-008h]            //ImageBaseRelocation.SizeOfBlock - sizeof(TImageBaseRelocation)
    //ecx为跟在后面的重定位的数目
    shr ecx,001h                //WORD((ImageBaseRelocation.SizeOfBlock - sizeof(TImageBaseRelocation)) / sizeof(Word))
    //edi为重定位数据开始地址
    lea edi,[ebx+008h]            //PImageBaseRelocation + sizeof(TImageBaseRelocation)
_reloc_fixup_do_entry:
        movzx eax,word ptr [edi]//Entry
        push edx
        mov edx,eax
        //高4位的重定位类型
        shr eax,00Ch            //Type = Entry >> 12

        mov esi,[ebp+_p_dwImageBase]//ImageBase
        //低12位的重定位位置
        and dx,00FFFh
        //得到计算后的偏移地址
        add esi,[ebx]            //ImageBase + ImageBaseRelocation.VirtualAddress
        //得到重定位数据的偏移地址
        add esi,edx                //ImageBase + ImageBaseRelocation.VirtualAddress+Entry & 0x0FFF
        pop edx
        //------------------------------
        //---- IMAGE_REL_BASED_HIGH 重定位的高16位必须被用于被偏移量所指向的那个16位的WORD单元,
        //此WORD是一个32位的DWORD的高位WORD----
_reloc_fixup_HIGH:
        //重定位类型
        dec eax
        jnz _reloc_fixup_LOW
            //edx重定位偏移
            mov eax,edx
            //取高字节
            shr eax,010h        //HIWORD(Delta)
            jmp _reloc_fixup_LOW_fixup
        //------------------------------
        //---- IMAGE_REL_BASED_LOW -----
_reloc_fixup_LOW:
            dec eax
        jnz _reloc_fixup_HIGHLOW
        movzx eax,dx            //LOWORD(Delta)
_reloc_fixup_LOW_fixup:
            //
            add word ptr [esi],ax
        jmp _reloc_fixup_next_entry
        //------------------------------
        //-- IMAGE_REL_BASED_HIGHLOW ---
_reloc_fixup_HIGHLOW:
            dec eax
        jnz _reloc_fixup_next_entry
        add [esi],edx
        //------------------------------
_reloc_fixup_next_entry:
        inc edi
        inc edi                        //Entry++
        loop _reloc_fixup_do_entry

_reloc_fixup_next_base:
    add ebx,[ebx+004h]                //ImageBaseRelocation + ImageBaseRelocation.SizeOfBlock
    jmp _reloc_fixup_block
_reloc_fixup_end:
    // clean relocation table
/*    mov eax,[ebp+_p_dwImageBase]
    add eax,[ebp+_p_dwRelocationVirtualAddress]
    lea edi,[eax]
    xor eax,eax
    add ecx,[ebp+_p_dwRelocationSize]
    rep stos byte  ptr [edi]*/

    ret
//--------------------------------------------------------
//========================================================
//--------------- 修复导入表 ----------------
/*
ebp+10h    [ebp+_p_szKERNEL32_r]
ebp+0ch    _p_dwImportVirtualAddress
ebp+08h    _p_dwImageBase
---------------------------------
ebp-04h        _p_dwNewITaddress
ebp-08h        _p_dwThunk
ebp-0ch        _p_dwHintName
ebp-10h        _p_dwLibraryName
ebp-14h        _p_dwAPIaddress
*/

_it_fixup_1:
    push ebp
    mov ebp,esp
    add esp,-14h
    push PAGE_READWRITE
    push MEM_COMMIT
    push 01D000h
    push 0
    call _jmp_VirtualAlloc
    //NewITaddress=VirtualAlloc(NULL, 0x01D000, MEM_COMMIT, PAGE_READWRITE);
    //存入地址
    mov [ebp-04h],eax
    mov ebx,[ebp+0ch]
    test ebx,ebx
    jz _it_fixup_1_end
    //esi:_p_dwImageBase
    mov esi,[ebp+08h]
    //导入表地址
    add ebx,esi                                    // dwImageBase + dwImportVirtualAddress
_it_fixup_1_get_lib_address_loop:
        //名称
        mov eax,[ebx+0ch]                        // image_import_descriptor.Name
        test eax,eax
        jz _it_fixup_1_end
        //FirstThunk RVA
        mov ecx,[ebx+10h]                        // image_import_descriptor.FirstThunk
        add ecx,esi
        //FirstThunk指向的RVA数组
        mov [ebp-08h],ecx                        // dwThunk
        mov ecx,[ebx]                            // image_import_descriptor.Characteristics
        //有些编译器会将此置0
        test ecx,ecx
        jnz _it_fixup_1_table
            // image_import_descriptor.FirstThunk
            mov ecx,[ebx+10h]
_it_fixup_1_table:
        //esi:_p_dwImageBase
        add ecx,esi
        mov [ebp-0ch],ecx  // dwHintName
        add eax,esi                                // image_import_descriptor.Name + dwImageBase = ModuleName
        push eax                                // lpLibFileName
        mov [ebp-10h],eax
        call _jmp_LoadLibrary                    // LoadLibrary(lpLibFileName);

        test eax,eax
        jz _it_fixup_1_end
        //edi:动态链接库句柄
        mov edi,eax
_it_fixup_1_get_proc_address_loop:
            //指向一个 IMAGE_THUNK_DATA 结构数组
            mov ecx,[ebp-0ch]            // dwHintName
            mov edx,[ecx]                        // image_thunk_data.Ordinal
            test edx,edx
            jz _it_fixup_1_next_module
            //以序数方式
            test edx,080000000h                    // .IF( import by ordinal )
            //对于每个数组元素,我们比对元素值是否等于IMAGE_ORDINAL_FLAG32。
            //如果该元素值的最高二进位为1,
            //那么函数是由序数引入的,可以从该值的低字节提取序数。
            jz _it_fixup_1_by_name
                //取出序数
                and edx,07FFFFFFFh                // get ordinal
                jmp _it_fixup_1_get_addr
_it_fixup_1_by_name:
            add edx,esi                            // image_thunk_data.Ordinal + dwImageBase = OrdinalName
            inc edx
            //取出API名称
            inc edx                                // OrdinalName.Name
_it_fixup_1_get_addr:
            push edx                            // lpProcName
            push edi                            // hModule
            call _jmp_GetProcAddress            // GetProcAddress(hModule, lpProcName);
            //获得API地址
            mov [ebp-14h],eax                    //_p_dwAPIaddress
            //================================================================
            //mov [ecx],eax//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            //hModule
            push edi
            // dwImageBase
            push esi
            //ebx=引入表地址
            push ebx

            mov ebx,[ebp-10h]
            push ebx
            push ebx
            //大写
            call _char_upper
            //esi=_p_dwLibraryName
            mov esi,[ebp-10h]
            mov edi,[ebp+010h]    // [ebp+_p_szKernel32]
_it_fixup_1_check_dll_redirected:
            push edi
            call __strlen
            add esp, 4

            mov ebx,eax
            mov ecx,eax
            push edi
            push esi
            //比较两个动态库字符串
            repe cmps //byte ptr [edi], byte ptr [esi]
            jz _it_fixup_1_do_normal_it_0
            pop esi
            pop edi
            //下一个
            add edi,ebx
            //是否结束
            cmp byte ptr [edi],0
            jnz _it_fixup_1_check_dll_redirected
                //_p_dwThunk
                mov ecx,[ebp-08h]
                //api地址
                mov eax,[ebp-014h]
                //FirstThunk指向的数组被填充为真正的函数地址
                mov [ecx],eax
                jmp _it_fixup_1_do_normal_it_1
_it_fixup_1_do_normal_it_0:
            //对应repe之前的push
                pop esi
                pop edi
                //新申请的内存空间
                mov edi,[ebp-04h]
                //插入JMP
                mov byte ptr [edi], 0e9h
                //API地址
                mov eax,[ebp-14h]
                //计算跳转偏移
                sub eax, edi
                sub eax,05h
                //插入偏移
                mov [edi+1],eax
                //0c8bh-->mov eax,eax,对齐
                mov word ptr [edi+05],0c8bh
                //THUNK
                mov ecx,[ebp-08h]
                //将原程序的THUNK指向我们的内存地址
                mov [ecx],edi
                //下一个位置
                add dword ptr [ebp-04h],07h
_it_fixup_1_do_normal_it_1:
            pop ebx
            pop esi
            pop edi
            //================================================================
            add dword ptr [ebp-08h],004h    // dwThunk => next dwThunk
            add dword ptr [ebp-0ch],004h// dwHintName => next dwHintName
        jmp _it_fixup_1_get_proc_address_loop
_it_fixup_1_next_module:
        add ebx,014h                            // sizeof(IMAGE_IMPORT_DESCRIPTOR)
    jmp _it_fixup_1_get_lib_address_loop
_it_fixup_1_end:
    mov esp,ebp
    pop ebp
    ret 0ch
//--------------------------------------------------------
//========================================================
//-- char_upper(LPCTSTR lpDestination, LPCTSTR lpSource )
_char_upper:
    push ebp
    mov ebp,esp
    push ecx
    push eax
    push esi
    push edi
    mov edi,dword ptr [ebp+08h]// -> Destination
    mov esi,dword ptr [ebp+0Ch]// -> Source
    mov ecx,255// -> Length
    xor eax,eax
__makeupperloop:
        lods byte ptr [esi]//ESI
        cmp al,00h
        jz endofbuffer
        cmp al,60h
        jc notinlowerfield
        cmp al,7bh
        jnc notinlowerfield
        sub al,20h
notinlowerfield:
        stos byte ptr [edi]//EDI
    loop __makeupperloop
endofbuffer:
    pop edi
    pop esi
    pop eax
    pop ecx
    pop ebp
    retn 08h
//--------------------------------------------------------
//========================================================
//------------- load necessary api functions -------------
//以下都是重定位之后的地址
_api_load:
    //取得_p_szKernel32字符串地址
    lea edi,[ebp+_p_szKernel32]
    //取得_p_GetModuleHandle的地址
    lea ebx,[ebp+_p_GetModuleHandle]
    //取得_jmp_GetModuleHandle地址
    lea ecx,[ebp+_jmp_GetModuleHandle]
    //取得_jmp_GetModuleFileName的地址?
    add ecx,02h
_api_get_lib_address_loop:
        //保存ECX
        push ecx
        push edi
        mov eax,offset _p_LoadLibrary
        //加载kernel32.dll
        call [ebp+eax]// LoadLibrary(lpLibFileName);
        //-------------------
        pop ecx
        //kernel32.dll模块地址
        mov esi,eax    // esi -> hModule
        //字符串长度
        push edi
        call __strlen
        //平衡堆栈,弹出参数
        add esp,04h
        //指向下一个字符串
        add edi,eax
_api_get_proc_address_loop:
            push ecx
            //edi=getmodulhanda
            push edi
            //esi=hmodule
            push esi
            mov eax,offset _p_GetProcAddress
            call [ebp+eax]// GetModuleHandle=GetProcAddress(hModule, lpProcName);
            //--------------------
            pop ecx
            //存入GetModuleHandle的实际地址
            mov [ebx],eax
            //注意看这里!!
            mov [ecx],ebx
            //下一个
            add ebx,04h
            //下一个
            add ecx,06h
            //下一个
            push edi
            call __strlen
            add esp,04h
            add edi,eax
            mov al,byte ptr [edi]
        test al,al
        //不为0继续循环
        jnz _api_get_proc_address_loop
        //edi地址加一
        inc edi
        mov al,byte ptr [edi]
    test al,al
    //不为0则载入user32.dll
    jnz _api_get_lib_address_loop
    ret
//----------------------------------------------------------
//--------------------------------------------------------
//========================================================
// -------- exception handler expression filter ----------
_except_handler1_OEP_Jump:
    push ebp
    mov ebp,esp
    mov eax,[ebp+010h]    // PCONTEXT: pContext <- eax
    //---------------
    push edi
    // restore original SEH
    mov edi,[eax+0C4h]    // pContext.Esp
    push dword ptr ds:[edi]
    pop dword ptr fs:[0]
    add dword ptr [eax+0C4h],8    // pContext.Esp

    // set the Eip to the OEP
    mov edi,[eax+0A4h] // edi <- pContext.Ebx
    mov [eax+0B8h],edi // pContext.Eip <- edi
    //
    pop edi
    //---------------
    mov eax, EXCEPTION_CONTINUE_SEARCH
    leave
    ret
//--------------------------------------------------------
//========================================================
    dword_type(DYN_LOADER_START_DATA1)
//0xcccccccc自填充----------------------------------
_p_dwFileType:                    dword_type(0xCCCCCCCC)
_p_dwImageBase:                    dword_type(0xCCCCCCCC)
_p_dwOrgEntryPoint:                dword_type(0xCCCCCCCC)
_p_dwImportVirtualAddress:        dword_type(0xCCCCCCCC)
_p_dwRelocationVirtualAddress:    dword_type(0xCCCCCCCC)
_p_dwRelocationSize:            dword_type(0xCCCCCCCC)
//----------------------------------
_tls_dwStartAddressOfRawData:    dword_type(0xCCCCCCCC)
_tls_dwEndAddressOfRawData:        dword_type(0xCCCCCCCC)
_tls_dwAddressOfIndex:            dword_type(0xCCCCCCCC)
_tls_dwAddressOfCallBacks:        dword_type(0xCCCCCCCC)
_tls_dwSizeOfZeroFill:            dword_type(0xCCCCCCCC)
_tls_dwCharacteristics:            dword_type(0xCCCCCCCC)
//----------------------------------
_p_szKernel32:                //db "Kernel32.dll",0,13
        db db db db db db db db db db db db db
_p_szGetModuleHandle:        //db "GetModuleHandleA",0,17
        db db db db db db db db db db db db db db db db db
_p_szVirtualProtect:        //db "VirtualProtect",0,15
        db db db db db db db db db db db db db db db
_p_szGetModuleFileName:    //db "GetModuleFileNameA",0,19
        db db db db    db db db db    db db db db db db db db db db db
_p_szCreateFile:            //db "CreateFileA",0,12
        db db db db db db db db db db db db
_p_szGlobalAlloc:            //db "GlobalAlloc",0,12
        db db db db db db db db db db db db
_p_szVirtualAlloc:            //db "VirtualAlloc",0,13
        db db db db db db db db db db db db db
_p_szLoadLibrary:            //db "LoadLibraryA",0,13
        db db db db db db db db db db db db db
_p_szGetProcAddress:        //db "GetProcAddress",0,15
        db db db db db db db db db db db db db db db
        byte_type(0)

_p_szUser32:                //db "User32.dll",0,11
        db db db db db db db db db db db
_p_szMessageBox:            //db "MessageBoxA",0,12
        db db db db db db db db db db db db
        byte_type(0)
        byte_type(0)
//----------------------------------
_p_LoadLibrary:                    dword_type(0xCCCCCCCC)
_p_GetProcAddress:                dword_type(0xCCCCCCCC)
_p_GetModuleHandle:
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)
                                dword_type(0xCCCCCCCC)

_jmp_GetModuleHandle:            __jmp_api    dword_type(0xCCCCCCCC)
_jmp_VirtualProtect:            __jmp_api    dword_type(0xCCCCCCCC)
_jmp_GetModuleFileName:            __jmp_api    dword_type(0xCCCCCCCC)
_jmp_CreateFile:                __jmp_api    dword_type(0xCCCCCCCC)
_jmp_GlobalAlloc:                __jmp_api    dword_type(0xCCCCCCCC)
_jmp_VirtualAlloc:                __jmp_api    dword_type(0xCCCCCCCC)
_jmp_LoadLibrary:                __jmp_api    dword_type(0xCCCCCCCC)
_jmp_GetProcAddress:            __jmp_api    dword_type(0xCCCCCCCC)

_jmp_MessageBox:                __jmp_api    dword_type(0xCCCCCCCC)
_p_szKERNEL32_r:
        //db "KERNEL32.DLL",0,13
        bb('K') bb('E') bb('R') bb('N') bb('E') bb('L') bb('3') bb('2') bb('.') bb('D') bb('L') bb('L') bb(0)
        //db "USER32.DLL",0,11
        bb('U') bb('S') bb('E') bb('R') bb('3') bb('2') bb('.') bb('D') bb('L') bb('L') bb(0)
        //db "GDI32.DLL",0,10
        bb('G') bb('D') bb('I') bb('3') bb('2') bb('.') bb('D') bb('L') bb('L') bb(0)
        //db "ADVAPI32.DLL",0,13
        bb('A') bb('D') bb('V') bb('A') bb('P') bb('I') bb('3') bb('2') bb('.') bb('D') bb('L') bb('L') bb(0)
        //db "SHELL32.DLL",0,12
        bb('S') bb('H') bb('E') bb('L') bb('L') bb('3') bb('2') bb('.') bb('D') bb('L') bb('L') bb(0)
        byte_type(0)
_p_szCaption:
bb('A') bb('s') bb('h') bb('k') bb('b') bb('i') bb('z') bb(0)
_p_szText:
bb('T') bb('h') bb('i') bb('s') bb(' ') bb('E') bb('x') bb('a') bb('m') bb('p') bb('l')
bb('e') bb(' ') bb('s') bb('h') bb('o') bb('w') bb('s') bb(' ') bb('h') bb('o') bb('w')
bb(' ') bb('A') bb('P') bb('I') bb(' ') bb('r') bb('e') bb('d') bb('i') bb('r') bb('e')
bb('c') bb('t') bb('i') bb('o') bb('n') bb(' ') bb('t') bb('e') bb('c') bb('h') bb('n')
bb('i') bb('q') bb('u') bb('e') bb(' ') bb('w') bb('o') bb('r') bb('k') bb('s') bb('.')
bb(0)
_p_dwThunk:                        dword_type(0xCCCCCCCC)
_p_dwHintName:                    dword_type(0xCCCCCCCC)
_p_ptempbuffer:                    dword_type(0xCCCCCCCC)
//----------------------------------
    dword_type(DYN_LOADER_END_MAGIC)
//----------------------------------
}
}
//----------------------------------------------------------------


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
坛子里又添牛医生了
2007-9-26 09:11
0
雪    币: 256
活跃值: (268)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
“坛子里又添牛医生了”,还有谁是医生:)
2007-9-26 09:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对于非计算机专业而又在学习和开发程序的淫俺始终抱着一种敬重的心意。

顶!
2007-9-26 09:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
问一下谁有PEMaker6的源代码弄一个到这里(俺上班的时候只可以在bbs.pediy.com下载,特别申请的,嘿嘿)。

很抱歉没有看全楼主的这系列的所有文就问了这个,也不知道是不是在那里有链接,有的话也给个,谢谢!
2007-9-26 09:51
0
雪    币: 332
活跃值: (30)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
6
大概写了这个东西的流程,实在很难表达:
PEMaker6下载地址:http://www.mydatabus.com/public/panzhibin/pemaker6.zip
//对话库初始化
BOOL CMainForm::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    //省略
    //注意,构建CPECryptor类
    PEfile=new (CPECryptor);
    return FALSE;
}
//构建CPECryptor类之前先构造其基类CPELibrary
CPELibrary::CPELibrary()
{    //构造DOS文件头
    image_dos_header=new (IMAGE_DOS_HEADER);
    dwDosStubSize=0;
    //构造NT文件头
    image_nt_headers=new (IMAGE_NT_HEADERS);
    //构造20个节表
    for(int i=0;i<MAX_SECTION_NUM;i++) image_section_header[i]=new (IMAGE_SECTION_HEADER);
    image_tls_directory=NULL;
}
//CPECryptor类没有默认的构造函数
//对话库初始化结束
//点击打开文件对话框,调用基类CPELibrary成员函数
  PEfile->OpenFile(cFnameOpen);
void CPELibrary::OpenFile(char* FileName)
{   
    hFile=CreateFile(FileName,...);
    dwFileSize=GetFileSize(hFile,0);
    //不用内存映射文件,奇怪?
    pMem=(char*)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,dwFileSize);
    //读入文件
    ReadFile(hFile,pMem,dwFileSize,&dwBytesRead,NULL);
    //读出DOS文件头
    memcpy(image_dos_header,pMem,sizeof(IMAGE_DOS_HEADER));
    //读出NT文件头
    memcpy(image_nt_headers,...);
    //循环读取节表,储存节表的空间已经初始化了。
    CopyMemory(image_section_header[i],pMem+dwRO_first_section+i*sizeof(IMAGE_SECTION_HEADER),
  //为每个节数据分配空间,大小为每个节在文件中的大小
  //循环读出每个节,按照文件对齐
    CopyMemory(image_section[i],...);
    }
}
//点击InJect按钮
//执行PEfile->CryptFile(callback);
void CPECryptor::CryptFile(int(__cdecl *progress) (unsigned int, unsigned int))
{
    //根据文件类型构造CITMaker类
  new CITMaker(IMPORT_TABLE_OCX),new CITMaker(IMPORT_TABLE_EXE);
    CITMaker::CITMaker(int iType)
  {
    Initialization(iType);
    //计算出所需的导入表大小
    dwSize=Get_IT_Size();
    //申请空间
    pMem=new CHAR[dwSize];
  }
    //新节=DynLoader代码+导入表
    dwNewSectionSize = dwCodeSize + ImportTableMaker->dwSize;
    //分配空间
    pNewSection=new TCHAR[dwNewSectionSize];
    //复制DynLoader代码空间
    memcpy(pNewSection+dwCodeOffset, ch_temp, dwCodeSize);
    //添加新节
    pimage_section_header=AddNewSection(".xxx",dwNewSectionSize);
    //复制原始信息到新节空间中DynLoader代码的最后的数据中
    CopyData1(pimage_section_header->VirtualAddress);
    //构建导入表放pMem中
    ImportTableMaker->Build(pimage_section_header->VirtualAddress);// build import table by the current virtual address
    //复制到新节中在DynLoader代码之前
    memcpy(pNewSection, ImportTableMaker->pMem, ImportTableMaker->dwSize);
    //注意
    memcpy(image_section[image_nt_headers->FileHeader.NumberOfSections-1],
           pNewSection,
           dwNewSectionSize);
    //更新文件头
    image_nt_headers->OptionalHeader.AddressOfEntryPoint=pimage_section_header->VirtualAddress + dwCodeOffset;
    image_nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress=pimage_section_header->VirtualAddress;
    image_nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size=ImportTableMaker->dwSize;
}
//最后将所有数据写入新的文件中
  PEfile->SaveFile(cFnameSave);
2007-9-27 23:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
3Q,不过得下班才能下到了。
2007-9-28 10:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谁能告诉小弟,这个PEMaker工程是如何建立的吗?在vc6.0下是建立个什么样的工程?总感觉该工程的代码都是手写的,没有预先生成的,谢谢了   
2008-3-18 11:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我知道该工程是在vc7建立的,其实vc7和vc6没有多大的不同,功能比vc6多了,可是我就是想不明白怎么建立的该工程,知道的朋友要不吝赐教啊,多谢多谢~~~~~~
2008-3-18 11:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
自己顶下,没有人知道这个问题吗?希望高人不吝赐教啊.
2008-3-19 21:19
0
游客
登录 | 注册 方可回帖
返回
//