Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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++ 在十六进制编辑器中写入程序内存并以编程方式读取_C++_Windows_Hex_Executable_Exe - Fatal编程技术网

C++ 在十六进制编辑器中写入程序内存并以编程方式读取

C++ 在十六进制编辑器中写入程序内存并以编程方式读取,c++,windows,hex,executable,exe,C++,Windows,Hex,Executable,Exe,我有一个.exe应用程序和一些其他文件。我要做的是将另一个文件写入.exe文件的末尾。exe文件应该在它的内存中找到这个文件的地址,从那里读取它并做一些事情 我能够找到我之前写入内存的文件的地址,但当我尝试从那里读取时,我得到了拒绝访问的异常。我怎样才能从那里阅读 基本上我只想有一个自我解包的PE文件。是的,我知道,我可以做自解压存档,但这不是我想要的,因为我需要.exe和.dll,但自解压存档只能是.exe,所以看起来唯一的方法是让我的应用程序自我解压。代码如下: int main(void)

我有一个.exe应用程序和一些其他文件。我要做的是将另一个文件写入.exe文件的末尾。exe文件应该在它的内存中找到这个文件的地址,从那里读取它并做一些事情

我能够找到我之前写入内存的文件的地址,但当我尝试从那里读取时,我得到了拒绝访问的异常。我怎样才能从那里阅读

基本上我只想有一个自我解包的PE文件。是的,我知道,我可以做自解压存档,但这不是我想要的,因为我需要.exe和.dll,但自解压存档只能是.exe,所以看起来唯一的方法是让我的应用程序自我解压。代码如下:

int main(void)
{
    HMODULE hBegin = GetModuleHandle(NULL);

    PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hBegin;
    PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((PBYTE)hBegin + dosHeader->e_lfanew);
    PIMAGE_SECTION_HEADER pSectionTable = (PIMAGE_SECTION_HEADER)(ntHeaders + 1);


    // get size of each section
    DWORD dwSize = 0;

    for(int i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++)
    {
        dwSize += pSectionTable[i].SizeOfRawData;
    }

    //get size of PE headers
    dwSize += ntHeaders->OptionalHeader.SizeOfHeaders;

    WCHAR lpszSfxPath[MAX_PATH];
        GetModuleFileNameW(NULL, lpszSfxPath, MAX_PATH);
    HANDLE hFile = CreateFileW(lpszSfxPath,
            GENERIC_READ,
            FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
    SetFilePointer(hFile, dwSize, NULL, FILE_BEGIN);
    BYTE BUF[10];
    if(!ReadFile(hFile,BUF,sizeof(BYTE),NULL,NULL))
        printf("FAIL!\n");

    printf("HELLO WORLD\n");
    getchar();
    return 0;
}
int main(无效)
{
HMODULE hBegin=GetModuleHandle(NULL);
PIMAGE\U DOS\U HEADER DOSHADER=(PIMAGE\U DOS\U HEADER)hBegin;
PIMAGE\u NT\u HEADERS n HEADERS=(PIMAGE\u NT\u HEADERS)((PBYTE)hBegin+dossheader->e\u lfanew);
PIMAGE_SECTION_HEADER pSectionTable=(PIMAGE_SECTION_HEADER)(n标题+1);
//获取每个部分的大小
DWORD dwSize=0;
对于(inti=0;iFileHeader.NumberOfSections;i++)
{
dwSize+=pSectionTable[i].SizeOfRawData;
}
//获取PE头的大小
dwSize+=n标题->可选标题.SizeOfHeaders;
WCHAR lpszSfxPath[MAX_PATH];
GetModuleFileNameW(NULL,lpszSfxPath,MAX_路径);
HANDLE hFile=CreateFileW(lpszSfxPath,
泛读,
文件共享读取,
无效的
开放式,
文件\u属性\u正常,
无效);
SetFilePointer(hFile、dwSize、NULL、FILE_BEGIN);
字节BUF[10];
if(!ReadFile(hFile,BUF,sizeof(BYTE),NULL,NULL))
printf(“失败!\n”);
printf(“HELLO WORLD\n”);
getchar();
返回0;
}

在调用SetFilePointer文件指针指针指向存储压缩文件的文件末尾之后,但我无法从中读取数据,另一种可能的解决方案是在文件中最后存储一个头结构,其中包含数据开始文件的偏移量和数据长度。然后,您的程序可以轻松地查找到文件的末尾(减去头的大小),并读取数据的位置和长度


您要做的是获取可执行文件,将其写入第二个文件,可能会写入填充,写入数据,可能会写入更多填充,最后写入数据的长度和数据在文件中的位置

该文件看起来(在磁盘上)类似于:

+-------------+ | Executable | | Program | +-------------+ | Padding | +-------------+ | Data | +-------------+ | Padding | +-------------+ | Data length | | Data pos. | +-------------+ +-------------+ |可执行| |节目| +-------------+ |填充物| +-------------+ |资料| +-------------+ |填充物| +-------------+ |数据长度| |数据位置| +-------------+
现在,可执行文件可以以常规文件(只读)的形式打开该文件。搜索到末尾减去
数据长度
数据位置字段的大小
(通常
sizeof(DWORD)
(乘以2))。读取长度和位置的两个字段。现在,您可以查找数据所在的实际位置(
data pos.
)并读取
数据长度
字节以读取实际数据。

Microsoft的PE可执行二进制文件包含一个单独的资源部分,该部分可放置在文件中-如中,资源用于在可执行文件中传送数据。这是您最可能希望将数据放入的位置


看一看:

问题是,除了使用ReadFile函数“MZ”之外,我实际上无法从文件中读取任何内容。这很好,但看起来我仍然无法解释我希望所有这些东西如何工作。我想创建一个包含另一个文件的可执行文件,这样就可以运行包含该文件的exe,并在执行期间从内存中解压第二个文件。您所说的是:为了拥有exe和文件,exe在执行过程中使用此文件创建另一个exe,并将文件注入其中。但我需要一个自打包exe。你是说你想让可执行文件修改自己?这是不可能的,但这也不是你最初的问题。请澄清你的实际问题是什么:当你说你只能从文件中读取MZ时,你的确切意思是什么?尝试时出现了什么问题?我使用资源文件解决了这个问题。另一种可能的解决方案是使用bin2h实用程序获取.h文件,该文件将二进制文件的二进制代码存储在无符号字符数组中。只需创建文件x.exe或x.dll并将此数组写入即可。无论如何,谢谢你的帮助:)