天天看点

直接运行内存中的程序

  Windows的PE加载器在启动程序的时候,会将磁盘上的文件加载到内存,然后做很多操作,如函数导入表重定位,变量预处理之类的。这位仁兄等于是自己写了一个PE加载器。直接将内存中的程序启动。记得以前的“红色代码”病毒也有相同的特性。

    直接启动内存中的程序相当于加了一个壳,可以把程序加密保存,运行时解密到内存,然后启动,不过对于增加破解难度还要稍微复杂点。否则人家把内存中的进程DUMP出来然后修复导入表就被拖出来了。

直接运行内存中的程序

#include  " stdafx.h "   

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

typedef IMAGE_SECTION_HEADER ( * PIMAGE_SECTION_HEADERS)[ 1 ];   

直接运行内存中的程序
直接运行内存中的程序

//  计算对齐后的大小   

直接运行内存中的程序

unsigned  long  GetAlignedSize(unsigned  long  Origin, unsigned  long  Alignment)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    return (Origin + Alignment - 1) / Alignment * Alignment;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序

//  计算加载pe并对齐需要占用多少内存   

直接运行内存中的程序

//  未直接使用OptionalHeader.SizeOfImage作为结果是因为据说有的编译器生成的exe这个值会填0   

直接运行内存中的程序

unsigned  long  CalcTotalImageSize(PIMAGE_DOS_HEADER MzH   

直接运行内存中的程序

                                 , unsigned  long  FileLen   

直接运行内存中的程序

                                 , PIMAGE_NT_HEADERS peH   

直接运行内存中的程序

                                 , PIMAGE_SECTION_HEADERS peSecH)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    unsigned long res;   

直接运行内存中的程序

    // 计算pe头的大小   

直接运行内存中的程序

    res = GetAlignedSize( peH->OptionalHeader.SizeOfHeaders   

直接运行内存中的程序

        , peH->OptionalHeader.SectionAlignment   

直接运行内存中的程序

        );   

直接运行内存中的程序
直接运行内存中的程序

    // 计算所有节的大小   

直接运行内存中的程序

    for( int i = 0; i < peH->FileHeader.NumberOfSections; ++i)   

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        // 超出文件范围   

直接运行内存中的程序

        if(peSecH[i]->PointerToRawData + peSecH[i]->SizeOfRawData > FileLen)   

直接运行内存中的程序

            return 0;   

直接运行内存中的程序

        else if(peSecH[i]->VirtualAddress)//计算对齐后某节的大小   

直接运行内存中的程序
直接运行内存中的程序

        ...{   

直接运行内存中的程序

            if(peSecH[i]->Misc.VirtualSize)   

直接运行内存中的程序
直接运行内存中的程序

            ...{   

直接运行内存中的程序

                res = GetAlignedSize( peSecH[i]->VirtualAddress + peSecH[i]->Misc.VirtualSize   

直接运行内存中的程序

                    , peH->OptionalHeader.SectionAlignment   

直接运行内存中的程序

                    );   

直接运行内存中的程序

            }   

直接运行内存中的程序

            else  

直接运行内存中的程序
直接运行内存中的程序

            ...{   

直接运行内存中的程序

                res = GetAlignedSize( peSecH[i]->VirtualAddress + peSecH[i]->SizeOfRawData   

直接运行内存中的程序

                    , peH->OptionalHeader.SectionAlignment   

直接运行内存中的程序

                    );   

直接运行内存中的程序

            }   

直接运行内存中的程序

        }   

直接运行内存中的程序

        else if( peSecH[i]->Misc.VirtualSize < peSecH[i]->SizeOfRawData )   

直接运行内存中的程序
直接运行内存中的程序

        ...{   

直接运行内存中的程序

            res += GetAlignedSize( peSecH[i]->SizeOfRawData   

直接运行内存中的程序

                , peH->OptionalHeader.SectionAlignment   

直接运行内存中的程序

                );   

直接运行内存中的程序

        }   

直接运行内存中的程序

        else  

直接运行内存中的程序
直接运行内存中的程序

        ...{   

直接运行内存中的程序

            res += GetAlignedSize( peSecH[i]->Misc.VirtualSize   

直接运行内存中的程序

                , peH->OptionalHeader.SectionAlignment   

直接运行内存中的程序

                );   

直接运行内存中的程序

        }// if_else   

直接运行内存中的程序

    }// for   

直接运行内存中的程序
直接运行内存中的程序

    return res;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

