直接运行内存中的程序

C程序载入内存的过程 简介:从内存角度,搞清楚C代码是怎样作用于单片机的(裸机)。 阅读详情
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.youkuaiyun.com/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;   
}
   
  
  
  
  
 
/**//*******************************************************  
{ ******************************************************* }  
{ *                 从内存中加载并运行exe               * }  
{ ******************************************************* }  
{ * 参数:                                                }  
{ * Buffer: 内存中的exe地址                               }  
{ * Len: 内存中exe占用长度                                }  
{ * CmdParam: 命令行参数(不包含exe文件名的剩余命令行参数)}  
{ * ProcessId: 返回的进程Id                               }  
{ * 返回值: 如果成功则返回进程的Handle(ProcessHandle),   }  
{            如果失败则返回INVALID_HANDLE_VALUE           }  
{ ******************************************************* }  
 ******************************************************
*/
  
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;   
}
   
  
delphi 在内存中直接运行EXE类型的资源文件 运行一下你会看到 资源里的的exe 运行了 ,程序没有生成exe文件,而是直接从内存里加载并且执行的。 打开任务管理器看一下,比原来多了一个svchost.exe 的进程(进程路径:c:\windows\system32\svchost.exe 就是你在pe 单元里面设定的路径,当然你还任意修改)。 立即下载

相关推荐

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3184

从内存中加载并运行exe

