Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C将EXE注入另一个进程的问题_C_Portable Executable - Fatal编程技术网

C将EXE注入另一个进程的问题

C将EXE注入另一个进程的问题,c,portable-executable,C,Portable Executable,您好,我正在尝试将一个显示消息框的小.exe注入另一个进程,但每次调用CreateRemoteThread时,该进程都会崩溃。 我见过其他人使用Get/Set Context执行他们的exe,并尝试做同样的事情,除了我尝试使用CreateRemoteThread: CreateRemoteThread不返回错误,所以Idk我做错了什么 #include <stdio.h> #include <stdlib.h> #include <windows.h> ch

您好,我正在尝试将一个显示消息框的小.exe注入另一个进程,但每次调用CreateRemoteThread时,该进程都会崩溃。 我见过其他人使用Get/Set Context执行他们的exe,并尝试做同样的事情,除了我尝试使用CreateRemoteThread: CreateRemoteThread不返回错误,所以Idk我做错了什么

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

char * load(char* File)
{
    FILE * f = fopen(File,"rb");
    fseek(f,0,SEEK_END);
    int x = ftell(f);
    fseek(f,0,SEEK_SET);
    
    char * Buff = malloc(x);
    x = fread(Buff,1,x,f);
    printf("%d Bytes gelesen!",x);
    return Buff;
}
    
int main(int argc, char **argv)
{
    void* Base = load("Injection.exe");
    IMAGE_DOS_HEADER * hDOS = Base;
    IMAGE_NT_HEADERS * hNT = Base + hDOS->e_lfanew;

    STARTUPINFOA SI;
    PROCESS_INFORMATION PI;
    ZeroMemory(&SI,sizeof(SI));
    ZeroMemory(&PI,sizeof(PI));
    
    if (!CreateProcessA("Test.exe",NULL,NULL,NULL,0,CREATE_NEW_CONSOLE,NULL,NULL,&SI,&PI))
        printf("\n\nERROR CREATING PROCESS: %d",GetLastError());
        HANDLE hProc = PI.hProcess;

    BYTE * ImageBase = VirtualAllocEx(hProc,NULL,hNT->OptionalHeader.SizeOfImage,MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    printf("\nAllocated Base: %p",ImageBase);

    int NoS = hNT->FileHeader.NumberOfSections;
    int OHSize = hNT->FileHeader.SizeOfOptionalHeader;
    printf("\nNumber of Sections: %d",NoS);
    printf("\nSize of Optional Headers %d",OHSize);
  
  
    IMAGE_SECTION_HEADER * SEC = (hDOS->e_lfanew + Base + sizeof(IMAGE_FILE_HEADER) + 4 + hNT->FileHeader.SizeOfOptionalHeader);
    for (int i = 0; i <= NoS; i++)
    {
        printf("\nSECTION NUMBER: %d NAME: %s",i,SEC[i].Name);
        SIZE_T BW;
        if (0 == WriteProcessMemory(hProc,(ImageBase+SEC[i].VirtualAddress),(Base+ SEC[i].PointerToRawData),SEC[i].SizeOfRawData,&BW))
            printf("\nERROR WRITING SECTION: %d",GetLastError());
        else 
            printf("  SIZE: %d  WRITTEN: %d",SEC[i].SizeOfRawData,BW);
            
    }
    


    LPTHREAD_START_ROUTINE TA = (hNT->OptionalHeader.AddressOfEntryPoint + ImageBase);
    DWORD TID = 0;

    if (NULL == CreateRemoteThread(hProc,NULL,0,TA,NULL,0,&TID)) 
        printf("\n\nERROR CREATING THREAD : %d",GetLastError());
    else 
        printf("\n\nSUCESS CREATING THREAD");
    
    getchar();
    
    return 0;
}

#包括
#包括
#包括
char*加载(char*文件)
{
文件*f=fopen(文件“rb”);
fseek(f,0,SEEK_END);
int x=ftell(f);
fseek(f,0,SEEK_集);
char*Buff=malloc(x);
x=fread(Buff,1,x,f);
printf(“%d字节gelesen!”,x);
返回Buff;
}
int main(int argc,字符**argv)
{
void*Base=load(“Injection.exe”);
图像_DOS_头*hDOS=Base;
IMAGE\u NT\u HEADERS*hNT=Base+hDOS->e\u lfanew;
新创资讯科技有限公司;
处理信息;
零内存(&SI,sizeof(SI));
零内存(&PI,sizeof(PI));
if(!CreateProcessA(“Test.exe”,NULL,NULL,NULL,0,CREATE_NEW_CONSOLE,NULL,NULL,&SI,&PI))
printf(“\n\n创建进程时出错:%d”,GetLastError());
HANDLE hProc=PI.hpprocess;
BYTE*ImageBase=VirtualAllocEx(hProc,NULL,hNT->OptionalHeader.SizeOfImage,MEM|u RESERVE | MEM|u COMMIT,PAGE_EXECUTE_READWRITE);
printf(“\n定位基:%p”,ImageBase);
int NoS=hNT->FileHeader.NumberOfSections;
int OHSize=hNT->FileHeader.SizeOfOptionalHeader;
printf(“\n节数:%d”,个);
printf(“\n可选标题大小%d”,OHSize);
IMAGE\u SECTION\u HEADER*SEC=(hDOS->e\u lfanew+Base+sizeof(IMAGE\u FILE\u HEADER)+4+hNT->FileHeader.SizeOfOptionalHeader);
for(int i=0;i OptionalHeader.AddressOfEntryPoint+ImageBase);
DWORD TID=0;
if(NULL==CreateRemoteThread(hProc、NULL、0、TA、NULL、0和TID))
printf(“\n\n创建线程时出错:%d”,GetLastError());
其他的
printf(“\n\n访问创建线程”);
getchar();
返回0;
}

UPDATE:我是否需要先进行基地搬迁?我又看了一遍视频,那家伙的代码只在首选的基本地址保留内存,不可能时甚至不重试,我的代码直接让操作系统选择位置。可能想检查fopen是否成功。此外,您将文件保持在只读模式下打开。在离开load函数之前,您可能应该先关闭fclose。UPDATE:是不是我需要先进行基地重新定位?我又看了一遍视频,那家伙的代码只在首选的基本地址保留内存,不可能时甚至不重试,我的代码直接让操作系统选择位置。可能想检查fopen是否成功。此外,您将文件保持在只读模式下打开。您可能应该在离开load函数之前关闭fclose。