//  加载pe到内存并对齐所有节   

直接运行内存中的程序

BOOL AlignPEToMem(  void   * Buf   

直接运行内存中的程序

                  ,  long  Len   

直接运行内存中的程序

                  , PIMAGE_NT_HEADERS  & peH   

直接运行内存中的程序

                  , PIMAGE_SECTION_HEADERS  & peSecH   

直接运行内存中的程序

                  ,  void   *& Mem   

直接运行内存中的程序

                  , unsigned  long   & ImageSize)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    PIMAGE_DOS_HEADER SrcMz;// DOS头   

直接运行内存中的程序

    PIMAGE_NT_HEADERS SrcPeH;// PE头   

直接运行内存中的程序

    PIMAGE_SECTION_HEADERS SrcPeSecH;// 节表   

直接运行内存中的程序
直接运行内存中的程序

    SrcMz = (PIMAGE_DOS_HEADER)Buf;   

直接运行内存中的程序
直接运行内存中的程序

    if( Len < sizeof(IMAGE_DOS_HEADER) )    

直接运行内存中的程序

        return FALSE;   

直接运行内存中的程序
直接运行内存中的程序

    if( SrcMz->e_magic != IMAGE_DOS_SIGNATURE )   

直接运行内存中的程序

        return FALSE;   

直接运行内存中的程序
直接运行内存中的程序

    if( Len < SrcMz->e_lfanew + (long)sizeof(IMAGE_NT_HEADERS) )   

直接运行内存中的程序

        return FALSE;   

直接运行内存中的程序
直接运行内存中的程序

    SrcPeH = (PIMAGE_NT_HEADERS)((int)SrcMz + SrcMz->e_lfanew);   

直接运行内存中的程序

    if( SrcPeH->Signature != IMAGE_NT_SIGNATURE )   

直接运行内存中的程序

        return FALSE;   

直接运行内存中的程序
直接运行内存中的程序

    if( (SrcPeH->FileHeader.Characteristics & IMAGE_FILE_DLL) ||   

直接运行内存中的程序

        (SrcPeH->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE == 0) ||   

直接运行内存中的程序

        (SrcPeH->FileHeader.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER)) )   

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        return FALSE;   

直接运行内存中的程序

    }   

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

    SrcPeSecH = (PIMAGE_SECTION_HEADERS)((int)SrcPeH + sizeof(IMAGE_NT_HEADERS));   

直接运行内存中的程序

    ImageSize = CalcTotalImageSize( SrcMz, Len, SrcPeH, SrcPeSecH);   

直接运行内存中的程序
直接运行内存中的程序

    if( ImageSize == 0 )   

直接运行内存中的程序

        return FALSE;   

