Rev 908 | Rev 1066 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 908 | Rev 914 | ||
---|---|---|---|
Line 38... | Line 38... | ||
38 | }; |
38 | }; |
39 | 39 | ||
Line 40... | Line 40... | ||
40 | int __stdcall strncmp(const char *s1, const char *s2, size_t n); |
40 | int __stdcall strncmp(const char *s1, const char *s2, size_t n); |
Line 41... | Line -... | ||
41 | - | ||
42 | void __export create_image(addr_t img_base, addr_t raw) asm ("CreateImage"); |
41 | |
Line 43... | Line 42... | ||
43 | bool link_image(addr_t img_base); |
42 | bool link_image(addr_t img_base); |
Line 44... | Line 43... | ||
44 | 43 | ||
Line 57... | Line 56... | ||
57 | return NULL; |
56 | return NULL; |
58 | }; |
57 | }; |
59 | */ |
58 | */ |
Line 60... | Line 59... | ||
60 | 59 | ||
61 | bool validate_pe(void *raw, size_t raw_size) |
60 | bool validate_pe(void *raw, size_t raw_size, bool is_exec) |
62 | { |
61 | { |
63 | PIMAGE_DOS_HEADER dos; |
62 | PIMAGE_DOS_HEADER dos; |
Line 64... | Line 63... | ||
64 | PIMAGE_NT_HEADERS32 nt; |
63 | PIMAGE_NT_HEADERS32 nt; |
Line 78... | Line 77... | ||
78 | 77 | ||
Line 79... | Line 78... | ||
79 | if(nt->Signature != IMAGE_NT_SIGNATURE) |
78 | if(nt->Signature != IMAGE_NT_SIGNATURE) |
80 | return false; |
79 | return false; |
Line -... | Line 80... | ||
- | 80 | ||
- | 81 | if(nt->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) |
|
- | 82 | return false; |
|
- | 83 | ||
- | 84 | if(is_exec && (nt->FileHeader.Characteristics & IMAGE_FILE_DLL)) |
|
- | 85 | return false; |
|
81 | 86 | ||
82 | if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) |
87 | if(nt->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) |
Line -... | Line 88... | ||
- | 88 | return false; |
|
- | 89 | ||
- | 90 | if( is_exec && nt->OptionalHeader.ImageBase != 0) |
|
83 | return false; |
91 | return false; |
84 | 92 | ||
85 | if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE) |
93 | if(nt->OptionalHeader.SectionAlignment < PAGE_SIZE) |
86 | { |
94 | { |
87 | if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment) |
95 | if(nt->OptionalHeader.FileAlignment != nt->OptionalHeader.SectionAlignment) |
Line 125... | Line 133... | ||
125 | DBG("file not found: %s\n", path); |
133 | DBG("file not found: %s\n", path); |
126 | return NULL; |
134 | return NULL; |
127 | }; |
135 | }; |
128 | 136 | ||
Line 129... | Line 137... | ||
129 | if( ! validate_pe(raw, raw_size) ) |
137 | if( ! validate_pe(raw, raw_size, false) ) |
130 | { |
138 | { |
131 | DBG("invalid pe file %s\n", path); |
139 | DBG("invalid pe file %s\n", path); |
132 | mem_free(raw); |
140 | mem_free(raw); |
133 | return NULL; |
141 | return NULL; |
134 | } |
142 | } |
Line 148... | Line 156... | ||
148 | }; |
156 | }; |
149 | 157 | ||
Line 150... | Line 158... | ||
150 | img_base = img_md->base; |
158 | img_base = img_md->base; |
Line 151... | Line 159... | ||
151 | 159 | ||
Line 152... | Line 160... | ||
152 | create_image(img_base, (addr_t)raw); |
160 | create_image(img_base, (addr_t)raw, true); |
Line 153... | Line 161... | ||
153 | 161 | ||
154 | mem_free(raw); |
162 | mem_free(raw); |
Line 188... | Line 196... | ||
188 | }; |
196 | }; |
189 | */ |
197 | */ |
190 | 198 | ||
Line 191... | Line 199... | ||
191 | 199 | ||
192 | void create_image(addr_t img_base, addr_t raw) |
200 | void create_image(addr_t img_base, addr_t raw, bool force_clear) |
193 | { |
201 | { |
194 | PIMAGE_DOS_HEADER dos; |
202 | PIMAGE_DOS_HEADER dos; |
195 | PIMAGE_NT_HEADERS32 nt; |
203 | PIMAGE_NT_HEADERS32 nt; |
Line 221... | Line 229... | ||
221 | 229 | ||
Line 222... | Line 230... | ||
222 | if(img_sec->SizeOfRawData) |
230 | if(img_sec->SizeOfRawData) |
223 | sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData); |
231 | sec_copy(dest_ptr, src_ptr, img_sec->SizeOfRawData); |
Line -... | Line 232... | ||
- | 232 | ||
- | 233 | if(force_clear) |
|
224 | 234 | { |
|
Line 225... | Line 235... | ||
225 | sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align; |
235 | sec_size = (img_sec->Misc.VirtualSize + sec_align -1) & -sec_align; |
226 | 236 | ||
227 | if(sec_size > img_sec->SizeOfRawData) |
237 | if(sec_size > img_sec->SizeOfRawData) |
- | 238 | sec_clear(dest_ptr + img_sec->SizeOfRawData, |
|
228 | sec_clear(dest_ptr + img_sec->SizeOfRawData, |
239 | sec_size - img_sec->SizeOfRawData); |
229 | sec_size - img_sec->SizeOfRawData); |
240 | }; |
Line 230... | Line 241... | ||
230 | img_sec++; |
241 | img_sec++; |
231 | } |
242 | }; |
232 | 243 |