Rev 6702 | Details | Compare with Previous | 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 |
||
6699 | clevermous | 30 | load TimeDateStamp dword from 8 |
5039 | clevermous | 31 | load SizeOfOptionalHeader word from 14h |
32 | if SizeOfOptionalHeader<>0E0h |
||
33 | error Nonstandard PE header |
||
34 | end if |
||
35 | load Characteristics word from 16h |
||
36 | load AddressOfEntryPoint dword from 28h |
||
37 | load ImageBase dword from 34h |
||
38 | load SectionAlignment dword from 38h |
||
39 | load FileAlignment dword from 3Ch |
||
40 | load MajorOperatingSystemVersion word from 40h |
||
41 | load MinorOperatingSystemVersion word from 42h |
||
42 | load MajorSubsystemVersion word from 48h |
||
43 | load MinorSubsystemVersion word from 4Ah |
||
44 | load SizeOfImage dword from 50h |
||
45 | load SizeOfHeaders dword from 54h |
||
46 | load Subsystem word from 5Ch |
||
47 | load SizeOfStackReserve dword from 60h |
||
48 | load SizeOfHeapReserve dword from 68h |
||
49 | load SrcNumberOfRvaAndSizes dword from 74h |
||
50 | |||
51 | DstNumberOfRvaAndSizes = 0 |
||
52 | irps dir,SPE_DIR_ORDER |
||
53 | { |
||
54 | if IMAGE_DIRECTORY_ENTRY_#dir < SrcNumberOfRvaAndSizes |
||
55 | load DirRVA_#dir dword from 78h + 8*IMAGE_DIRECTORY_ENTRY_#dir |
||
56 | load DirSize_#dir dword from 7Ch + 8*IMAGE_DIRECTORY_ENTRY_#dir |
||
57 | else |
||
58 | DirRVA_#dir = 0 |
||
59 | DirSize_#dir = 0 |
||
60 | end if |
||
61 | if DirRVA_#dir > 0 & DirSize_#dir > 0 |
||
62 | DstNumberOfRvaAndSizes = SPE_DIRECTORY_#dir + 1 |
||
63 | end if |
||
64 | } |
||
65 | |||
66 | end virtual |
||
67 | |||
68 | SectionAlignmentLog = 0 |
||
69 | while SectionAlignment <> 1 shl SectionAlignmentLog |
||
70 | SectionAlignmentLog = SectionAlignmentLog + 1 |
||
71 | end while |
||
72 | FileAlignmentLog = 0 |
||
73 | while FileAlignment <> 1 shl FileAlignmentLog |
||
74 | FileAlignmentLog = FileAlignmentLog + 1 |
||
75 | end while |
||
76 | |||
77 | ; header |
||
78 | dw 'PE' xor 'S' ; Signature |
||
79 | dw Characteristics or 0x100 ; IMAGE_FILE_32BIT_MACHINE |
||
80 | dd AddressOfEntryPoint |
||
81 | dd ImageBase |
||
82 | db SectionAlignmentLog |
||
83 | db FileAlignmentLog |
||
84 | db MajorSubsystemVersion |
||
85 | db MinorSubsystemVersion |
||
86 | dd SizeOfImage |
||
87 | dd SizeOfStackReserve |
||
88 | dd SizeOfHeapReserve |
||
89 | SizeOfHeadersField: |
||
90 | dd 0 |
||
91 | db Subsystem |
||
92 | db DstNumberOfRvaAndSizes |
||
93 | dw NumberOfSections |
||
94 | ; directories |
||
95 | irps dir,SPE_DIR_ORDER |
||
96 | { |
||
97 | if SPE_DIRECTORY_#dir < DstNumberOfRvaAndSizes |
||
98 | dd DirRVA_#dir, DirSize_#dir |
||
99 | end if |
||
100 | } |
||
101 | |||
102 | NumBytesDeleted = pehea + 0F8h - $ + NumberOfSections*0Ch |
||
103 | DeltaDeleted = NumBytesDeleted and not (FileAlignment - 1) |
||
104 | ; Use store instead of declaring SizeOfHeaders - DeltaDeleted directly in dd |
||
105 | ; to avoid the second compilation pass. |
||
106 | store dword SizeOfHeaders - DeltaDeleted at SizeOfHeadersField |
||
6699 | clevermous | 107 | TimeStampInExportTable = 0 |
5039 | clevermous | 108 | ; sections |
109 | repeat NumberOfSections |
||
110 | file filename:pehea+0F8h+(%-1)*28h,18h |
||
6699 | clevermous | 111 | load VirtualSize dword from $-10h |
112 | load VirtualAddress dword from $-0Ch |
||
113 | load SizeOfRawData dword from $-8 |
||
114 | load PointerToRawData dword from $-4 |
||
115 | PointerToRawData = PointerToRawData - DeltaDeleted |
||
116 | store dword PointerToRawData at $-4 |
||
117 | if DirRVA_EXPORT <> 0 & DirRVA_EXPORT+4 >= VirtualAddress & DirRVA_EXPORT+8 <= VirtualAddress + VirtualSize & DirRVA_EXPORT+8 <= VirtualAddress + SizeOfRawData |
||
118 | TimeStampInExportTable = DirRVA_EXPORT+4 - VirtualAddress + PointerToRawData |
||
119 | end if |
||
5039 | clevermous | 120 | file filename:pehea+0F8h+(%-1)*28h+24h,4 |
121 | end repeat |
||
122 | ; padding to keep FileAlignment |
||
123 | times NumBytesDeleted - DeltaDeleted db 0 |
||
124 | ; data |
||
125 | file filename:pehea+0F8h+NumberOfSections*28h |
||
6703 | clevermous | 126 | if TimeDateStamp <> 0 & TimeStampInExportTable <> 0 |
6699 | clevermous | 127 | store dword TimeDateStamp at TimeStampInExportTable |
128 | end if>>=>=>>>>>>> |