直接运行内存中的程序
直接运行内存中的程序

    Mem = VirtualAlloc( NULL, ImageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 分配内存   

直接运行内存中的程序

    if( Mem != NULL )   

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        // 计算需要复制的PE头字节数   

直接运行内存中的程序

        unsigned long l = SrcPeH->OptionalHeader.SizeOfHeaders;   

直接运行内存中的程序

        for( int i = 0; i < SrcPeH->FileHeader.NumberOfSections; ++i)   

直接运行内存中的程序
直接运行内存中的程序

        ...{   

直接运行内存中的程序

            if( (SrcPeSecH[i]->PointerToRawData) &&   

直接运行内存中的程序

                (SrcPeSecH[i]->PointerToRawData < l) )   

直接运行内存中的程序
直接运行内存中的程序

            ...{   

直接运行内存中的程序

                l = SrcPeSecH[i]->PointerToRawData;   

直接运行内存中的程序

            }   

直接运行内存中的程序

        }   

直接运行内存中的程序

        memmove( Mem, SrcMz, l);   

直接运行内存中的程序

        peH = (PIMAGE_NT_HEADERS)((int)Mem + ((PIMAGE_DOS_HEADER)Mem)->e_lfanew);   

直接运行内存中的程序

        peSecH = (PIMAGE_SECTION_HEADERS)((int)peH + sizeof(IMAGE_NT_HEADERS));   

直接运行内存中的程序
直接运行内存中的程序

        void *Pt = (void *)((unsigned long)Mem    

直接运行内存中的程序

            + GetAlignedSize( peH->OptionalHeader.SizeOfHeaders   

直接运行内存中的程序

            , peH->OptionalHeader.SectionAlignment)   

直接运行内存中的程序

            );   

直接运行内存中的程序
直接运行内存中的程序

        for( i = 0; i < peH->FileHeader.NumberOfSections; ++i)   

直接运行内存中的程序
直接运行内存中的程序

        ...{   

直接运行内存中的程序

            // 定位该节在内存中的位置   

直接运行内存中的程序

            if(peSecH[i]->VirtualAddress)   

直接运行内存中的程序

                Pt = (void *)((unsigned long)Mem + peSecH[i]->VirtualAddress);   

直接运行内存中的程序
直接运行内存中的程序

            if(peSecH[i]->SizeOfRawData)   

直接运行内存中的程序
直接运行内存中的程序

            ...{   

直接运行内存中的程序

                // 复制数据到内存   

直接运行内存中的程序

                memmove(Pt, (const void *)((unsigned long)(SrcMz) + peSecH[i]->PointerToRawData), peSecH[i]->SizeOfRawData);   

直接运行内存中的程序

                if(peSecH[i]->Misc.VirtualSize < peSecH[i]->SizeOfRawData)   

直接运行内存中的程序

                    Pt = (void *)((unsigned long)Pt + GetAlignedSize(peSecH[i]->SizeOfRawData, peH->OptionalHeader.SectionAlignment));   

直接运行内存中的程序

                else // pt 定位到下一节开始位置   

直接运行内存中的程序

                    Pt = (void *)((unsigned long)Pt + GetAlignedSize(peSecH[i]->Misc.VirtualSize, peH->OptionalHeader.SectionAlignment));   

直接运行内存中的程序

            }   

直接运行内存中的程序

            else  

直接运行内存中的程序
直接运行内存中的程序

            ...{   

直接运行内存中的程序

                Pt = (void *)((unsigned long)Pt + GetAlignedSize(peSecH[i]->Misc.VirtualSize, peH->OptionalHeader.SectionAlignment));   

直接运行内存中的程序

            }   

直接运行内存中的程序

        }   

直接运行内存中的程序

    }   

直接运行内存中的程序

    return TRUE;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

typedef  void   * (__stdcall  * pfVirtualAllocEx)(unsigned  long ,  void   * , unsigned  long , unsigned  long , unsigned  long );   

直接运行内存中的程序

pfVirtualAllocEx MyVirtualAllocEx  =  NULL;   

直接运行内存中的程序
直接运行内存中的程序

BOOL IsNT()   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    return MyVirtualAllocEx!=NULL;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序

//  生成外壳程序命令行   

直接运行内存中的程序

char   * PrepareShellExe( char   * CmdParam, unsigned  long  BaseAddr, unsigned  long  ImageSize)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    if(IsNT())   

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        char *Buf = new char[256];   

直接运行内存中的程序

        memset(Buf, 0, 256);   

直接运行内存中的程序

        GetModuleFileName(0, Buf, 256);   

直接运行内存中的程序

        strcat(Buf, CmdParam);   

直接运行内存中的程序

        return Buf; // 请记得释放内存;-)   

直接运行内存中的程序

    }   

直接运行内存中的程序

    else  

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        // Win98下的处理请参考原文;-)   

直接运行内存中的程序

        // http://community.csdn.net/Expert/topic/4416/4416252.xml?temp=8.709133E-03   

直接运行内存中的程序

        return NULL;   

直接运行内存中的程序

    }   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序

//  是否包含可重定向列表   

直接运行内存中的程序

BOOL HasRelocationTable(PIMAGE_NT_HEADERS peH)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    return (peH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress)   

直接运行内存中的程序

        && (peH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

#pragma pack(push,  1 )   

直接运行内存中的程序
直接运行内存中的程序

typedef struct ... {   

直接运行内存中的程序

    unsigned long VirtualAddress;   

直接运行内存中的程序

    unsigned long SizeOfBlock;   

直接运行内存中的程序

}   * PImageBaseRelocation;   

直接运行内存中的程序

#pragma pack(pop)   

直接运行内存中的程序
直接运行内存中的程序

//  重定向PE用到的地址   

直接运行内存中的程序

void  DoRelocation(PIMAGE_NT_HEADERS peH,  void   * OldBase,  void   * NewBase)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    unsigned long Delta = (unsigned long)NewBase - peH->OptionalHeader.ImageBase;   

直接运行内存中的程序

    PImageBaseRelocation p = (PImageBaseRelocation)((unsigned long)OldBase    

直接运行内存中的程序

        + peH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);   

直接运行内存中的程序

    while(p->VirtualAddress + p->SizeOfBlock)   

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        unsigned short *pw = (unsigned short *)((int)p + sizeof(*p));   

直接运行内存中的程序

        for(unsigned int i=1; i <= (p->SizeOfBlock - sizeof(*p)) / 2; ++i)   

直接运行内存中的程序
直接运行内存中的程序

        ...{   

直接运行内存中的程序
直接运行内存中的程序

            if((*pw) & 0xF000 == 0x3000)...{   

直接运行内存中的程序

                unsigned long *t = (unsigned long *)((unsigned long)(OldBase) + p->VirtualAddress + ((*pw) & 0x0FFF));   

直接运行内存中的程序

                *t += Delta;   

直接运行内存中的程序

            }   

直接运行内存中的程序

            ++pw;   

直接运行内存中的程序

        }   

直接运行内存中的程序

        p = (PImageBaseRelocation)pw;   

直接运行内存中的程序

    }   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序

