共同探讨:如何从内存执行一个文件?

packager 2000-07-17 12:48:00
在win98下,现在我用fopen打开一个windows可执行文件,比如notepad.exe,然后把它
读入进我开辟的内存。现在的问题是:如何从这块我们已知道地址的内存中执行这个notepad.exe,使它运行起来?

...全文
691 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_qing 2001-06-28
  • 打赏
  • 举报
回复
提前
packager 2001-06-28
  • 打赏
  • 举报
回复
是啊,田鼠兄的源码在哪里可以下载?还有能否简单解释一下,谢谢。
plato 2001-06-28
  • 打赏
  • 举报
回复
怎么有两个main(),没看懂,哪位介绍一下。
还有那个extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);
是什么啊?
zhoutianshu 2001-06-28
  • 打赏
  • 举报
回复

Gary Nebbett

As Tomas pointed out, depending on exactly what you want to do, it might not be necessary to create a new process from an in-memory image. If you really do need to create a process from an in-memory image on NT then you might try the following, which assumes that the in-memory image originates from a binary resource bound to the executable.

Gary


#define WIN32_NO_STATUS
#include <windows.h>
#undef WIN32_NO_STATUS

namespace NT {
extern "C" {

#pragma warning(disable: 4005) // macro redefinition
#include <ntddk.h>
#pragma warning(default: 4005)

}
}
using NT::NTSTATUS;

typedef struct _DEBUG_CONTROL {
ULONG L0 : 1;
ULONG G0 : 1;
ULONG L1 : 1;
ULONG G1 : 1;
ULONG L2 : 1;
ULONG G2 : 1;
ULONG L3 : 1;
ULONG G3 : 1;
ULONG LE : 1;
ULONG GE : 1;
ULONG : 3;
ULONG GD : 1;
ULONG : 2;
ULONG RWE0 : 2;
ULONG LEN0 : 2;
ULONG RWE1 : 2;
ULONG LEN1 : 2;
ULONG RWE2 : 2;
ULONG LEN2 : 2;
ULONG RWE3 : 2;
ULONG LEN3 : 2;
} DEBUG_CONTROL, *PDEBUG_CONTROL;


VOID preppatch()
{
CONTEXT context = {CONTEXT_DEBUG_REGISTERS};

PDEBUG_CONTROL dr7 = PDEBUG_CONTROL(&context.Dr7);

context.Dr0 = ULONG(GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwCreateThread"));

dr7->L0 = 1, dr7->RWE0 = 0, dr7->LEN0 = 0;

SetThreadContext(GetCurrentThread(), &context);
}

LONG patch(PEXCEPTION_POINTERS ep)
{
if (ep->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) {

HANDLE hProcess = PHANDLE(ep->ContextRecord->Esp)[4];

PCONTEXT context = ((PCONTEXT*)(ep->ContextRecord->Esp))[6];

NT::PROCESS_BASIC_INFORMATION pbi;

NT::NtQueryInformationProcess(hProcess, NT::ProcessBasicInformation, &pbi, sizeof pbi, 0);

PVOID x; ReadProcessMemory(hProcess, PCHAR(pbi.PebBaseAddress) + 8, &x, sizeof x, 0);

NT::ZwUnmapViewOfSection(hProcess, x);

HRSRC hRsrc = FindResource(0, "Image", "EXE");

HGLOBAL hGlobal = LoadResource(0, hRsrc);

PVOID p = LockResource(hGlobal);

PIMAGE_NT_HEADERS nt = PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p)->e_lfanew);

PVOID q = VirtualAllocEx(hProcess,
PVOID(nt->OptionalHeader.ImageBase), nt->OptionalHeader.SizeOfImage, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);

WriteProcessMemory(hProcess, PCHAR(q), PCHAR(p), 0x1000, 0);

PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(nt);

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

WriteProcessMemory(hProcess,
PCHAR(q) + sect[i].VirtualAddress, PCHAR(p) + sect[i].PointerToRawData, sect[i].SizeOfRawData, 0);

WriteProcessMemory(hProcess, PCHAR(pbi.PebBaseAddress) + 8, &q, sizeof q, 0);

context->Eax = ULONG(q) + nt->OptionalHeader.AddressOfEntryPoint;

ep->ContextRecord->Dr7 = 0;

return EXCEPTION_CONTINUE_EXECUTION;
}

return EXCEPTION_CONTINUE_SEARCH;
}

int main(int argc, char *argv[])
{
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof si};

__try {
preppatch();

CreateProcess(0, "Explorer", 0, 0, FALSE, 0, 0, 0, &si, &pi); }
__except (patch(GetExceptionInformation())) {}

return 0;
}



#include <windows.h>

extern "C" NTSYSAPI LONG NTAPI ZwUnmapViewOfSection(HANDLE, PVOID);

ULONG protect(ULONG characteristics)

{

static const ULONG mapping[]

= {PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,

PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE, PAGE_EXECUTE_READWRITE};

return mapping[characteristics >> 29];

}

int main(int argc, char *argv[])

