0
@@ -108,19 +108,19 @@ binject_exe_resources(binject_exe_t *binj, int offset, int level, int res_type)
0
BINJ_READ_POS(binj, binj->resource_dir, binj->section_header.PointerToRawData + offset);
0
+ FLIPENDIANLE(binj->resource_dir.NumberOfNamedEntries);
0
+ FLIPENDIANLE(binj->resource_dir.NumberOfIdEntries);
0
- // print_resource_dir(&binj->resource_dir, 0);
0
count = binj->resource_dir.NumberOfNamedEntries + binj->resource_dir.NumberOfIdEntries;
0
for (i = 0; i < count; i++)
0
BINJ_READ_POS(binj, binj->resource_dir_entry, binj->section_header.PointerToRawData + offset);
0
- // if (res_type == 0 || res_type == 10 || res_type == 6)
0
- // print_resource_dir_entry(&binj->resource_dir_entry, level);
0
+ FLIPENDIANLE(binj->resource_dir_entry.OffsetToData);
0
if ((binj->resource_dir_entry.OffsetToData & 0x80000000) == 0)
0
@@ -181,15 +181,17 @@ binject_exe_write_name(binject_exe_t *binj, char *out, VALUE klass, int index)
0
+ unsigned
short int *datlen;
0
VALUE key = binject_exe_get_key(binj, klass, index);
0
- datlen = (unsigned int *)(out + binj->namestart);
0
- *datlen = (unsigned int)RSTRING_LEN(key);
0
+ datlen = (unsigned short int *)(out + binj->namestart);
0
+ *datlen = (unsigned short int)RSTRING_LEN(key);
0
+ FLIPENDIANLE(*datlen);
0
str = RSTRING_PTR(key);
0
for (i = 0; i < RSTRING_LEN(key); i++)
0
- datlen = (unsigned int *)(out + binj->namestart + 2 + (i * 2));
0
- *datlen = (unsigned int)str[i];
0
+ datlen = (unsigned short int *)(out + binj->namestart + 2 + (i * 2));
0
+ *datlen = (unsigned short int)str[i];
0
+ FLIPENDIANLE(*datlen);
0
return 2 + (RSTRING_LEN(key) * 2);
0
@@ -334,6 +336,10 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
struct resource_data_t *rdat, *rdat2;
0
// printf("DIR[%d]: %x TO %x\n", level, offset, offset2);
0
BINJ_COPY(rd2, rd, struct resource_dir_t, offset, offset2);
0
+ FLIPENDIANLE(rd->NumberOfIdEntries);
0
+ FLIPENDIANLE(rd->NumberOfNamedEntries);
0
+ FLIPENDIANLE(rd2->NumberOfIdEntries);
0
+ FLIPENDIANLE(rd2->NumberOfNamedEntries);
0
ins = binject_exe_new_ids(binj);
0
@@ -351,6 +357,8 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
ins = RARRAY_LEN(binj->adds);
0
+ FLIPENDIANLE(rd2->NumberOfIdEntries);
0
+ FLIPENDIANLE(rd2->NumberOfNamedEntries);
0
@@ -358,12 +366,15 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
for (i = 0; i < count; i++)
0
rde = (struct resource_dir_entry_t *)(buf + offset);
0
+ FLIPENDIANLE(rde->Name);
0
+ FLIPENDIANLE(rde->OffsetToData);
0
if (level == 0 && res_type > 10 && ins > 0)
0
- unsigned int ti = 0, i2 = 0, doff = 0, doff2 = 0, btype = 0, oc = 0, padlen = 0, oo = 0;
0
+ unsigned int ti = 0, i2 = 0, doff = 0, doff2 = 0, doff3 = 0, doff4 = 0,
0
+ btype = 0, oc = 0, padlen = 0, oo = 0;
0
for (ti = 0; ti < 2; ti++)
0
ctype = (ti == 0 ? rb_cString : rb_cFile);
0
@@ -373,33 +384,47 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
rde = (struct resource_dir_entry_t *)(buf + offset);
0
rde2 = (struct resource_dir_entry_t *)(out + offset2);
0
rde2->OffsetToData = rde->OffsetToData + binject_exe_offset(binj, 0, btype) + (ti * 16) + (oc * 8);
0
// printf("STRING ENTRY[0] @ %x (%u, %x)\n", (char *)rde2 - out, rde2->Name, rde2->OffsetToData);
0
oo = rde->OffsetToData & 0x7fffffff;
0
doff = rde2->OffsetToData & 0x7fffffff;
0
+ FLIPENDIANLE(rde2->Name);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
rd2 = (struct resource_dir_t *)(out + doff);
0
rd2->NumberOfNamedEntries = binject_exe_count_type(binj, ctype);
0
+ FLIPENDIANLE(rd2->NumberOfNamedEntries);
0
// printf("STRING DIR[1]: %x\n", doff);
0
for (i2 = 0; i2 < binject_exe_count_type(binj, ctype); i2++)
0
rde = (struct resource_dir_entry_t *)(buf + oo + 16);
0
+ doff3 = rde->OffsetToData;
0
rde2 = (struct resource_dir_entry_t *)(out + doff + 16 + (i2 * 8));
0
// printf("STRING ENTRY[1] @ %x / NAME(%x)\n", (char *)rde2 - out, binj->namestart);
0
rde2->Name = 0x80000000 | binj->namestart;
0
- rde2->OffsetToData =
rde->OffsetToData + binject_exe_offset(binj, 1, btype) + (oc * 24);
0
+ rde2->OffsetToData =
doff3 + binject_exe_offset(binj, 1, btype) + (oc * 24);
0
binj->namestart += binject_exe_write_name(binj, out, ctype, i2);
0
doff2 = rde2->OffsetToData & 0x7fffffff;
0
+ FLIPENDIANLE(rde2->Name);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
rd2 = (struct resource_dir_t *)(out + doff2);
0
rd2->NumberOfIdEntries = 1;
0
- // printf("STRING DIR[2]: %x / %x (%x)\n", rde2->Name, rde2->OffsetToData, rde->OffsetToData);
0
- rde = (struct resource_dir_entry_t *)(buf + (rde->OffsetToData & 0x7fffffff) + 16);
0
+ FLIPENDIANLE(rd2->NumberOfIdEntries);
0
+ // printf("STRING DIR[2]: %x / %x (%x)\n", rde2->Name, rde2->OffsetToData, doff3);
0
+ rde = (struct resource_dir_entry_t *)(buf + (doff3 & 0x7fffffff) + 16);
0
+ doff4 = rde->OffsetToData;
0
rde2 = (struct resource_dir_entry_t *)(out + doff2 + 16);
0
// printf("STRING ENTRY[2] @ %x\n", (char *)rde2 - out);
0
- rde2->OffsetToData = rde->OffsetToData + binject_exe_offset(binj, 2, btype) + (oc * 16);
0
- // printf("RESDATA: %x / %x\n", rde->OffsetToData, rde2->OffsetToData);
0
+ rde2->OffsetToData = doff4 + binject_exe_offset(binj, 2, btype) + (oc * 16);
0
+ // printf("RESDATA: %x / %x\n", doff4, rde2->OffsetToData);
0
obj = binject_exe_get_type(binj, ctype, i2);
0
// printf("DATA: %x\n", binj->datapos);
0
rdat = (struct resource_data_t *)(out + (rde2->OffsetToData));
0
@@ -423,6 +448,10 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
binject_exe_string_copy(binj, pe_pad, padlen, binj->datapos, binj->proc);
0
binj->datapos += padlen;
0
+ FLIPENDIANLE(rdat->Size);
0
+ FLIPENDIANLE(rdat->OffsetToData);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
@@ -439,6 +468,10 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
unsigned int dataoff = offset2 + rde2->OffsetToData;
0
BINJ_COPY(rdat2, rdat, struct resource_data_t, rde->OffsetToData, rde2->OffsetToData);
0
+ FLIPENDIANLE(rdat->Size);
0
+ FLIPENDIANLE(rdat->OffsetToData);
0
+ FLIPENDIANLE(rdat2->Size);
0
+ FLIPENDIANLE(rdat2->OffsetToData);
0
rdat2->OffsetToData = binj->datapos + binj->vdelta;
0
// printf("RESDATA: %x TO %x AT %x / %x\n", rde->OffsetToData, rde2->OffsetToData,
0
// binj->namestart, binj->datastart);
0
@@ -447,6 +480,8 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
// printf("DATA: %x TO %x\n", rdat->OffsetToData, binj->datapos);
0
binj->datapos += rdat->Size;
0
binj->dataend = (rdat->OffsetToData - binj->vdelta) + rdat->Size;
0
+ FLIPENDIANLE(rdat2->Size);
0
+ FLIPENDIANLE(rdat2->OffsetToData);
0
@@ -463,6 +498,9 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
+ FLIPENDIANLE(rde2->Name);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
@@ -472,15 +510,18 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
binject_exe_load(VALUE self, VALUE file)
0
Data_Get_Struct(self, binject_exe_t, binj);
0
binj->file = rb_fopen(RSTRING_PTR(file), "rb");
0
BINJ_READ(binj, binj->dos_header);
0
+ FLIPENDIANLE(binj->dos_header.e_lfanew);
0
fseek(binj->file, binj->dos_header.e_lfanew, SEEK_SET);
0
BINJ_READ(binj, binj->signature);
0
BINJ_READ(binj, binj->image_file_header);
0
+ FLIPENDIANLE(binj->image_file_header.SizeOfOptionalHeader);
0
+ FLIPENDIANLE(binj->image_file_header.NumberOfSections);
0
if (binj->image_file_header.SizeOfOptionalHeader != 0)
0
fread(&binj->image_optional_header, sizeof(char),
0
@@ -490,6 +531,8 @@ binject_exe_load(VALUE self, VALUE file)
0
for (i = 0; i < binj->image_file_header.NumberOfSections; i++)
0
BINJ_READ(binj, binj->section_header);
0
+ FLIPENDIANLE(binj->section_header.VirtualAddress);
0
+ FLIPENDIANLE(binj->section_header.PointerToRawData);
0
if (strcmp(binj->section_header.Name, ".rsrc") == 0)
0
binject_exe_resources(binj, 0, 0, 0);
0
@@ -554,15 +597,23 @@ binject_exe_save(VALUE self, VALUE file)
0
fseek(binj->out, 0, SEEK_SET);
0
fread(buf, sizeof(char), 1024, binj->file);
0
unsigned int *uninit = (unsigned int *)(buf + (binj->dos_header.e_lfanew + 32));
0
+ FLIPENDIANLE(*uninit);
0
*uninit += grow - binj->vdelta;
0
+ FLIPENDIANLE(*uninit);
0
uninit = (unsigned int *)(buf + (binj->dos_header.e_lfanew + 80));
0
+ FLIPENDIANLE(*uninit);
0
+ FLIPENDIANLE(*uninit);
0
int *resd = (int *)(buf + (binj->dos_header.e_lfanew + 140));
0
resd = (int *)(buf + (binj->dos_header.e_lfanew + 376));
0
uninit = (unsigned int *)(buf + (binj->dos_header.e_lfanew + 384));
0
+ FLIPENDIANLE(*uninit);
0
+ FLIPENDIANLE(*uninit);
0
fwrite(buf, sizeof(char), 1024, binj->out);
0
fseek(binj->out, binj->datapos, SEEK_SET);
Comments
No one has commented yet.