//  卸载原外壳占用内存   

直接运行内存中的程序

BOOL UnloadShell(HANDLE ProcHnd, unsigned  long  BaseAddr)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    typedef unsigned long (__stdcall *pfZwUnmapViewOfSection)(unsigned long, unsigned long);   

直接运行内存中的程序

    pfZwUnmapViewOfSection ZwUnmapViewOfSection = NULL;   

直接运行内存中的程序

    BOOL res = FALSE;   

直接运行内存中的程序

    HMODULE m = LoadLibrary("ntdll.dll");   

直接运行内存中的程序
直接运行内存中的程序

    if(m)...{   

直接运行内存中的程序

        ZwUnmapViewOfSection = (pfZwUnmapViewOfSection)GetProcAddress(m, "ZwUnmapViewOfSection");   

直接运行内存中的程序

        if(ZwUnmapViewOfSection)   

直接运行内存中的程序

            res = (ZwUnmapViewOfSection((unsigned long)ProcHnd, BaseAddr) == 0);   

直接运行内存中的程序

        FreeLibrary(m);   

直接运行内存中的程序

    }   

直接运行内存中的程序

    return res;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序

//  创建外壳进程并获取其基址、大小和当前运行状态   

直接运行内存中的程序

BOOL CreateChild( char   * Cmd, CONTEXT  & Ctx, HANDLE  & ProcHnd, HANDLE  & ThrdHnd,    

直接运行内存中的程序

                 unsigned  long   & ProcId, unsigned  long   & BaseAddr, unsigned  long   & ImageSize)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    STARTUPINFOA si;   

直接运行内存中的程序

    PROCESS_INFORMATION pi;   

直接运行内存中的程序

    unsigned long old;   

直接运行内存中的程序

    MEMORY_BASIC_INFORMATION MemInfo;   

直接运行内存中的程序

    memset(&si, 0, sizeof(si));   

直接运行内存中的程序

    memset(&pi, 0, sizeof(pi));   

直接运行内存中的程序

    si.cb = sizeof(si);   

直接运行内存中的程序
直接运行内存中的程序

    BOOL res = CreateProcess(NULL, Cmd, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); // 以挂起方式运行进程;   

直接运行内存中的程序
直接运行内存中的程序

    if(res)...{   

直接运行内存中的程序

        ProcHnd = pi.hProcess;   

直接运行内存中的程序

        ThrdHnd = pi.hThread;   

直接运行内存中的程序

        ProcId = pi.dwProcessId;   

直接运行内存中的程序

        // 获取外壳进程运行状态,[ctx.Ebx+8]内存处存的是外壳进程的加载基址,ctx.Eax存放有外壳进程的入口地址   

直接运行内存中的程序

        Ctx.ContextFlags = CONTEXT_FULL;   

直接运行内存中的程序

        GetThreadContext(ThrdHnd, &Ctx);   

直接运行内存中的程序

        ReadProcessMemory(ProcHnd, (void *)(Ctx.Ebx+8), &BaseAddr, sizeof(unsigned long), &old); // 读取加载基址   

直接运行内存中的程序

        void *p = (void *)BaseAddr;   

直接运行内存中的程序

        // 计算外壳进程占有的内存   

直接运行内存中的程序

        while(VirtualQueryEx(ProcHnd, p, &MemInfo, sizeof(MemInfo)))   

直接运行内存中的程序
直接运行内存中的程序

        ...{   

直接运行内存中的程序

            if(MemInfo.State = MEM_FREE) break;   

直接运行内存中的程序

            p = (void *)((unsigned long)p + MemInfo.RegionSize);   

直接运行内存中的程序

        }   

直接运行内存中的程序

        ImageSize = (unsigned long)p - (unsigned long)BaseAddr;   

直接运行内存中的程序

    }   

