1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
TEXT mzhdr(SB), 1, $0
BYTE $'M'; BYTE $'Z'
WORD $0 /* e_cblp UNUSED */
WORD $0 /* e_cp UNUSED */
WORD $0 /* e_crlc UNUSED */
WORD $0 /* e_cparhdr UNUSED */
WORD $0 /* e_minalloc UNUSED */
WORD $0 /* e_maxalloc UNUSED */
WORD $0 /* e_ss UNUSED */
WORD $0 /* e_sp UNUSED */
WORD $0 /* e_csum UNUSED */
WORD $0 /* e_ip UNUSED */
WORD $0 /* e_cs UNUSED */
WORD $0 /* e_lsarlc UNUSED */
WORD $0 /* e_ovno UNUSED */
WORD $0 /* e_res UNUSED */
WORD $0
WORD $0
WORD $0
WORD $0
WORD $0 /* e_oemid UNUSED */
WORD $0 /* e_res2 UNUSED */
WORD $0
WORD $0
WORD $0
WORD $0
WORD $0
WORD $0
WORD $0
WORD $0
WORD $0
LONG $pehdr-IMAGEBASE(SB) /* offset to pe header */
TEXT pehdr(SB), 1, $0
BYTE $'P'; BYTE $'E'; BYTE $0; BYTE $0
WORD $0x014C /* Machine (Intel 386) */
WORD $1 /* NumberOfSections */
LONG $0 /* TimeDateStamp UNUSED */
LONG $0 /* PointerToSymbolTable UNUSED */
LONG $0 /* NumberOfSymbols UNUSED */
WORD $0xE0 /* SizeOfOptionalHeader */
WORD $2103 /* Characteristics (no relocations, executable, 32 bit) */
WORD $0x10B /* Magic (PE32) */
BYTE $9 /* MajorLinkerVersion UNUSED */
BYTE $0 /* MinorLinkerVersion UNUSED */
LONG $0 /* SizeOfCode UNUSED */
LONG $0 /* SizeOfInitializedData UNUSED */
LONG $0 /* SizeOfUninitializedData UNUSED */
LONG $start-IMAGEBASE(SB)/* AddressOfEntryPoint */
LONG $0 /* BaseOfCode UNUSED */
LONG $0 /* BaseOfData UNUSED */
LONG $IMAGEBASE /* ImageBase */
LONG $0x200 /* SectionAlignment */
LONG $0x200 /* FileAlignment */
WORD $4 /* MajorOperatingSystemVersion UNUSED */
WORD $0 /* MinorOperatingSystemVersion UNUSED */
WORD $0 /* MajorImageVersion UNUSED */
WORD $0 /* MinorImageVersion UNUSED */
WORD $4 /* MajorSubsystemVersion */
WORD $0 /* MinorSubsystemVersion UNUSED */
LONG $0 /* Win32VersionValue UNUSED */
LONG $end-IMAGEBASE(SB) /* SizeOfImage */
LONG $start-IMAGEBASE(SB)/* SizeOfHeaders */
LONG $0 /* CheckSum UNUSED */
WORD $10 /* Subsystem (10 = efi application) */
WORD $0 /* DllCharacteristics UNUSED */
LONG $0 /* SizeOfStackReserve UNUSED */
LONG $0 /* SizeOfStackCommit UNUSED */
LONG $0 /* SizeOfHeapReserve UNUSED */
LONG $0 /* SizeOfHeapCommit UNUSED */
LONG $0 /* LoaderFlags UNUSED */
LONG $16 /* NumberOfRvaAndSizes UNUSED */
LONG $0; LONG $0
LONG $0; LONG $0
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
LONG $0; LONG $0 /* RVA */
BYTE $'.'; BYTE $'t'; BYTE $'e'; BYTE $'x'
BYTE $'t'; BYTE $0; BYTE $0; BYTE $0
LONG $edata-(IMAGEBASE+0x200)(SB) /* VirtualSize */
LONG $start-IMAGEBASE(SB) /* VirtualAddress */
LONG $edata-(IMAGEBASE+0x200)(SB) /* SizeOfData */
LONG $start-IMAGEBASE(SB) /* PointerToRawData */
LONG $0 /* PointerToRelocations UNUSED */
LONG $0 /* PointerToLinenumbers UNUSED */
WORD $0 /* NumberOfRelocations UNUSED */
WORD $0 /* NumberOfLinenumbers UNUSED */
LONG $0x86000020 /* Characteristics (code, execute, read, write) */
/* padding to get start(SB) at IMAGEBASE+0x200 */
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
LONG $0; LONG $0; LONG $0; LONG $0;
TEXT start(SB), 1, $0
CALL reloc(SP)
TEXT reloc(SB), 1, $0
MOVL 0(SP), SI
SUBL $reloc-IMAGEBASE(SB), SI
MOVL $IMAGEBASE, DI
MOVL $edata-IMAGEBASE(SB), CX
CLD
REP; MOVSB
MOVL $efimain(SB), DI
MOVL DI, (SP)
RET
TEXT jump(SB), $0
CLI
MOVL 4(SP), AX
JMP *AX
TEXT eficall(SB), 1, $0
MOVL SP, SI
MOVL SP, DI
MOVL $(4*16), CX
SUBL CX, DI
ANDL $~15ULL, DI
SUBL $8, DI
MOVL 4(SI), AX
LEAL 8(DI), SP
CLD
REP; MOVSB
SUBL $(4*16), SI
CALL AX
MOVL SI, SP
RET
|