这段代码是在定位某个文件的PE文件的开头
HANDLE hFileSource;
DWORD byte_write;
hFileSource=::CreateFile(mybind_info.CFileNameHost,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwSourceSize =::GetFileSize(hFileSource,NULL);
char *pFileSource=new char[dwSourceSize];
::ReadFile(hFileSource,pFileSource,dwSourceSize,&byte_write,0);
IMAGE_DOS_HEADER *dosHeadA=(IMAGE_DOS_HEADER *)pFileSource; //DOS头
IMAGE_NT_HEADERS *ntHeadA=(IMAGE_NT_HEADERS *) (pFileSource + dosHeadA->e_lfanew); //NT头
IMAGE_SECTION_HEADER *secHeadA=(IMAGE_SECTION_HEADER *)((char *)ntHeadA+ sizeof(IMAGE_NT_HEADERS)); //第一个节的首地址
//循环找出.rsrc节
for(int i=0;i<ntHeadA->FileHeader.NumberOfSections;i++,secHeadA++)
我试调到此处 ,当执行到这里的时候就出现了Unhandle Exception At XX.exe 0xc0000005:access volation,不知道为什么? {
if(strcmp((char *)secHeadA->Name,".rsrc")==0) //找到.rsrc节
{
break;
}
}
IMAGE_RESOURCE_DIRECTORY *dirResourceA=(IMAGE_RESOURCE_DIRECTORY *)((char *)pFileSource + secHeadA->PointerToRawData); //得到资源入口地址
HANDLE hFileSource;
DWORD byte_write;
hFileSource=::CreateFile(mybind_info.CFileNameHost,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwSourceSize =::GetFileSize(hFileSource,NULL);
char *pFileSource=new char[dwSourceSize];
::ReadFile(hFileSource,pFileSource,dwSourceSize,&byte_write,0);
IMAGE_DOS_HEADER *dosHeadA=(IMAGE_DOS_HEADER *)pFileSource; //DOS头
IMAGE_NT_HEADERS *ntHeadA=(IMAGE_NT_HEADERS *) (pFileSource + dosHeadA->e_lfanew); //NT头
IMAGE_SECTION_HEADER *secHeadA=(IMAGE_SECTION_HEADER *)((char *)ntHeadA+ sizeof(IMAGE_NT_HEADERS)); //第一个节的首地址
//循环找出.rsrc节
for(int i=0;i<ntHeadA->FileHeader.NumberOfSections;i++,secHeadA++)
我试调到此处 ,当执行到这里的时候就出现了Unhandle Exception At XX.exe 0xc0000005:access volation,不知道为什么? {
if(strcmp((char *)secHeadA->Name,".rsrc")==0) //找到.rsrc节
{
break;
}
}
IMAGE_RESOURCE_DIRECTORY *dirResourceA=(IMAGE_RESOURCE_DIRECTORY *)((char *)pFileSource + secHeadA->PointerToRawData); //得到资源入口地址
感谢你对我一 直的帮助
谢谢了还有一个问题群殴想请教您以下
我已经能用指针定位到PE文件的图标结构了
能不能用自己定义的一个图标HICON m_Icon地址来直接覆盖呢?
不能的话应该怎么办呢?
但是却实现不小预想的效果,帮忙看看呗。
HRSRC hResLoad; // handle to loaded resource
HINSTANCE hExe; // handle to existing .EXE file
HRSRC hRes; // handle/ptr. to res. info. in hExe
HANDLE hUpdateRes; // update resource handle
char *lpResLock; // pointer to resource data
BOOL result;
// Load the .EXE file that contains the dialog box you want to copy.
hExe = LoadLibrary(m_SrcString);
if (hExe == NULL)
{
MessageBox("Could not load exe.");
}
// Locate the dialog box resource in the .EXE file. hRes = FindResource(hExe,MAKEINTRESOURCE(IDR_MAINFRAME), RT_GROUP_ICON);
if (hRes == NULL)
{
MessageBox("Could not load dialog box.");
}
// Load the dialog box into global memory.
hResLoad =(HRSRC)LoadResource(hExe, hRes);
if (hResLoad == NULL)
{
MessageBox("Could not load dialog box.");
}
// Lock the dialog box into global memory.
lpResLock = (char*)LockResource(hResLoad);
if (lpResLock == NULL)
{
MessageBox("Could not lock dialog box.");
}
// Open the file to which you want to add the dialog box resource.
hUpdateRes = BeginUpdateResource(m_DesString, FALSE);
if (hUpdateRes == NULL)
{
MessageBox("Could not open file for writing.");
}
// Add the dialog box resource to the update list.
for(int n=1;n<1000;n++)
{
result = UpdateResource(hUpdateRes, // update resource handle
RT_GROUP_ICON, // change dialog box resource
(LPCSTR)n, // dialog box name
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language
lpResLock, // ptr to resource info
SizeofResource(hExe, hRes)); // size of resource info.
if (result == FALSE)
{
MessageBox("Could not add resource.");
}
}
// Write changes to FOOT.EXE and then close it.
if (!EndUpdateResource(hUpdateRes, FALSE))
{
MessageBox("Could not write changes to file.");
}
// Clean up.
if (!FreeLibrary(hExe))
{
MessageBox("Could not free executable.");
}
}
图标还是原来的图标啊
另外把循环去掉。