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
|
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
160
161
|
-
-
-
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
+
-
-
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
+
-
-
-
+
+
|
; macroinstruction for importing functions in Linux
include '_elf.inc'
macro interpreter [library]
{
db library,0
}
; creates symbols list with needed libraries.
macro import_proto library, [name, arg]
{
common
local str
match needed,needed@dynamic \{ define needed@dynamic needed, str:library \}
match ,needed@dynamic \{ define needed@dynamic str:library \}
local str, cnt, use
match needed,needed@dynamic \{ define needed@dynamic needed, str:cnt:use:library \}
match ,needed@dynamic \{ define needed@dynamic str:cnt:use:library \}
forward
match imported, imported@dynamic \{ imported@dynamic equ imported, name \}
match ,imported@dynamic \{ imported@dynamic equ name \}
match imported, imported@dynamic \{ imported@dynamic equ imported, cnt:name \}
match ,imported@dynamic \{ imported@dynamic equ cnt:name \}
define name#@arg arg
}
define needed@dynamic
define imported@dynamic
macro define_import_arguments name, [argument] {
macro __define_import_arguments_var name, args {
common
virtual at ebp+8
forward
name#argument dd ?
common
end virtual
}
macro __define_import_arguments name {
common
if name#@arg eq VOID
.__info.argtype=1
else
if name#@arg eq NONE
.__info.argtype = 0
else
__define_import_arguments_var name, name#@arg
.__info.argtype = 2
end if
end if
}
struc def_name name {
db `name, 0
}
macro __do_import [name]
macro __do_import [cntandname]
{
common
local strtab,strsz,symtab,rel,relsz,hash
segment dynamic readable
match needed,needed@dynamic \{
irp item, needed \\{ match str:library,item \\\{ dd DT_NEEDED,str-strtab \\\} \\}
match needed, needed@dynamic \{
irp item, needed \\{
match str:cnt:use:library, item \\\{
cnt = 0
if use > 0
dd DT_NEEDED, str-strtab
end if
\\\}
\\}
\}
dd DT_STRTAB, strtab
dd DT_STRSZ, strsz
dd DT_SYMTAB, symtab
dd DT_SYMENT, sizeof.Elf32_Sym
dd DT_REL, rel
dd DT_RELSZ, relsz
dd DT_RELENT, sizeof.Elf32_Rel
dd DT_HASH, hash
dd DT_NULL, 0
segment readable writeable
symtab: Elf32_Sym
forward
match cnt:name, cntandname \{
if used name
local fstr
Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
end if
if used name
local fstr
Elf32_Sym fstr-strtab,0,0,STB_GLOBAL,STT_FUNC,0,0
cnt = cnt + 1
end if
\}
common
rel:
local counter
counter = 1
forward
match cnt:name, cntandname \{
if used name
Elf32_Rel name, counter, R_386_32
counter = counter + 1
end if
if used name
Elf32_Rel name, counter, R_386_32
counter = counter + 1
end if
\}
common
relsz = $-rel
hash:
dd 1, counter
dd 0
repeat counter
if %=counter
dd 0
else
dd %
end if
end repeat
strtab db 0
forward
match cnt:name, cntandname \{
if used name
fstr db `name,0
end if
if used name
fstr def_name name
end if
\}
common
match needed, needed@dynamic \{
irp item, needed \\{
match str:library,item \\\{
str db library,0
match str:cnt:use:library,item \\\{
use = cnt
if use > 0
str db library, 0
end if
\\\}
\\}
\}
strsz = $-strtab
forward
match cnt:name, cntandname \{
if used name
name dd 0
end if
if used name
name dd 0
end if
if name#@arg eq VOID
.__info.argtype=1
else
if name#@arg eq NONE
.__info.argtype = 0
else
match args, name#@arg \{ define_import_arguments name, args \}
__define_import_arguments name
.__info.argtype = 2
end if
end if
\}
}
macro ImportAll {
match arguments, __do_import imported@dynamic \{ arguments \}
}
|