创建了CREATE_SUSPENDED的傀儡进程。 用幕后进程替换傀儡进程后,报告说0xc0000005。 我好几天不知道了。 我碎了。 有人来帮我了
WIN7 x64系统、vs2017 x86编译器,两个进程都是32位进程。 typedefntsysapintstatus (_ _ stdcall * zwunmapviewofsection ) (HANDLE,PVOID );
int main () )
{
加载ZwUnmapViewOfSection函数
hmodule hmodule=getmodulehandle (l ' ntdll.dll ';
if(hmodule==null ) ) )。
返回假;
zunmapviewofsectionunmapviewofsection=(zwunmapviewofsection ) getprocaddress(hmodule,' zwunmapviewofsection ' );
//将后台进程读入缓存
file * pfile=空;
_wfopen_s(pfile,filePath1,L'rb ' );
if(pfile==null )。
{
messagebox(0,L'fopen_s fail ),0,MB_OK );
返回(int _ ptr ) TRUE;
}
fseek(pfile,0,SEEK_END );
dwordSZfile=ftell(pfile;
fseek(pfile,0,SEEK_SET );
byte*pfilebuffer=(byte* ) malloc ) SZfile );
前端(pfile buffer,szFile,1,pfile );
close(pfile;
//后台进程的标头信息
pimage _ dos _ headerpdosh=(pimage _ dos _ header ) pFileBuffer;
pimage _ file _ headerpfileh=(pimage _ file _ header ) (BYTE* ) pDosH pDosH-e_lfanew 4);
pimage _ optional _ headerpopth=(pimage _ optional _ header ) ((BYTE* ) pFileH IMAGE_SIZEOF_FILE_HEADER );
pimage _ section _ headerpsectionh=(pimage _ section _ header ) ) (BYTE* ) popthpfileh-sizeofoptionalheader;
PROCESS_INFORMATION pi={ 0 };
STARTUPINFO si={ 0 };
si.CB=sizeof(startupinfo );
bool created=createprocess (file path 3,NULL,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,si,pi );
int err;
if (! 创建) {
err=GetLastError (;
返回0;
}
上下文上下文={0};
context.context flags=context _ full;
gtthreadcontext(pi.hthread,context;
//从线程上下获取基地址
SIZE_T read;
DWORD oldBase;
boolhasread=readprocessmemory (pi.hprocess,) PDWORD ) context.Ebx 0X8)、oldBase,sizeof ) PDWORD )、read;
if (! hasread({
返回0;
}
//断开傀儡进程的镜像
ntstatus flag=unmapviewofsection (pi.hprocess,) BYTE* ) oldBase );
if(flag0) {
返回0;
}
//申请虚拟空间的存储器
lpvoidaddrexe=virtualalloc ex (pi.hprocess,) lpvoid ) pOptH-ImageBase,
pOptH-SizeOfImage,MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE;
if (addrexe==空值) {
返回0;
}
//交换傀儡进程
SIZE_T written;
bool isOk=FALSE;
//头部
isok=writeprocessmemory (pi.hprocess,) LPVOID ) addrExe,pFileBuffer,pOptH-SizeOfHeaders,written;
//节部分
for(intI=0; i pFileH-NumberOfSections; I ) {
isok=writeprocessmemory (pi.hprocess,
(LPVOID ) ) (BYTE* ) addrexepsectionh [ I ].virtual address,
pfilebufferpsectionh [ I ].pointertorawdata,
pSectionH[i].SizeOfRawData,
written;
}
//修改线程上下文
DWORD imageBase=(DWORD ) addrExe;
context.eax=imagebasepopth-address of entry point;
writeprocessmemory(pi.hprocess,) PDWORD ) context.Ebx 0X8),imageBase,sizeof ) PDWORD,written );
setthreadcontext(pi.hprocess,context;
resumethread(pi.hthread;
返回0;
}
如果通过调用Nt/ZwUnmapViewOfSection ()卸载镜像,则会发生错误
2 .不卸载镜像,在可用内存中插入另一个进程,修改重新定位符表并停止工作
最后是2020-1-23 13:58
被吸引去编辑语言
、理由: