能力值:
( LV2,RANK:10 )
|
-
-
2 楼
大家请帮帮忙
|
能力值:
( LV13,RANK:370 )
|
-
-
3 楼
把代码放全一点,片段看不出来什么特点
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
HANDLE hFile= NULL,hMapFile= NULL;
LPVOID pMem=NULL;;
DWORD SectionNum;
DWORD i;
PIMAGE_SECTION_HEADER sectionHead;
DWORD dwRO_first_section;
//----------------------------------------
hFile=CreateFile(cFnameOpen,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
return;
}
hMapFile = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
if(hMapFile ==INVALID_HANDLE_VALUE)
{
CloseHandle(hMapFile);
CloseHandle(hFile);
return;
}
pMem = MapViewOfFile(hMapFile,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
if(!pMem)
{
CloseHandle(hMapFile);
CloseHandle(hFile);
CloseHandle(pMem);
return;
}
//----------------------------------------
//得到dos_header
memcpy(image_dos_header,pMem,sizeof(IMAGE_DOS_HEADER));
DWORD *AddressOfpMem = (DWORD*)&pMem;
DWORD ValueOfpMem = *AddressOfpMem;
//根程序尺寸
dwDosStubSize=image_dos_header->e_lfanew-sizeof(IMAGE_DOS_HEADER);
dwDosStubOffset=sizeof(IMAGE_DOS_HEADER);
pDosStub=new CHAR[dwDosStubSize];
if((dwDosStubSize&0x80000000)==0x00000000)
{
CopyMemory(pDosStub,(char*)pMem+dwDosStubOffset,dwDosStubSize);
}
//得到nt_header
memcpy(image_nt_headers,
(char*)pMem+image_dos_header->e_lfanew,
sizeof(IMAGE_NT_HEADERS));
dwRO_first_section=image_dos_header->e_lfanew+sizeof(IMAGE_NT_HEADERS);
//第一个节头的首地址
sectionHead = (PIMAGE_SECTION_HEADER)((char *)image_nt_headers + sizeof(IMAGE_NT_HEADERS));
if(image_dos_header->e_magic!=IMAGE_DOS_SIGNATURE)// MZ
{
MessageBox("Invalid PE Format");
GlobalFree(pMem);
return;
}
if(image_nt_headers->Signature!=IMAGE_NT_SIGNATURE)// PE00
{
return;
}
//节头数量
SectionNum=image_nt_headers->FileHeader.NumberOfSections;
for( i=0;i<SectionNum;i++)
{
//得到每节节头
CopyMemory(image_section_header[i],(char*)pMem+dwRO_first_section+i*sizeof(IMAGE_SECTION_HEADER),
sizeof(IMAGE_SECTION_HEADER));
}
//----------------------------------------
for(i=0;i<SectionNum;i++)
{
//为每节分配内存
image_section[i]=(char*)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT,
PEAlign(image_section_header[i]->SizeOfRawData,
image_nt_headers->OptionalHeader.FileAlignment));
//得到每节内容
CopyMemory(image_section[i],
(char*)pMem+image_section_header[i]->PointerToRawData,
image_section_header[i]->SizeOfRawData);
}
int k;
DWORD codeLength,codeRVA,codeOffset;
callAddress = newcode;
endAddress = ending;
codeLength = reinterpret_cast<DWORD>(endAddress) - reinterpret_cast<DWORD>(callAddress);
DWORD add=(DWORD)(newcode);
DWORD add1=(DWORD)(ending);
codeLength=add1-add;
for (k=0;k<image_nt_headers->FileHeader.NumberOfSections;k++)
{
if (((image_section_header[k]->Misc.VirtualSize) - (image_section_header[k]->SizeOfRawData))> codeLength)
{
codeRVA = image_section_header[k]->VirtualAddress + image_section_header[k]->Misc.VirtualSize;
codeOffset = image_section_header[k]->PointerToRawData + image_section_header[k]->Misc.VirtualSize;
image_section_header[k]->Characteristics = image_section_header[k]->Characteristics | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
image_section_header[k]->Misc.VirtualSize = image_section_header[k]->Misc.VirtualSize + codeLength;
image_nt_headers->OptionalHeader.AddressOfEntryPoint = codeRVA;====这句有问题!!
RtlMoveMemory((char*)pMem + codeOffset,newcode,codeLength);
break;
}
}
UnmapViewOfFile(pMem);
CloseHandle(hMapFile);
CloseHandle(hFile);
|
能力值:
( LV13,RANK:370 )
|
-
-
5 楼
把自己的代码写到节的空隙中去?
codeRVA = image_section_header[k]->VirtualAddress + image_section_header[k]->Misc.VirtualSize;
如果image_section_header[k]->Misc.VirtualSize按SectionAlignment对齐了,似乎就会写到下一节去了
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢回答,是添加到空隙中
现在的问题是先假设codeRVA正确,我更改了AddressOfEntryPoint,而查看更改后的文件,发现AddressOfEntryPoint 没变
|
能力值:
( LV13,RANK:370 )
|
-
-
7 楼
如果程序没有问题的话,试试用FlushViewOfFile刷一下视图文件
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
FlushViewOfFile(image_nt_headers,sizeof(image_nt_headers);
还是没用,要么把代码发给你,麻烦你帮我看看
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
AddressOfEntryPoint还是无法改变,大家帮忙看看
|
能力值:
(RANK:410 )
|
-
-
10 楼
随便看了一下,你修改的似乎只是拷贝到你自己里的内存数据,没有修改pMem的数据。要修改文件你必须修改pMem里的数据才对。
|
能力值:
(RANK:410 )
|
-
-
11 楼
memcpy((void*)image_nt_headers,
(char*)pMem+image_dos_header->e_lfanew,
sizeof(IMAGE_NT_HEADERS));
image_nt_headers只是一个程序的变量,你将pMem文件的数据拷贝到程序的变量,对程序的变量修改数据只对变量有效,而不会对文件有影响。
image_nt_headers->OptionalHeader.AddressOfEntryPoint = codeRVA; //你这里只是修改image_nt_headers变量的数据,但他和pMem变量是没有任何联系的,也就是说他和文件没有任何联系,你修改这里只是变量里的数据被改动了,但文件的pMem数据并没有改变。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
谢谢小虾的提醒,知道原因了
也谢谢llydd
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
DWORD dwNtHeader=((PIMAGE_DOS_HEADER)pMem)->e_lfanew;
int iSecNum = (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->FileHeader.NumberOfSections;
DWORD dwFirstSecHeader = dwNtHeader + sizeof(IMAGE_NT_HEADERS);
int k;
DWORD codeLength,codeRVA,codeOffset,OldEntry;
callAddress = newcode;
endAddress = ending;
codeLength = reinterpret_cast<DWORD>(endAddress) - reinterpret_cast<DWORD>(callAddress);
DWORD add=(DWORD)(newcode);
DWORD add1=(DWORD)(ending);
codeLength=add1-add;
for(k=0;k<iSecNum;k++)
{
if (((PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
-(PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->SizeOfRawData)
>codeLength)
{
codeRVA = (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
+ (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->VirtualAddress;
codeOffset = (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Misc.VirtualSize
+ (PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->PointerToRawData;
(PIMAGE_SECTION_HEADER((char*)pMem + dwFirstSecHeader + k*sizeof(IMAGE_SECTION_HEADER)))->Characteristics =0xc0000040;
RtlMoveMemory((char*)pMem + codeOffset,callAddress,codeLength);
OldEntry = (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.AddressOfEntryPoint + (PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.ImageBase;
(PIMAGE_NT_HEADERS((char*)pMem + dwNtHeader))->OptionalHeader.AddressOfEntryPoint = codeRVA;
break;
}
}
AddressOfEntryPoint修改成功,我想先执行newcode,然后回到原AddressOfEntryPoint,文件改了以后,没有执行AfxMessageBox,用peid看EP区段也没有内容,怎么办??
void newcode()
{
AfxMessageBox("dd");
__asm
{
jmp OldEntry
}
}
|