直接运行内存中的程序

    return res;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序

//  创建外壳进程并用目标进程替换它然后执行   

直接运行内存中的程序

HANDLE AttachPE( char   * CmdParam, PIMAGE_NT_HEADERS peH, PIMAGE_SECTION_HEADERS peSecH,    

直接运行内存中的程序

                 void   * Ptr, unsigned  long  ImageSize, unsigned  long   & ProcId)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    HANDLE res = INVALID_HANDLE_VALUE;   

直接运行内存中的程序

    CONTEXT Ctx;   

直接运行内存中的程序

    HANDLE Thrd;   

直接运行内存中的程序

    unsigned long Addr, Size;   

直接运行内存中的程序

    char *s = PrepareShellExe(CmdParam, peH->OptionalHeader.ImageBase, ImageSize);   

直接运行内存中的程序

    if(s==NULL) return res;   

直接运行内存中的程序
直接运行内存中的程序

    if(CreateChild(s, Ctx, res, Thrd, ProcId, Addr, Size))...{   

直接运行内存中的程序

        void *p = NULL;   

直接运行内存中的程序

        unsigned long old;   

直接运行内存中的程序
直接运行内存中的程序

        if((peH->OptionalHeader.ImageBase == Addr) && (Size >= ImageSize))...{// 外壳进程可以容纳目标进程并且加载地址一致   

直接运行内存中的程序

            p = (void *)Addr;   

直接运行内存中的程序

            VirtualProtectEx(res, p, Size, PAGE_EXECUTE_READWRITE, &old);   

直接运行内存中的程序

        }   

直接运行内存中的程序
直接运行内存中的程序

        else if(IsNT())...{   

直接运行内存中的程序
直接运行内存中的程序

            if(UnloadShell(res, Addr))...{// 卸载外壳进程占有内存   

直接运行内存中的程序

                p = MyVirtualAllocEx((unsigned long)res, (void *)peH->OptionalHeader.ImageBase, ImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);   

直接运行内存中的程序

            }   

直接运行内存中的程序
直接运行内存中的程序

            if((p == NULL) && HasRelocationTable(peH))...{// 分配内存失败并且目标进程支持重定向   

直接运行内存中的程序

                p = MyVirtualAllocEx((unsigned long)res, NULL, ImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);   

直接运行内存中的程序

                if(p) DoRelocation(peH, Ptr, p); // 重定向   

直接运行内存中的程序

            }   

直接运行内存中的程序

        }   

直接运行内存中的程序
直接运行内存中的程序

        if(p)...{   

直接运行内存中的程序

            WriteProcessMemory(res, (void *)(Ctx.Ebx+8), &p, sizeof(DWORD), &old); // 重置目标进程运行环境中的基址   

直接运行内存中的程序

            peH->OptionalHeader.ImageBase = (unsigned long)p;   

直接运行内存中的程序
直接运行内存中的程序

            if(WriteProcessMemory(res, p, Ptr, ImageSize, &old))...{// 复制PE数据到目标进程   

直接运行内存中的程序

                Ctx.ContextFlags = CONTEXT_FULL;   

直接运行内存中的程序

                if((unsigned long)p == Addr)   

直接运行内存中的程序

                    Ctx.Eax = peH->OptionalHeader.ImageBase + peH->OptionalHeader.AddressOfEntryPoint; // 重置运行环境中的入口地址   

直接运行内存中的程序

                else  

直接运行内存中的程序

                    Ctx.Eax = (unsigned long)p + peH->OptionalHeader.AddressOfEntryPoint;   

直接运行内存中的程序

                SetThreadContext(Thrd, &Ctx);// 更新运行环境   

直接运行内存中的程序

                ResumeThread(Thrd);// 执行   

直接运行内存中的程序

                CloseHandle(Thrd);   

直接运行内存中的程序

            }   

直接运行内存中的程序
直接运行内存中的程序

            else...{// 加载失败,杀掉外壳进程   

直接运行内存中的程序

                TerminateProcess(res, 0);   

直接运行内存中的程序

                CloseHandle(Thrd);   

直接运行内存中的程序

                CloseHandle(res);   

直接运行内存中的程序

                res = INVALID_HANDLE_VALUE;   

直接运行内存中的程序

            }   

直接运行内存中的程序

        }   

直接运行内存中的程序
直接运行内存中的程序

        else...{// 加载失败,杀掉外壳进程   

直接运行内存中的程序

            TerminateProcess(res, 0);   

直接运行内存中的程序

            CloseHandle(Thrd);   

直接运行内存中的程序

            CloseHandle(res);   

直接运行内存中的程序

            res = INVALID_HANDLE_VALUE;   

直接运行内存中的程序

        }   

直接运行内存中的程序

    }   