{

PROCESS_INFORMATION pi;

STARTUPINFO si = {sizeof si};

CreateProcess(0, "cmd", 0, 0, FALSE, CREATE_SUSPENDED, 0, 0, &si, &pi);

CONTEXT context = {CONTEXT_INTEGER};

GetThreadContext(pi.hThread, &context);

PVOID x; ReadProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &x, sizeof x, 0);

ZwUnmapViewOfSection(pi.hProcess, x);

PVOID p = LockResource(LoadResource(0, FindResource(0, "Image", "EXE")));

PIMAGE_NT_HEADERS nt = PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p)->e_lfanew);

PVOID q = VirtualAllocEx(pi.hProcess,

PVOID(nt->OptionalHeader.ImageBase),

nt->OptionalHeader.SizeOfImage,

MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

WriteProcessMemory(pi.hProcess, q, p, nt->OptionalHeader.SizeOfHeaders, 0);

PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(nt);

for (ULONG i = 0; i < nt->FileHeader.NumberOfSections; i++) {

WriteProcessMemory(pi.hProcess,

PCHAR(q) + sect[i].VirtualAddress,

PCHAR(p) + sect[i].PointerToRawData,

sect[i].SizeOfRawData, 0);

ULONG x;

VirtualProtectEx(pi.hProcess, PCHAR(q) + sect[i].VirtualAddress, sect[i].Misc.VirtualSize,

protect(sect[i].Characteristics), &x);

}

WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &q, sizeof q, 0);

context.Eax = ULONG(q) + nt->OptionalHeader.AddressOfEntryPoint;

SetThreadContext(pi.hThread, &context);

ResumeThread(pi.hThread);

return 0;

}

=========================================
Zhou Tianshu
("`-''-/").___..--''"`-._
`6_ 6 ) `-. ( ).`-.__.`)
(_Y_.)' ._ ) `._ `. ``-..-'
_..`--'_..-_/ /--'_.' ,'
(il),-'' (li),' ((!.-'

=========================================

gbstar2021 2001-06-28
  • 打赏
  • 举报
回复
gz
元明 2000-09-24
  • 打赏
  • 举报
回复
attention
mygo 2000-09-24
  • 打赏
  • 举报
回复
关注
可口可乐 2000-09-24
  • 打赏
  • 举报
回复
genie,你到处宣传,可我怎么就是进不去?
younet 2000-09-20
  • 打赏
  • 举报
回复
genie:你累不累?
Sunlet 2000-09-19
  • 打赏
  • 举报
回复
关注
genie 2000-09-19
  • 打赏
  • 举报
回复
ha,这里都是高手,妙极,我写了个开放源代码的中文“类c语言”集成开发环境,名叫freegenie,4win98的,可以用中文做变量和函数名,图形化编程界面,所见即所得,主要用鼠标编写代码。debug部分的功能不逊于其它同类软件,只是写的匆忙(从开始到结束1个月就完了),变量的显示有写bug,很好改的。希望去看看。纯以sdk方式写成.今天刚传过去,578k含源代码和3个示范程序在武汉自由软件协会www.whlug.clinux.org,freegenie条目下。
cctime 2000-09-19
  • 打赏
  • 举报
回复
将内存写到另一个文件里,执行它,再弄个.BAT文件删除该可执行文件。
这个方法是否等效?
oldworm 2000-09-19
  • 打赏
  • 举报
回复
attach
halbert 2000-09-19
  • 打赏
  • 举报
回复
attention
raincy 2000-09-18
  • 打赏
  • 举报
回复
guan zhu
BluePenguin 2000-09-18
  • 打赏
  • 举报
回复
我同意minnow方法,因为WINDOWS9X在执行PE文件时,就是这样操作的,可参考《Windows高级编程指南(第三版)》
Putao 2000-09-18
  • 打赏
  • 举报
回复
关注
minnow 2000-09-18
  • 打赏
  • 举报
回复
是否可以用内存文件映射的方法:
步骤一:调用CreateFile()函数,以适当的方式创建或打开一个文件核心对象;

  步骤二:把CreateFile()函数返回的文件句柄作为参数,传给CreateFileMapping()函数,
由CreateFileMapping()函数创建一个文件映射核心对象的适当属性;

  步骤三:创建了文件映射核心对象后,调用MapViewOfFile()函数,告诉系统把文件的哪
一部分映射到进程的地址空间中,以何种方式映射;
  步骤四:利用MapViewOfFile()函数返回的指针来使用文件数据;

  步骤五:操作完毕后,调用UnmapViewOfFile()函数,告诉系统撤销对文件映射核心对象
的映射;

  步骤六:使用CloseHandle()函数关闭文件映射核心对象;

  步骤七:使用CloseHandle()函数关闭文件核心对象;
Kevin_qing 2000-09-18
  • 打赏
  • 举报
回复
关注关注
minnow 2000-09-18
  • 打赏
  • 举报
回复
我现在也碰到了类似的问题,是否有例程,给大家看一看,谢谢!!
加载更多回复(15)

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