{配合anskya的AnyWhereFileToPas效果不错} {*******************************************************} {*从内存中加载并运行exe*} {*******************************...

a572893208的博客 409

别再只调OpenCV参数了!手把手教你用Python bm3d库搞定图像去噪(附完整代码与效果对比)

本文详细介绍了BM3D算法在图像去噪中的高级应用,通过Python bm3d库实现超越OpenCV传统方法的去噪效果。文章包含完整代码示例、参数调优技巧及工程化应用场景,帮助开发者掌握这一被称为'传统方法天花板'的技术,显著提升图像信噪比和细节保留能力。

weixin_28362173的博客 367

程序在内存中的运行原理

一、背景介绍 当进程被加载到内存时,会被分成很多段 bss段:   bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。   bss是英文Block Started by Symbol的简称。   bss段属于静态内存分配。 data段:   数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。   数据段属于静态内存分配。 text段:   代码段(code segment/text segment)通常.

sinat_31608641的博客 3462

Xilinx XDMA IP核配置实战:AXI Memory Mapped vs Stream选型指南(附PCIe调试技巧)

本文深入解析Xilinx XDMA IP核配置中AXI Memory Mapped与AXI Stream两种DMA接口的核心区别与选型策略。针对PCIe高速数据传输场景,详细对比了二者在数据特性、延迟、硬件资源及软件复杂度上的差异,为FPGA工程师在数据采集、实时处理等项目中做出高效设计决策提供实战指南,并附有关键的PCIe调试技巧。

qsc901234的博客 585

LLVM实战:如何用Clang+LLVM打造你的第一个C++编译器(附完整配置步骤)

本文详细介绍了如何使用Clang+LLVM构建C++编译器的完整配置步骤,从环境准备到编译流程剖析,再到调试与优化技巧。通过实战指南,帮助开发者深入理解LLVM编译器框架的工作原理,并掌握交叉编译与性能分析等高级功能。

sprite的博客 748

在内存中运行可执行程序

 在内存中运行可执行程序         在内存中运行可执行程序,好处是可以给程序加壳,加密源程序,静态反汇编无法获得PE输入节,但是因为运行后仍然是独立的进程,所以没办法防止远程线程注入,挂接API钩子。   typedef IMAGE_SECTION_HEADER ( * PIMAGE_SECTION_HEADERS)[ 1 ];      //  计算对齐后的大小    unsig

只谈技术 4463

MTK平台LCD驱动开发实战:从零开始点亮你的Android屏幕

本文详细介绍了在MTK平台进行Android LCD驱动开发的完整流程。从理解LK与Kernel双核驱动框架入手,手把手讲解驱动结构体、屏幕参数配置、初始化序列编写以及PLL_CLOCK计算等核心步骤,并提供了系统集成配置与实用的调试避坑指南,帮助开发者高效点亮新屏幕。

terraform7cloud的博客 293

直接运行内存中的 程序

#include "stdafx.h"     #include         typedef IMAGE_SECTION_HEADER (*PIMAGE_SECTION_HEADERS)[1];           // 计算对齐后的大小      unsigned long GetAlignedSize(unsigned long Origin, unsigned long Al

zqf_office的专栏 829

浏览器解析HTML的过程及编程实现

需要注意的是,上述示例代码只是简化的演示,并未涵盖浏览器解析HTML的所有细节和复杂性。实际上,浏览器的HTML解析引擎还会处理一系列的特殊情况、错误容错和性能优化等方面的内容,以确保能够正确解析各种类型的HTML代码。HTML(超文本标记语言)是构建网页的基础语言,浏览器负责将HTML代码解析并渲染成可视化的网页。本文将详细介绍浏览器解析HTML的过程,并提供相应的编程示例代码。希望以上内容能帮助您理解浏览器解析HTML的过程,并通过提供的示例代码更好地了解如何在编程中实现这一过程。

ByteJolt的博客 322

45、概率与模糊性:粗糙事件与模糊事件概率的探索

本文探讨了概率理论与模糊性理论在处理现实世界不确定性中的应用,重点分析了模糊事件和粗糙事件的概率定义、性质及其条件概率。同时,介绍了近似贝叶斯网络分类器在信息系统中的应用,以及如何通过概率决策约简提高分类效率。这些方法为处理不确定信息提供了灵活的工具,并在决策和数据分析中具有重要价值。

ik67890123的博客 135

直接运行内存中的程序[转]

001  /* 002  Windows的PE加载器在启动程序的时候,会将磁盘上的文件加载到内存,然后做很多操作,如函数导入表重定位,变量预处理之类的。这位仁兄等于是自己写了一个PE加载器。直接将内存中的程序启动。记得以前的“红色代码”病毒也有相同的特性。 003  直接启动内存中的程序相当于加了一个壳,可以把程序加密保存,运行时解密到内存,然后启动,不过对于增加破解难度还要稍微复杂点。否则人家把内存中的进程DUMP出来然后修复导入表就被拖出来了。 004  */ 005  #includ

mAKER's Blog 2570

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【转】直接运行内存中的 程序

转自:http://www.cnblogs.com/jecray/archive/2011/02/15/1955563.html #include "stdafx.h" #include typedef IMAGE_SECTION_HEADER (*PIMAGE_SECTION_HEADERS)[1]; // 计算对齐后的大小 unsigned long GetAli

天道酬勤 1307

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RAM ROM

RAM random access memory 随机存储器 手机中的运行内存 ROM Read-Only Memory 手机中的外部存储

qq_36812544的博客 186

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RAM和ROM的理解

RAM和ROM都代表内存 ROM ----- 存储内存(硬盘之类的用来存数据的)比较好理解 RAM ----- 运行内存 运行内存: 不管是手机还是电脑上的每个应用,在运行时都会占用运行内存,运行内存越大,能在后台启用的应用就越多,运行内存少了,启动的应用多了就会有卡顿,运行内存是用来进行读写的,读写速度越快,卡顿就越少, ...

weixin_43791176的博客 174

android运行内存与存储内存,运行内存和机身内存的区别 这些知识你知道吗

说起手机的运行内存,你可能不知道是什么,说起RAW,想必大家都觉得眼熟,没错,这就是我们使用手机中经常见到的运行内存缩写。事实上,除了运行内存,我们每天还在使用着另外一种内存,它就是机身内存。今天小编就带大家走进机身内存和运行内存的世界,并对运行内存和机身内存的区别做一个大致的了解。什么是运行内存在一部手机常见的存储部件中,RAM存储器,也就是运行内存,它的作用相当于电脑的内存条,不仅能存储东西,...

weixin_27199085的博客 3916
上一篇: pedump.c
下一篇: 仿真WINDOWS PE加载器的程序
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值