16,471
社区成员
发帖
与我相关
我的任务
分享
pBuf[0]='H';
pBuf[1]='e';
pBuf[2]='l';
pBuf[3]='l';
pBuf[4]='o';
pBuf[5]=0;
...
pBuf[255]=0;
这样,pBuf中保存的就是“Hello”,打印出来的就是“Hello”;然后继续读取256个字节出来,自动就是剩下的“World”。当然,1.exe可以你自己写的,1.exe中可以自己读取自己,自动定位到离末尾512个字节的地方,然后读取两个长度为256的字符串,再打印出来。之,你就可以随便修改1.exe末尾后512个字节的内容了,再运行这个修改过后的1.exe,输出的自然就是你修改后的内容。
这样,有什么问题?
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int main()
{
char szExePath[MAX_PATH] = {0};
HANDLE hFile = CreateFile("D:\\1.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY, NULL);
SetFilePointer(hFile, -78, NULL, FILE_END);
char szMessage[256] = {0};
DWORD dwByteRead = 0;
ReadFile(hFile, szMessage, 256, &dwByteRead, NULL);
szMessage[255] = 0;
CloseHandle(hFile);
printf("Message : %s\n", szMessage);
getch();
return 0;
}
SetFilePointer(hFile, -(256 + 4), NULL, FILE_END);
char szMessage[256] = {0};
DWORD32 dw32Para = 0;
DWORD dwByteRead = 0;
ReadFile(hFile, szMessage, 256, &dwByteRead, NULL);
szMessage[255] = 0;
ReadFile(hFile, &dw32Para, 4, &dwByteRead, NULL);
不是用SeekToEnd,是以末尾为基准,向前定位256+4=260个字节的地方,就是说定位到离文件末尾还有260个字节的地方,然后读256个字节出来,这256个字节是字符串信息,再读取4个字节,这4个字节当作一个DWORD值。
BOOL ReleaseFile(WORD wResID, char *szResType, char *szFilePathName)
{
BOOL bRet=FALSE;
HRSRC hRes;
DWORD dwSize;
HGLOBAL hGlobal;
LPVOID pBuffer;
HANDLE hFile;
DWORD dwWriten;
hRes=FindResource(hModule,MAKEINTRESOURCE(wResID),szResType);
dwSize=SizeofResource(hModule,hRes);
hGlobal=LoadResource(hModule,hRes);
pBuffer=LockResource(hGlobal);
hFile=CreateFile(szFilePathName,GENERIC_WRITE,FILE_SHARE_READ,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
if(hFile)
{
if(WriteFile(hFile,pBuffer,dwSize,&dwWriten,NULL))
{
bRet=TRUE;
}
CloseHandle(hFile);
}
return bRet;
}