さて、.exe アプリケーションとその他のファイルがあります。私がしたいのは、この他のファイルを .exe ファイルの最後に書き込むことです。.exe ファイルは、メモリ内でこのファイルのアドレスを見つけ、そこから読み取り、何らかの処理を行う必要があります。
以前にメモリに書き込んだファイルのアドレスに到達できましたが、そこから読み込もうとすると、アクセス拒否例外が発生します。そこからどう読むか。
基本的に、1 つの自己解凍 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;
}
SetFilePointer ファイル ポインターを呼び出した後、パックされたファイルが格納されているファイルの末尾の直後を指しますが、そこから読み取ることができません。