Rev 6699 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5039 | clevermous | 1 | ; If you know macro language of FASM, there is almost nothing to comment here. |
2 | ; If you don't know macro language of FASM, comments would not help you. |
||
3 | |||
4 | filename equ '%EXENAME%' |
||
5 | |||
6 | SPE_DIR_ORDER fix IMPORT EXPORT BASERELOC EXCEPTION TLS BOUND_IMPORT RESOURCE |
||
7 | count = 0 |
||
8 | irps dir,SPE_DIR_ORDER |
||
9 | { |
||
10 | SPE_DIRECTORY_#dir = count |
||
11 | count = count + 1 |
||
12 | } |
||
13 | |||
14 | IMAGE_DIRECTORY_ENTRY_EXPORT = 0 |
||
15 | IMAGE_DIRECTORY_ENTRY_IMPORT = 1 |
||
16 | IMAGE_DIRECTORY_ENTRY_RESOURCE = 2 |
||
17 | IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3 |
||
18 | IMAGE_DIRECTORY_ENTRY_BASERELOC = 5 |
||
19 | IMAGE_DIRECTORY_ENTRY_TLS = 9 |
||
20 | IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11 |
||
21 | |||
22 | virtual at 0 |
||
23 | file filename:3Ch,4 |
||
24 | load pehea dword from 0 |
||
25 | end virtual |
||
26 | |||
27 | virtual at 0 |
||
28 | file filename:pehea,0F8h |
||
29 | load NumberOfSections word from 6 |
||
30 | load SizeOfOptionalHeader word from 14h |
||
31 | if SizeOfOptionalHeader<>0E0h |
||
32 | error Nonstandard PE header |
||
33 | end if |
||
34 | load Characteristics word from 16h |
||
35 | load AddressOfEntryPoint dword from 28h |
||
36 | load ImageBase dword from 34h |
||
37 | load SectionAlignment dword from 38h |
||
38 | load FileAlignment dword from 3Ch |
||
39 | load MajorOperatingSystemVersion word from 40h |
||
40 | load MinorOperatingSystemVersion word from 42h |
||
41 | load MajorSubsystemVersion word from 48h |
||
42 | load MinorSubsystemVersion word from 4Ah |
||
43 | load SizeOfImage dword from 50h |
||
44 | load SizeOfHeaders dword from 54h |
||
45 | load Subsystem word from 5Ch |
||
46 | load SizeOfStackReserve dword from 60h |
||
47 | load SizeOfHeapReserve dword from 68h |
||
48 | load SrcNumberOfRvaAndSizes dword from 74h |
||
49 | |||
50 | DstNumberOfRvaAndSizes = 0 |
||
51 | irps dir,SPE_DIR_ORDER |
||
52 | { |
||
53 | if IMAGE_DIRECTORY_ENTRY_#dir < SrcNumberOfRvaAndSizes |
||
54 | load DirRVA_#dir dword from 78h + 8*IMAGE_DIRECTORY_ENTRY_#dir |
||
55 | load DirSize_#dir dword from 7Ch + 8*IMAGE_DIRECTORY_ENTRY_#dir |
||
56 | else |
||
57 | DirRVA_#dir = 0 |
||
58 | DirSize_#dir = 0 |
||
59 | end if |
||
60 | if DirRVA_#dir > 0 & DirSize_#dir > 0 |
||
61 | DstNumberOfRvaAndSizes = SPE_DIRECTORY_#dir + 1 |
||
62 | end if |
||
63 | } |
||
64 | |||
65 | end virtual |
||
66 | |||
67 | SectionAlignmentLog = 0 |
||
68 | while SectionAlignment <> 1 shl SectionAlignmentLog |
||
69 | SectionAlignmentLog = SectionAlignmentLog + 1 |
||
70 | end while |
||
71 | FileAlignmentLog = 0 |
||
72 | while FileAlignment <> 1 shl FileAlignmentLog |
||
73 | FileAlignmentLog = FileAlignmentLog + 1 |
||
74 | end while |
||
75 | |||
76 | ; header |
||
77 | dw 'PE' xor 'S' ; Signature |
||
78 | dw Characteristics or 0x100 ; IMAGE_FILE_32BIT_MACHINE |
||
79 | dd AddressOfEntryPoint |
||
80 | dd ImageBase |
||
81 | db SectionAlignmentLog |
||
82 | db FileAlignmentLog |
||
83 | db MajorSubsystemVersion |
||
84 | db MinorSubsystemVersion |
||
85 | dd SizeOfImage |
||
86 | dd SizeOfStackReserve |
||
87 | dd SizeOfHeapReserve |
||
88 | SizeOfHeadersField: |
||
89 | dd 0 |
||
90 | db Subsystem |
||
91 | db DstNumberOfRvaAndSizes |
||
92 | dw NumberOfSections |
||
93 | ; directories |
||
94 | irps dir,SPE_DIR_ORDER |
||
95 | { |
||
96 | if SPE_DIRECTORY_#dir < DstNumberOfRvaAndSizes |
||
97 | dd DirRVA_#dir, DirSize_#dir |
||
98 | end if |
||
99 | } |
||
100 | |||
101 | NumBytesDeleted = pehea + 0F8h - $ + NumberOfSections*0Ch |
||
102 | DeltaDeleted = NumBytesDeleted and not (FileAlignment - 1) |
||
103 | ; Use store instead of declaring SizeOfHeaders - DeltaDeleted directly in dd |
||
104 | ; to avoid the second compilation pass. |
||
105 | store dword SizeOfHeaders - DeltaDeleted at SizeOfHeadersField |
||
106 | ; sections |
||
107 | repeat NumberOfSections |
||
108 | file filename:pehea+0F8h+(%-1)*28h,18h |
||
109 | load a dword from $-4 |
||
110 | store dword a-DeltaDeleted at $-4 |
||
111 | file filename:pehea+0F8h+(%-1)*28h+24h,4 |
||
112 | end repeat |
||
113 | ; padding to keep FileAlignment |
||
114 | times NumBytesDeleted - DeltaDeleted db 0 |
||
115 | ; data |
||
116 | file filename:pehea+0F8h+NumberOfSections*28h>>>>> |