|
用如下代码得到一个PE格式可执行文件的头信息:
//writePE.cpp
#include <windows.h> #include <stdio.h> #include <io.h> #include <fcntl.h> #include <time.h> #include <SYS\STAT.H>
unsigned char writeline[18]={ 0x6a,0x40,0x6a,0x0,0x6a,0x0,0x6a,0x0,0xe8,0x01,0x0,0x0,0x0,0xe9,0x0,0x0,0x0,0x0 };
DWORD space; DWORD entryaddress; DWORD entrywrite; DWORD progRAV; DWORD oldentryaddress; DWORD newentryaddress; DWORD codeoffset; DWORD peaddress; DWORD flagaddress; DWORD flags;
DWORD virtsize; DWORD physaddress; DWORD physsize; DWORD MessageBoxAadaddress;
int main(int argc,char * * argv) { HANDLE hFile, hMapping; void *basepointer; FILETIME * Createtime; FILETIME * Accesstime; FILETIME * Writetime; Createtime = new FILETIME; Accesstime = new FILETIME; Writetime = new FILETIME;
if ((hFile = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE)//打开要修改的文件 { puts("(could not open)"); return EXIT_FAILURE; } if(!GetFileTime(hFile,Createtime,Accesstime,Writetime)) { printf("\nerror getfiletime: %d\n",GetLastError()); } //得到要修改文件的创建、修改等时间 if (!(hMapping = CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0))) { puts("(mapping failed)"); CloseHandle(hFile); return EXIT_FAILURE; } if (!(basepointer = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0))) { puts("(view failed)"); CloseHandle(hMapping); CloseHandle(hFile); return EXIT_FAILURE; } //把文件头映象存入baseointer CloseHandle(hMapping); CloseHandle(hFile); map_exe(basepointer);//得到相关地址 UnmapViewOfFile(basepointer); printaddress(); printf("\n\n"); if(space<50) { printf("\n空隙太小,数据不能写入.\n"); } else { writefile();//写文件 }
if ((hFile = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)) == INVALID_HANDLE_VALUE) { puts("(could not open)"); return EXIT_FAILURE; }
if(!SetFileTime(hFile,Createtime,Accesstime,Writetime)) { printf("error settime : %d\n",GetLastError()); } //恢复修改后文件的建立时间等 delete Createtime; delete Accesstime; delete Writetime; CloseHandle(hFile); return 0; }
void map_exe(const void *base) { IMAGE_DOS_HEADER * dos_head; dos_head =(IMAGE_DOS_HEADER *)base; #include <pshpack1.h> typedef struct PE_HEADER_MAP { DWORD signature; IMAGE_FILE_HEADER _head; IMAGE_OPTIONAL_HEADER opt_head; IMAGE_SECTION_HEADER section_header[]; } peHeader; #include <poppack.h>
if (dos_head->e_magic != IMAGE_DOS_SIGNATURE) { puts("unknown type of file"); return; }
peHeader * header; header = (peHeader *)((char *)dos_head + dos_head->e_lfanew);//得到PE文件头 if (IsBadReadPtr(header, sizeof(*header)) { puts("(no PE header, probably DOS executable)"); return; }
DWORD mods; char tmpstr[4]={0}; DWORD tmpaddress; DWORD tmpaddress1;
if(strstr((const char *)header->section_header[0].Name,".text")!=NULL) { virtsize=header->section_header[0].Misc.VirtualSize; //此段的真实长度 physaddress=header->section_header[0].PointerToRawData; //此段的物理偏移 physsize=header->section_header[0].SizeOfRawData; //此段的物理长度 peaddress=dos_head->e_lfanew; //得到PE文件头的开始偏移
peHeader peH; tmpaddress=(unsigned long )&peH; //得到结构的偏移 tmpaddress1=(unsigned long )&(peH.section_header[0].Characteristics); //得到变量的偏移 flagaddress=tmpaddress1-tmpaddress+2; //得到属性的相对偏移 flags=0x8000;
上一页 [1] [2] [3] 下一页 |