gpt4 book ai didi

c++ - 在进程中注入(inject)标准函数后崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 08:04:37 25 4
gpt4 key购买 nike

我目前正在尝试 PE 注入(inject),并注意到一旦我使用 std::cout 或 std::string 之类的东西,我注入(inject)的目标进程就会崩溃。消息框甚至 printf() 都可以正常工作。代码编译没有错误,我读到导入表不在注入(inject)过程中的同一位置可能会导致它崩溃,但我不知道该怎么做才能修复它(重新加载导入表)。在此先感谢,这是注入(inject)示例:

#include <iostream>
#include <stdio.h>
#include <Windows.h>

void ThreadProc(PVOID p)
{
MessageBox(NULL,"Message from injected code!","Message",MB_ICONINFORMATION); //funktioniert einwandfrei
RedirectOutput();
std::cout << "hi"; //crashed
}

int main(int argc,char* argv[])
{
PIMAGE_DOS_HEADER pIDH;
PIMAGE_NT_HEADERS pINH;
PIMAGE_BASE_RELOCATION pIBR;

HANDLE hProcess,hThread;
PUSHORT TypeOffset;

PVOID ImageBase,Buffer,mem;
ULONG i,Count,Delta,*p;

printf("\nOpening target process\n");

hProcess=OpenProcess(
PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE,
FALSE,
13371337);

if(!hProcess)
{
printf("\nError: Unable to open target process (%u)\n",GetLastError());
return -1;
}

ImageBase=GetModuleHandle(NULL);
printf("\nImage base in current process: %#x\n",ImageBase);

pIDH=(PIMAGE_DOS_HEADER)ImageBase;
pINH=(PIMAGE_NT_HEADERS)((PUCHAR)ImageBase+pIDH->e_lfanew);

printf("\nAllocating memory in target process\n");
mem=VirtualAllocEx(hProcess,NULL,pINH->OptionalHeader.SizeOfImage,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);

if(!mem)
{
printf("\nError: Unable to allocate memory in target process (%u)\n",GetLastError());

CloseHandle(hProcess);
return 0;
}

printf("\nMemory allocated at %#x\n",mem);

Buffer=VirtualAlloc(NULL,pINH->OptionalHeader.SizeOfImage,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
memcpy(Buffer,ImageBase,pINH->OptionalHeader.SizeOfImage);

printf("\nRelocating image\n");

pIBR=(PIMAGE_BASE_RELOCATION)((PUCHAR)Buffer+pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
Delta=(ULONG)mem-(ULONG)ImageBase;

printf("\nDelta: %#x\n",Delta);

while(pIBR->VirtualAddress)
{
if(pIBR->SizeOfBlock>=sizeof(IMAGE_BASE_RELOCATION))
{
Count=(pIBR->SizeOfBlock-sizeof(IMAGE_BASE_RELOCATION))/sizeof(USHORT);
TypeOffset=(PUSHORT)(pIBR+1);

for(i=0;i<Count;i++)
{
if(TypeOffset[i])
{
p=(PULONG)((PUCHAR)Buffer+pIBR->VirtualAddress+(TypeOffset[i] & 0xFFF));
*p+=Delta;
}
}
}

pIBR=(PIMAGE_BASE_RELOCATION)((PUCHAR)pIBR+pIBR->SizeOfBlock);
}

printf("\nWriting relocated image into target process\n");

if(!WriteProcessMemory(hProcess,mem,Buffer,pINH->OptionalHeader.SizeOfImage,NULL))
{
printf("\nError: Unable to write process memory (%u)\n",GetLastError());

VirtualFreeEx(hProcess,mem,0,MEM_RELEASE);
CloseHandle(hProcess);

return -1;
}

VirtualFree(Buffer,0,MEM_RELEASE);

printf("\nCreating thread in target process\n");
hThread=CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)((PUCHAR)ThreadProc+Delta),NULL,0,NULL);

if(!hThread)
{
printf("\nError: Unable to create thread in target process (%u)\n",GetLastError());

VirtualFreeEx(hProcess,mem,0,MEM_RELEASE);
CloseHandle(hProcess);

return -1;
}

printf("\nWaiting for the thread to terminate\n");
WaitForSingleObject(hThread,INFINITE);

printf("\nThread terminated\n\nFreeing allocated memory\n");

VirtualFreeEx(hProcess,mem,0,MEM_RELEASE);
CloseHandle(hProcess);

return 0;
}

最佳答案

我认为答案很简单——STL 库要求对全局数据进行一些初始化。例如,通过全局对象的构造函数。但是您只需将代码复制到目标进程即可。它不调用通常在调用 main 函数之前执行的任何初始化。只需尝试 DLL 注入(inject)即可。

关于c++ - 在进程中注入(inject)标准函数后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43707533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com