Fixing decoding of sections
This commit is contained in:
parent
67da4ce715
commit
a0633653d2
@ -290,7 +290,8 @@ static int _pe_decode(FormatPlugin * format)
|
|||||||
struct pe_image_header_pe32 * pih32;
|
struct pe_image_header_pe32 * pih32;
|
||||||
struct pe_image_header_pe32_plus * pih32p;
|
struct pe_image_header_pe32_plus * pih32p;
|
||||||
struct pe_image_header_data * pid = NULL;
|
struct pe_image_header_data * pid = NULL;
|
||||||
off_t offset = 0;
|
off_t base = 0;
|
||||||
|
off_t offset;
|
||||||
struct pe_symbol ps;
|
struct pe_symbol ps;
|
||||||
|
|
||||||
/* read the MS-DOS header */
|
/* read the MS-DOS header */
|
||||||
@ -298,7 +299,8 @@ static int _pe_decode(FormatPlugin * format)
|
|||||||
return -1;
|
return -1;
|
||||||
if(helper->read(helper->format, &pm, sizeof(pm)) != sizeof(pm))
|
if(helper->read(helper->format, &pm, sizeof(pm)) != sizeof(pm))
|
||||||
return -1;
|
return -1;
|
||||||
/* read the PE header, skipping the PE signature */
|
/* FIXME check the PE signature */
|
||||||
|
/* read the PE header */
|
||||||
pm.offset = _htol16(pm.offset) + 4;
|
pm.offset = _htol16(pm.offset) + 4;
|
||||||
if(helper->seek(helper->format, pm.offset, SEEK_SET) != pm.offset)
|
if(helper->seek(helper->format, pm.offset, SEEK_SET) != pm.offset)
|
||||||
return -1;
|
return -1;
|
||||||
@ -329,7 +331,7 @@ static int _pe_decode(FormatPlugin * format)
|
|||||||
pih32 = (struct pe_image_header_pe32 *)(pih + 1);
|
pih32 = (struct pe_image_header_pe32 *)(pih + 1);
|
||||||
pih32->image_base = _htol32(pih32->image_base);
|
pih32->image_base = _htol32(pih32->image_base);
|
||||||
pih32->rvasizes_cnt = _htol32(pih32->rvasizes_cnt);
|
pih32->rvasizes_cnt = _htol32(pih32->rvasizes_cnt);
|
||||||
offset = pih32->image_base;
|
base = pih32->image_base;
|
||||||
pid = (struct pe_image_header_data *)(pih32 + 1);
|
pid = (struct pe_image_header_data *)(pih32 + 1);
|
||||||
cnt = pih32->rvasizes_cnt;
|
cnt = pih32->rvasizes_cnt;
|
||||||
}
|
}
|
||||||
@ -341,7 +343,7 @@ static int _pe_decode(FormatPlugin * format)
|
|||||||
pih32p = (struct pe_image_header_pe32_plus *)(pih + 1);
|
pih32p = (struct pe_image_header_pe32_plus *)(pih + 1);
|
||||||
pih32p->image_base = _htol64(pih32p->image_base);
|
pih32p->image_base = _htol64(pih32p->image_base);
|
||||||
pih32p->rvasizes_cnt = _htol32(pih32p->rvasizes_cnt);
|
pih32p->rvasizes_cnt = _htol32(pih32p->rvasizes_cnt);
|
||||||
offset = pih32p->image_base;
|
base = pih32p->image_base;
|
||||||
pid = (struct pe_image_header_data *)(pih32p + 1);
|
pid = (struct pe_image_header_data *)(pih32p + 1);
|
||||||
cnt = pih32p->rvasizes_cnt;
|
cnt = pih32p->rvasizes_cnt;
|
||||||
}
|
}
|
||||||
@ -362,17 +364,25 @@ static int _pe_decode(FormatPlugin * format)
|
|||||||
ph.opthdr_size, SEEK_CUR) != ph.opthdr_size)
|
ph.opthdr_size, SEEK_CUR) != ph.opthdr_size)
|
||||||
return _decode_error(format);
|
return _decode_error(format);
|
||||||
/* read and decode each section */
|
/* read and decode each section */
|
||||||
|
offset = pm.offset + sizeof(ph) + ph.opthdr_size;
|
||||||
|
if(ph.opthdr_size != 0 && helper->seek(helper->format, offset, SEEK_SET)
|
||||||
|
!= offset)
|
||||||
|
return _decode_error(format);
|
||||||
for(i = 0; i < ph.section_cnt; i++)
|
for(i = 0; i < ph.section_cnt; i++)
|
||||||
{
|
{
|
||||||
if(helper->read(helper->format, &psh, sizeof(psh))
|
if(helper->read(helper->format, &psh, sizeof(psh))
|
||||||
!= sizeof(psh))
|
!= sizeof(psh))
|
||||||
break;
|
break;
|
||||||
|
offset += sizeof(psh);
|
||||||
psh.name[sizeof(psh.name) - 1] = '\0';
|
psh.name[sizeof(psh.name) - 1] = '\0';
|
||||||
psh.vaddr = _htol32(psh.vaddr);
|
psh.vaddr = _htol32(psh.vaddr);
|
||||||
psh.raw_size = _htol32(psh.raw_size);
|
psh.raw_size = _htol32(psh.raw_size);
|
||||||
psh.raw_offset = _htol32(psh.raw_offset);
|
psh.raw_offset = _htol32(psh.raw_offset);
|
||||||
helper->decode(helper->format, psh.name, psh.raw_offset,
|
if(helper->decode(helper->format, psh.name, psh.raw_offset,
|
||||||
psh.raw_size, psh.vaddr + offset);
|
psh.raw_size, psh.vaddr + base) != 0)
|
||||||
|
break;
|
||||||
|
if(helper->seek(helper->format, offset, SEEK_SET) != offset)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if(i != ph.section_cnt)
|
if(i != ph.section_cnt)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user