1
1
2
2
%include "mkpoly.inc"
3
3
4
+ ; prefixes and opcodes of 8 invertible instructions:
5
+ ; instructions | inverted instructions
6
+ ; - add reg, reg | - sub reg, reg
7
+ ; - sub reg, reg | - add reg, reg
8
+ ; - xor reg, reg | - xor reg, reg
9
+ ; - add reg, i32 | - sub reg, i32
10
+ ; - sub reg, i32 | - add reg, i32
11
+ ; - xor reg, i32 | - xor reg, i32
12
+ ; - rol reg, i8 | - ror reg, i8
13
+ ; - ror reg, i8 | - rol reg, i8
14
+ ; - inc reg
15
+ ; - dec reg
16
+ ; - not reg
17
+ ; - neg reg
18
+ %define OPCODE_ADD_RM 0x01
19
+ %define OPCODE_SUB_RM 0x29
20
+ %define OPCODE_XOR_RM 0x31
21
+ %define PREFIX_ASX_IMM 0x81
22
+ %define OPCODE_ADD_RI 0xC0
23
+ %define OPCODE_SUB_RI 0xE8
24
+ %define OPCODE_XOR_RI 0xF0
25
+ %define PREFIX_ROT_IMM 0xC1
26
+ %define OPCODE_ROL_RI 0xC0
27
+ %define OPCODE_ROR_RI 0xC8
28
+ %define PREFIX_INC_DEC 0xFF
29
+ %define OPCODE_INC_R 0xC0
30
+ %define OPCODE_DEC_R 0xC8
31
+ %define PREFIX_NOT_NEG 0xF7
32
+ %define OPCODE_NOT_R 0xD0
33
+ %define OPCODE_NEG_R 0xD8
34
+
4
35
global polyeng
5
36
6
37
section .data
@@ -31,15 +62,6 @@ section .data
31
62
32
63
section .text
33
64
34
- ; generate a random 32-bit number
35
- ;
36
- ; [out] eax : a random number
37
- ;
38
- align 16
39
- rand32:
40
- rdrand eax
41
- ret
42
-
43
65
; the polymorphic engine
44
66
;
45
67
; [in] rdi : the binary data to modify
@@ -69,7 +91,7 @@ polyeng:
69
91
mov rcx , rax
70
92
sub rcx , 1
71
93
mov rdi , .crypt_func
72
- mov rsi , POLY_FUNC_SIZE
94
+ mov rsi , MKPOLY_FUNC_SIZE
73
95
mov rax , rdi
74
96
add rsi , rcx
75
97
not rcx
@@ -87,14 +109,14 @@ polyeng:
87
109
lea r14 , [ rel mod_reg_rm ]
88
110
mov r15d , 0xC
89
111
mov r12 , .crypt_func
90
- lea rbx , [ r12 + POLY_FUNC_SIZE - 0x6 ]
112
+ lea rbx , [ r12 + MKPOLY_FUNC_SIZE - 0x6 ]
91
113
mov r13 , [ rbp - 0x30 ]
92
114
add r13 , [ rbp - 0x18 ]
93
- add r13 , POLY_FUNC_SIZE
115
+ add r13 , MKPOLY_FUNC_SIZE
94
116
.cryptor_gen_loop:
95
117
cmp r12 , rbx
96
118
ja .cryptor_gen_end
97
- call rand32
119
+ rdrand eax
98
120
xor edx , edx
99
121
div r15d
100
122
jmp [ .instr_jmp_table + rdx * 8 ]
@@ -112,7 +134,7 @@ polyeng:
112
134
dq .neg_reg
113
135
.add_reg_reg:
114
136
sub r13 , 0x2
115
- call rand32
137
+ rdrand eax
116
138
xor edx , edx
117
139
div r15d
118
140
mov al , [ r14 + rdx ]
@@ -126,7 +148,7 @@ polyeng:
126
148
jmp .cryptor_gen_loop
127
149
.sub_reg_reg:
128
150
sub r13 , 0x2
129
- call rand32
151
+ rdrand eax
130
152
xor edx , edx
131
153
div r15d
132
154
mov al , [ r14 + rdx ]
@@ -140,7 +162,7 @@ polyeng:
140
162
jmp .cryptor_gen_loop
141
163
.xor_reg_reg:
142
164
sub r13 , 0x2
143
- call rand32
165
+ rdrand eax
144
166
xor edx , edx
145
167
div r15d
146
168
mov al , [ r14 + rdx ]
@@ -152,8 +174,7 @@ polyeng:
152
174
jmp .cryptor_gen_loop
153
175
.add_reg_i32:
154
176
sub r13 , 0x6
155
- call rand32
156
- mov ecx , eax
177
+ rdrand ecx
157
178
mov al , PREFIX_ASX_IMM
158
179
and ah , 0x3
159
180
mov dx , ax
@@ -167,8 +188,7 @@ polyeng:
167
188
jmp .cryptor_gen_loop
168
189
.sub_reg_i32:
169
190
sub r13 , 0x6
170
- call rand32
171
- mov ecx , eax
191
+ rdrand ecx
172
192
mov al , PREFIX_ASX_IMM
173
193
and ah , 0x3
174
194
mov dx , ax
@@ -182,8 +202,7 @@ polyeng:
182
202
jmp .cryptor_gen_loop
183
203
.xor_reg_i32:
184
204
sub r13 , 0x6
185
- call rand32
186
- mov ecx , eax
205
+ rdrand ecx
187
206
mov al , PREFIX_ASX_IMM
188
207
and ah , 0x3
189
208
or ah , OPCODE_XOR_RI
@@ -195,8 +214,7 @@ polyeng:
195
214
jmp .cryptor_gen_loop
196
215
.rol_reg_i8:
197
216
sub r13 , 0x3
198
- call rand32
199
- mov ecx , eax
217
+ rdrand ecx
200
218
shr ecx , 16
201
219
mov al , PREFIX_ROT_IMM
202
220
and ah , 0x3
@@ -213,8 +231,7 @@ polyeng:
213
231
jmp .cryptor_gen_loop
214
232
.ror_reg_i8:
215
233
sub r13 , 0x3
216
- call rand32
217
- mov ecx , eax
234
+ rdrand ecx
218
235
shr ecx , 16
219
236
mov al , PREFIX_ROT_IMM
220
237
and ah , 0x3
@@ -231,7 +248,7 @@ polyeng:
231
248
jmp .cryptor_gen_loop
232
249
.inc_reg:
233
250
sub r13 , 0x2
234
- call rand32
251
+ rdrand eax
235
252
mov al , PREFIX_INC_DEC
236
253
and ah , 0x3
237
254
mov dx , ax
@@ -243,7 +260,7 @@ polyeng:
243
260
jmp .cryptor_gen_loop
244
261
.dec_reg:
245
262
sub r13 , 0x2
246
- call rand32
263
+ rdrand eax
247
264
mov al , PREFIX_INC_DEC
248
265
and ah , 0x3
249
266
mov dx , ax
@@ -255,7 +272,7 @@ polyeng:
255
272
jmp .cryptor_gen_loop
256
273
.not_reg:
257
274
sub r13 , 0x2
258
- call rand32
275
+ rdrand eax
259
276
mov al , PREFIX_NOT_NEG
260
277
and ah , 0x3
261
278
or ah , OPCODE_NOT_R
@@ -265,7 +282,7 @@ polyeng:
265
282
jmp .cryptor_gen_loop
266
283
.neg_reg:
267
284
sub r13 , 0x2
268
- call rand32
285
+ rdrand eax
269
286
mov al , PREFIX_NOT_NEG
270
287
and ah , 0x3
271
288
or ah , OPCODE_NEG_R
@@ -292,7 +309,7 @@ polyeng:
292
309
mov edx , [ rdi + 0x8 ]
293
310
mov ebx , [ rdi + 0xC ]
294
311
.crypt_func:
295
- times POLY_FUNC_SIZE db OPCODE_NOP
312
+ times MKPOLY_FUNC_SIZE db OPCODE_NOP
296
313
mov [ rdi ], eax
297
314
mov [ rdi + 0x4 ], ecx
298
315
mov [ rdi + 0x8 ], edx
0 commit comments