#include "global.h"
#include <ctime>
#include <cstring>
#include <cctype>
#include <stdexcept>
#include "rva.h"
#include "pefile.hpp"
#include "apicache.h"
#include "utils/compilecheck.hpp"
Go to the source code of this file.
Defines | |
#define | Error(s) { throw std::runtime_error(s); } |
#define | FIELD "%-30s" |
#define | FIELD "%-30s" |
#define | FIELD "%-30s" |
Typedefs | |
typedef void(* | PRelocationProc )(uint32_t address, unsigned type, void *param) |
Functions | |
void | WriteBinary (const ICFile &file, int _len) |
COMPILE_CHECK (error_Only_ASCII_charset_supported,('0'==0x30 &&'9'==0x39 &&'A'==0x41 &&'Z'==(0x41+25)&&'a'==0x61 &&'z'==(0x61+25)&&''==32 &&'\t'==9 &&'\n'==10)) | |
void | out_ws (const unicode_t *s) |
void | WriteResource (ICFile &file, const PeResourceDirectoryData *data, const PeResourceDirectoryInfo *info, unsigned level, void *) |
void | ParseResourceDirectory (const RVAFileTranslator &rva, uint32_t start, PeResourceDirectoryInfo *info, unsigned level, ICFile &file, PeFile::PResourceProc proc, void *param) |
Variables | |
const char *const | szDirectoryEntries [] |
|
Definition at line 40 of file pefile.cpp. Referenced by PeFile::PeFile(). |
|
|
|
|
|
|
|
Definition at line 445 of file pefile.cpp. Referenced by PeFile::ParseRelocations(). |
|
|
|
Definition at line 546 of file pefile.cpp. References unicode_t. Referenced by WriteResource().
00547 { 00548 for(;*s;++s) 00549 { 00550 char c; 00551 c = char((*s) & 0xff); 00552 // !!! bad conversion 00553 if ( (*s) < 256 && isprint(c) ) 00554 printf("%c",c); 00555 else 00556 printf("\\x%04x",*s); 00557 } 00558 } |
|
Definition at line 672 of file pefile.cpp. References PeResourceDirectoryData::data, PeResourceDirectoryInfo::dir, PeResourceDirectoryInfo::highLevel, PeResourceId::id, PeResourceId::name, _PE_IMAGE_RESOURCE_DIRECTORY::NumberOfIdEntries, _PE_IMAGE_RESOURCE_DIRECTORY::NumberOfNamedEntries, _PE_IMAGE_RESOURCE_DATA_ENTRY::OffsetToData, PeFile::PResourceProc, RawRead(), ICFile::ReadStringFlag(), RESOURCE_ENTRY_DATA_OFFSET, RESOURCE_ENTRY_GETID, RESOURCE_ENTRY_ISDIRECTORY, RESOURCE_ENTRY_ISSTRING, RESOURCE_ENTRY_NAME_OFFSET, RVAFileTranslator::RVA2FileSafe(), ICFile::Seek(), ICFile::strLen16, ICFile::strUcs2, ICFile::Tell(), _PE_IMAGE_RESOURCE_DIRECTORY_ENTRY::u2, and unicode_t. Referenced by PeFile::ParseResource().
00673 { 00674 // read raw directory info 00675 RawRead(file,info->dir); 00676 00677 proc(file,NULL,info,level,param); 00678 00679 int i = info->dir.NumberOfNamedEntries + info->dir.NumberOfIdEntries; 00680 for(;i>0;--i) 00681 { 00682 PE_IMAGE_RESOURCE_DIRECTORY_ENTRY entry; 00683 RawRead(file,entry); 00684 long pos = file.Tell(); 00685 // finish (ID, Type, Language) 00686 unicode_t *pName = NULL; 00687 if ( RESOURCE_ENTRY_ISSTRING(entry) ) 00688 { 00689 00690 file.Seek(start+RESOURCE_ENTRY_NAME_OFFSET(entry)); 00691 pName = (unicode_t*)file.ReadStringFlag( 00692 ICFile::strUcs2|ICFile::strLen16); 00693 } 00694 00695 if ( RESOURCE_ENTRY_ISDIRECTORY(entry) ) 00696 { 00697 file.Seek(start+RESOURCE_ENTRY_DATA_OFFSET(entry) ); 00698 00699 // init directory 00700 PeResourceDirectoryInfo _info; 00701 _info.name = pName; 00702 _info.id = RESOURCE_ENTRY_GETID(entry); 00703 _info.highLevel = info; 00704 00705 ParseResourceDirectory(rva,start,&_info,level+1,file,proc,param); 00706 } 00707 else 00708 { 00709 file.Seek(start+entry.u2.OffsetToData); 00710 00711 // init data 00712 PeResourceDirectoryData data; 00713 RawRead(file,data.data); 00714 data.id = RESOURCE_ENTRY_GETID(entry); 00715 data.name = pName; 00716 00717 file.Seek(rva.RVA2FileSafe(data.data.OffsetToData)); 00718 proc(file,&data,info,level+1,param); 00719 } 00720 delete [] pName; 00721 00722 file.Seek(pos); 00723 } 00724 } |
|
Definition at line 503 of file pefile.cpp. References _PRG_ASSERT, and ICFile::RawRead().
00504 { 00505 _PRG_ASSERT(_len>0); 00506 unsigned int len = (unsigned int)_len; 00507 unsigned address = 0; 00508 const unsigned nCarInRow = 16; 00509 char buffer[3*nCarInRow+nCarInRow+10]; 00510 for(unsigned n=0;;++n) 00511 { 00512 unsigned part = n%nCarInRow; 00513 if (part==0) 00514 { 00515 if (n>=nCarInRow) 00516 { 00517 buffer[nCarInRow*3+nCarInRow+1] = '\0'; 00518 printf("%08X %s\n",address+n-nCarInRow,buffer); 00519 if (n>=len) 00520 return; 00521 } 00522 // inizializza buffer 00523 memset(buffer,' ',sizeof(buffer)); 00524 } 00525 if (n<len) 00526 { 00527 uint8_t car; 00528 file.RawRead(&car,1); 00529 00530 // scrive il carattere in esadecimale e carattere relativo 00531 sprintf(buffer+part*3,"%02X",car); 00532 buffer[part*3+2] = part==(nCarInRow/2-1)?'-':' '; 00533 // !!! settare come opzione carattere ? 00534 buffer[nCarInRow*3+1+part] = isprint(car)?car:'.'; 00535 } 00536 } 00537 } |
|
Definition at line 566 of file pefile.cpp. References _PE_IMAGE_RESOURCE_DIRECTORY::Characteristics, _PE_IMAGE_RESOURCE_DATA_ENTRY::CodePage, PeResourceDirectoryData::data, PeResourceDirectoryInfo::dir, PeResourceId::id, _PE_IMAGE_RESOURCE_DIRECTORY::MajorVersion, _PE_IMAGE_RESOURCE_DIRECTORY::MinorVersion, PeResourceId::name, _PE_IMAGE_RESOURCE_DIRECTORY::NumberOfIdEntries, _PE_IMAGE_RESOURCE_DIRECTORY::NumberOfNamedEntries, _PE_IMAGE_RESOURCE_DATA_ENTRY::OffsetToData, out_ws(), _PE_IMAGE_RESOURCE_DATA_ENTRY::Reserved, _PE_IMAGE_RESOURCE_DATA_ENTRY::Size, _PE_IMAGE_RESOURCE_DIRECTORY::TimeDateStamp, and WriteBinary().
00567 { 00568 // se siamo all'apice dell'albero 00569 if (level == 0 && data == NULL) 00570 { 00571 printf("Resources\n"); 00572 printf("%*s%-16s%08X\n",level*4,"","Characteristics",info->dir.Characteristics); 00573 time_t t = (time_t)info->dir.TimeDateStamp; 00574 printf("%*s%-16s%08X %s",level*4,"","TimeDateStamp",info->dir.TimeDateStamp,ctime(&t)); 00575 printf("%*s%-16s%i:%i\n",level*4,"","Version",info->dir.MajorVersion,info->dir.MinorVersion); 00576 } 00577 else 00578 { 00579 // se c'e' un livello superiore stampa id o nome 00580 // se dati bisogna prendere il livello corrente 00581 const PeResourceId* p = data?(const PeResourceId*)data:(const PeResourceId*)info; 00582 if (p) 00583 { 00584 printf("%*s",(level)*4,""); 00585 switch(level-1) 00586 { 00587 case 0: 00588 printf("Type "); 00589 switch(p->id) 00590 { 00591 case 1: printf("cursor"); break; 00592 case 2: printf("bitmap"); break; 00593 case 3: printf("icon"); break; 00594 case 4: printf("menu"); break; 00595 case 5: printf("dialog"); break; 00596 case 6: printf("string table"); break; 00597 case 7: printf("font directory"); break; 00598 case 8: printf("font"); break; 00599 case 9: printf("accelerators"); break; 00600 case 10: printf("unformatted resource data"); break; 00601 case 11: printf("message table"); break; 00602 case 12: printf("group cursor"); break; 00603 case 14: printf("group icon"); break; 00604 case 16: printf("version information"); break; 00605 case 17: printf("dialog include"); break; 00606 case 19: printf("plug & play"); break; 00607 case 20: printf("vxd"); break; 00608 case 21: printf("animate cursor"); break; 00609 case 22: printf("animate icon"); break; 00610 case 23: printf("html"); break; 00611 default: printf("unknown"); break; 00612 } 00613 if (p->name) 00614 { 00615 printf(" ("); 00616 out_ws(p->name); 00617 printf(")\n"); 00618 } 00619 else 00620 printf(" (%i)\n",p->id); 00621 break; 00622 case 1: 00623 if (p->name) 00624 { 00625 printf("ID "); 00626 out_ws(p->name); 00627 printf("\n"); 00628 } 00629 else 00630 printf("ID %i\n",p->id); 00631 break; 00632 case 2: 00633 if (p->name) 00634 { 00635 printf("LangID "); 00636 out_ws(p->name); 00637 printf("\n"); 00638 } 00639 else 00640 printf("LangID %i\n",p->id); 00641 break; 00642 default: 00643 if (p->name) 00644 { 00645 printf("Name "); 00646 out_ws(p->name); 00647 printf("\n"); 00648 } 00649 else 00650 printf("Name %08X\n",p->id); 00651 break; 00652 } 00653 } 00654 } 00655 00656 // for directory write available entries 00657 if (data == NULL) 00658 printf("%*s%-16s%i named %i id\n",level*4,"","Entryes",info->dir.NumberOfNamedEntries,info->dir.NumberOfIdEntries); 00659 00660 // for data write data information 00661 if (data) 00662 { 00663 printf("%*s%-16s%08X\n",(level)*4,"","OffsetToData",data->data.OffsetToData); 00664 printf("%*s%-16s%08X\n",(level)*4,"","Size",data->data.Size); 00665 printf("%*s%-16s%08X\n",(level)*4,"","CodePage",data->data.CodePage); 00666 printf("%*s%-16s%08X\n",(level)*4,"","Reserved",data->data.Reserved); 00667 // !!! use best method, save file ?? 00668 WriteBinary(file,data->data.Size); 00669 } 00670 } |
|
Initial value: { "Export", "Import", "Resource", "Exception", "Security", "Relocation", "Debug", "Copyright", "GlobalPtr", "TLS", "Load Configuration", "Bound Import", "IAT", "Delayed Imports", "COM Runtime", "Reserved" } Definition at line 42 of file pefile.cpp. Referenced by PeFile::WriteOptionalHdr(). |