直接运行内存中的程序

    delete[] s;   

直接运行内存中的程序

    return res;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

HANDLE MemExecute( void   * ABuffer,  long  Len,  char   * CmdParam, unsigned  long   * ProcessId)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    HANDLE res = INVALID_HANDLE_VALUE;   

直接运行内存中的程序

    PIMAGE_NT_HEADERS peH;   

直接运行内存中的程序

    PIMAGE_SECTION_HEADERS peSecH;   

直接运行内存中的程序

    void *Ptr;   

直接运行内存中的程序

    unsigned long peSz;   

直接运行内存中的程序

    if(AlignPEToMem(ABuffer, Len, peH, peSecH, Ptr, peSz))   

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        res = AttachPE(CmdParam, peH, peSecH, Ptr, peSz, *ProcessId);   

直接运行内存中的程序

        VirtualFree(Ptr, peSz, MEM_DECOMMIT);   

直接运行内存中的程序

    }   

直接运行内存中的程序

    return res;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序

//  初始化   

直接运行内存中的程序

class CInit   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

public:   

直接运行内存中的程序

    CInit()   

直接运行内存中的程序
直接运行内存中的程序

    ...{   

直接运行内存中的程序

        MyVirtualAllocEx = (pfVirtualAllocEx)GetProcAddress(GetModuleHandle("Kernel32.dll"), "VirtualAllocEx");   

直接运行内存中的程序

    }   

直接运行内存中的程序

} Init;   

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

int  APIENTRY WinMain(HINSTANCE hInstance,   

直接运行内存中的程序

                     HINSTANCE hPrevInstance,   

直接运行内存中的程序

                     LPSTR     lpCmdLine,   

直接运行内存中的程序

                      int        nCmdShow)   

直接运行内存中的程序
直接运行内存中的程序

... {   

直接运行内存中的程序

    HANDLE hFile = NULL;   

直接运行内存中的程序

    hFile = ::CreateFile( "f:/SourceFromCsdn2.exe"  

直接运行内存中的程序

        , FILE_ALL_ACCESS   

直接运行内存中的程序

        , 0   

直接运行内存中的程序

        , NULL   

直接运行内存中的程序

        , OPEN_EXISTING   

直接运行内存中的程序

        , FILE_ATTRIBUTE_NORMAL   

直接运行内存中的程序

        , NULL   

直接运行内存中的程序

        );   

直接运行内存中的程序

    if( hFile == INVALID_HANDLE_VALUE )   

直接运行内存中的程序

        return -1;   

直接运行内存中的程序
直接运行内存中的程序

    ::SetFilePointer( hFile, 0, NULL, FILE_BEGIN);   

直接运行内存中的程序

    DWORD dwFileSize = ::GetFileSize( hFile, NULL);   

直接运行内存中的程序
直接运行内存中的程序

    LPBYTE pBuf = new BYTE[dwFileSize];   

直接运行内存中的程序

    memset( pBuf, 0, dwFileSize);   

直接运行内存中的程序
直接运行内存中的程序

    DWORD dwNumberOfBytesRead = 0;   

直接运行内存中的程序

    ::ReadFile( hFile   

直接运行内存中的程序

        , pBuf   

直接运行内存中的程序

        , dwFileSize   

直接运行内存中的程序

        , &dwNumberOfBytesRead   

直接运行内存中的程序

        , NULL   

直接运行内存中的程序

        );   

直接运行内存中的程序
直接运行内存中的程序

    ::CloseHandle(hFile);   

直接运行内存中的程序
直接运行内存中的程序

    unsigned long ulProcessId = 0;   

直接运行内存中的程序

    MemExecute( pBuf, dwFileSize, "", &ulProcessId);   

直接运行内存中的程序

    delete[] pBuf;   

直接运行内存中的程序
直接运行内存中的程序
直接运行内存中的程序

    return 0;   

直接运行内存中的程序

}    

直接运行内存中的程序
直接运行内存中的程序