~ubuntu-branches/ubuntu/raring/clamav/raring

« back to all changes in this revision

Viewing changes to libclamav/disasmpriv.h

  • Committer: Bazaar Package Importer
  • Author(s): Stephen Gran
  • Date: 2008-09-05 17:25:34 UTC
  • mfrom: (0.35.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080905172534-yi3f8fkye1o7u1r3
* New upstream version (closes: #497662, #497773)
  - lots of new options for clamd.conf
  - fixes CVEs CVE-2008-3912, CVE-2008-3913, CVE-2008-3914, and
    CVE-2008-1389
* No longer supports --unzip option, so typo is gone (closes: #496276)
* Translations:
  - sv (thanks Martin Bagge <brother@bsnet.se>) (closes: #491760)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Copyright (C) 2008 Sourcefire, Inc.
 
3
 *
 
4
 *  Authors: aCaB <acab@clamav.net>
 
5
 *
 
6
 *  This program is free software; you can redistribute it and/or modify
 
7
 *  it under the terms of the GNU General Public License version 2 as
 
8
 *  published by the Free Software Foundation.
 
9
 *
 
10
 *  This program is distributed in the hope that it will be useful,
 
11
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
 *  GNU General Public License for more details.
 
14
 *
 
15
 *  You should have received a copy of the GNU General Public License
 
16
 *  along with this program; if not, write to the Free Software
 
17
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 
18
 *  MA 02110-1301, USA.
 
19
 */
 
20
 
 
21
#ifndef __DISASMPRIV_H
 
22
#define __DISASMPRIV_H
 
23
 
 
24
#if HAVE_CONFIG_H
 
25
#include "clamav-config.h"
 
26
#endif
 
27
 
 
28
#include <stdio.h>
 
29
#include <string.h>
 
30
#include <assert.h>
 
31
 
 
32
#include "others.h"
 
33
 
 
34
enum X86OPS {
 
35
  OP_INVALID,
 
36
  OP_AAA,
 
37
  OP_AAD,
 
38
  OP_AAM,
 
39
  OP_AAS,
 
40
  OP_ADD,
 
41
  OP_ADC,
 
42
  OP_AND,
 
43
  OP_ARPL,
 
44
  OP_BOUND,
 
45
  OP_BSF,
 
46
  OP_BSR,
 
47
  OP_BSWAP,
 
48
  OP_BT,
 
49
  OP_BTC,
 
50
  OP_BTR,
 
51
  OP_BTS,
 
52
  OP_CALL,
 
53
  OP_CDQ,
 
54
  OP_CWD,
 
55
  OP_CWDE,
 
56
  OP_CBW,
 
57
  OP_CLC,
 
58
  OP_CLD,
 
59
  OP_CLI,
 
60
  OP_CLTS,
 
61
  OP_CMC,
 
62
  OP_CMOVO,
 
63
  OP_CMOVNO,
 
64
  OP_CMOVC,
 
65
  OP_CMOVNC,
 
66
  OP_CMOVZ,
 
67
  OP_CMOVNZ,
 
68
  OP_CMOVBE,
 
69
  OP_CMOVA,
 
70
  OP_CMOVS,
 
71
  OP_CMOVNS,
 
72
  OP_CMOVP,
 
73
  OP_CMOVNP,
 
74
  OP_CMOVL,
 
75
  OP_CMOVGE,
 
76
  OP_CMOVLE,
 
77
  OP_CMOVG,
 
78
  OP_CMP,
 
79
  OP_CMPSD,
 
80
  OP_CMPSW,
 
81
  OP_CMPSB,
 
82
  OP_CMPXCHG,
 
83
  OP_CMPXCHG8B,
 
84
  OP_CPUID,
 
85
  OP_DAA,
 
86
  OP_DAS,
 
87
  OP_DEC,
 
88
  OP_DIV,
 
89
  OP_ENTER,
 
90
  OP_FWAIT,
 
91
  OP_HLT,
 
92
  OP_IDIV,
 
93
  OP_IMUL,
 
94
  OP_INC,
 
95
  OP_IN,
 
96
  OP_INSD,
 
97
  OP_INSW,
 
98
  OP_INSB,
 
99
  OP_INT,
 
100
  OP_INT3,
 
101
  OP_INTO,
 
102
  OP_INVD,
 
103
  OP_INVLPG,
 
104
  OP_IRET,
 
105
  OP_JO,
 
106
  OP_JNO,
 
107
  OP_JC,
 
108
  OP_JNC,
 
109
  OP_JZ,
 
110
  OP_JNZ,
 
111
  OP_JBE,
 
112
  OP_JA,
 
113
  OP_JS,
 
114
  OP_JNS,
 
115
  OP_JP,
 
116
  OP_JNP,
 
117
  OP_JL,
 
118
  OP_JGE,
 
119
  OP_JLE,
 
120
  OP_JG,
 
121
  OP_JMP,
 
122
  OP_LAHF,
 
123
  OP_LAR,
 
124
  OP_LDS,
 
125
  OP_LES,
 
126
  OP_LFS,
 
127
  OP_LGS,
 
128
  OP_LEA,
 
129
  OP_LEAVE,
 
130
  OP_LGDT,
 
131
  OP_LIDT,
 
132
  OP_LLDT,
 
133
  OP_PREFIX_LOCK,
 
134
  OP_LODSD,
 
135
  OP_LODSW,
 
136
  OP_LODSB,
 
137
  OP_LOOP,
 
138
  OP_LOOPE,
 
139
  OP_LOOPNE,
 
140
  OP_JECXZ,
 
141
  OP_LSL,
 
142
  OP_LSS,
 
143
  OP_LTR,
 
144
  OP_MOV,
 
145
  OP_MOVSD,
 
146
  OP_MOVSW,
 
147
  OP_MOVSB,
 
148
  OP_MOVSX,
 
149
  OP_MOVZX,
 
150
  OP_MUL,
 
151
  OP_NEG,
 
152
  OP_NOP,
 
153
  OP_NOT,
 
154
  OP_OR,
 
155
  OP_OUT,
 
156
  OP_OUTSD,
 
157
  OP_OUTSW,
 
158
  OP_OUTSB,
 
159
  OP_PUSH,
 
160
  OP_PUSHAD,
 
161
  OP_PUSHA,
 
162
  OP_PUSHFD,
 
163
  OP_PUSHF,
 
164
  OP_POP,
 
165
  OP_POPAD,
 
166
  OP_POPFD,
 
167
  OP_POPF,
 
168
  OP_RCL,
 
169
  OP_RCR,
 
170
  OP_RDMSR,
 
171
  OP_RDPMC,
 
172
  OP_RDTSC,
 
173
  OP_PREFIX_REPE,
 
174
  OP_PREFIX_REPNE,
 
175
  OP_RETF,
 
176
  OP_RETN,
 
177
  OP_ROL,
 
178
  OP_ROR,
 
179
  OP_RSM,
 
180
  OP_SAHF,
 
181
  OP_SAR,
 
182
  OP_SBB,
 
183
  OP_SCASD,
 
184
  OP_SCASW,
 
185
  OP_SCASB,
 
186
  OP_SETO,
 
187
  OP_SETNO,
 
188
  OP_SETC,
 
189
  OP_SETNC,
 
190
  OP_SETZ,
 
191
  OP_SETNZ,
 
192
  OP_SETBE,
 
193
  OP_SETA,
 
194
  OP_SETS,
 
195
  OP_SETNS,
 
196
  OP_SETP,
 
197
  OP_SETNP,
 
198
  OP_SETL,
 
199
  OP_SETGE,
 
200
  OP_SETLE,
 
201
  OP_SETG,
 
202
  OP_SGDT,
 
203
  OP_SIDT,
 
204
  OP_SHL,
 
205
  OP_SHLD,
 
206
  OP_SHR,
 
207
  OP_SHRD,
 
208
  OP_SLDT,
 
209
  OP_STOSD,
 
210
  OP_STOSW,
 
211
  OP_STOSB,
 
212
  OP_STR,
 
213
  OP_STC,
 
214
  OP_STD,
 
215
  OP_STI,
 
216
  OP_SUB,
 
217
  OP_SYSCALL,
 
218
  OP_SYSENTER,
 
219
  OP_SYSEXIT,
 
220
  OP_SYSRET,
 
221
  OP_TEST,
 
222
  OP_UD2,
 
223
  OP_VERR,
 
224
  OP_VERRW,
 
225
  OP_WBINVD,
 
226
  OP_WRMSR,
 
227
  OP_XADD,
 
228
  OP_XCHG,
 
229
  OP_XLAT,
 
230
  OP_XOR,
 
231
  OP_PREFIX_OPSIZE,
 
232
  OP_PREFIX_ADDRSIZE,
 
233
  OP_PREFIX_SEGMENT,
 
234
  OP_2BYTE,
 
235
 
 
236
  OP_FPU,
 
237
 
 
238
  OP_F2XM1,
 
239
  OP_FABS,
 
240
  OP_FADD,
 
241
  OP_FADDP,
 
242
  OP_FBLD,
 
243
  OP_FBSTP,
 
244
  OP_FCHS,
 
245
  OP_FCLEX,
 
246
  OP_FCMOVB,
 
247
  OP_FCMOVBE,
 
248
  OP_FCMOVE,
 
249
  OP_FCMOVNB,
 
250
  OP_FCMOVNBE,
 
251
  OP_FCMOVNE,
 
252
  OP_FCMOVNU,
 
253
  OP_FCMOVU,
 
254
  OP_FCOM,
 
255
  OP_FCOMI,
 
256
  OP_FCOMIP,
 
257
  OP_FCOMP,
 
258
  OP_FCOMPP,
 
259
  OP_FCOS,
 
260
  OP_FDECSTP,
 
261
  OP_FDIV,
 
262
  OP_FDIVP,
 
263
  OP_FDIVR,
 
264
  OP_FDIVRP,
 
265
  OP_FFREE,
 
266
  OP_FIADD,
 
267
  OP_FICOM,
 
268
  OP_FICOMP,
 
269
  OP_FIDIV,
 
270
  OP_FIDIVR,
 
271
  OP_FILD,
 
272
  OP_FIMUL,
 
273
  OP_FINCSTP,
 
274
  OP_FINIT,
 
275
  OP_FIST,
 
276
  OP_FISTP,
 
277
  OP_FISTTP,
 
278
  OP_FISUB,
 
279
  OP_FISUBR,
 
280
  OP_FLD,
 
281
  OP_FLD1,
 
282
  OP_FLDCW,
 
283
  OP_FLDENV,
 
284
  OP_FLDL2E,
 
285
  OP_FLDL2T,
 
286
  OP_FLDLG2,
 
287
  OP_FLDLN2,
 
288
  OP_FLDPI,
 
289
  OP_FLDZ,
 
290
  OP_FMUL,
 
291
  OP_FMULP,
 
292
  OP_FNOP,
 
293
  OP_FPATAN,
 
294
  OP_FPREM,
 
295
  OP_FPREM1,
 
296
  OP_FPTAN,
 
297
  OP_FRNDINT,
 
298
  OP_FRSTOR,
 
299
  OP_FSCALE,
 
300
  OP_FSIN,
 
301
  OP_FSINCOS,
 
302
  OP_FSQRT,
 
303
  OP_FSAVE,
 
304
  OP_FST,
 
305
  OP_FSTCW,
 
306
  OP_FSTENV,
 
307
  OP_FSTP,
 
308
  OP_FSTSW,
 
309
  OP_FSUB,
 
310
  OP_FSUBP,
 
311
  OP_FSUBR,
 
312
  OP_FSUBRP,
 
313
  OP_FTST,
 
314
  OP_FUCOM,
 
315
  OP_FUCOMI,
 
316
  OP_FUCOMIP,
 
317
  OP_FUCOMP,
 
318
  OP_FUCOMPP,
 
319
  OP_FXAM,
 
320
  OP_FXCH,
 
321
  OP_FXTRACT,
 
322
  OP_FYL2X,
 
323
  OP_FYL2XP1
 
324
};
 
325
 
 
326
 
 
327
enum DIS_STATE {
 
328
  STATE_GETOP,
 
329
  STATE_CHECKDTYPE,
 
330
  STATE_CHECKSTYPE,
 
331
  STATE_DECODEX87,
 
332
  STATE_FINALIZE,
 
333
  STATE_COMPLETE,
 
334
  STATE_ERROR
 
335
};
 
336
 
 
337
enum DIS_ACCESS {
 
338
  ACCESS_NOARG, /* arg not present */
 
339
  ACCESS_IMM,   /* immediate */
 
340
  ACCESS_REL,   /* +/- immediate */
 
341
  ACCESS_REG,   /* register */
 
342
  ACCESS_MEM    /* [something] */
 
343
};
 
344
 
 
345
enum DIS_SIZE { /* for mem access, immediate and relative */
 
346
  SIZEB,
 
347
  SIZEW,
 
348
  SIZED,
 
349
  SIZEF,
 
350
  SIZEQ,
 
351
  SIZET,
 
352
  SIZEPTR
 
353
};
 
354
 
 
355
 
 
356
enum X86REGS {
 
357
  REG_EAX, REG_ECX, REG_EDX, REG_EBX, REG_ESP, REG_EBP, REG_ESI, REG_EDI,
 
358
  REG_AX, REG_CX, REG_DX, REG_BX, REG_SP, REG_BP, REG_SI, REG_DI,
 
359
  REG_AH, REG_CH, REG_DH, REG_BH, REG_AL, REG_CL, REG_DL, REG_BL,
 
360
  REG_ES, REG_CS, REG_SS, REG_DS, REG_FS, REG_GS,
 
361
  REG_CR0, REG_CR1, REG_CR2, REG_CR3, REG_CR4, REG_CR5, REG_CR6, REG_CR7,
 
362
  REG_DR0, REG_DR1, REG_DR2, REG_DR3, REG_DR4, REG_DR5, REG_DR6, REG_DR7,
 
363
  REG_ST0, REG_ST1, REG_ST2, REG_ST3, REG_ST4, REG_ST5, REG_ST6, REG_ST7,
 
364
  REG_INVALID
 
365
};
 
366
 
 
367
 
 
368
struct DIS_ARGS {
 
369
  enum DIS_ACCESS access;
 
370
  enum DIS_SIZE size;
 
371
  enum X86REGS reg;
 
372
  union {
 
373
    uint8_t b;
 
374
    int8_t rb;
 
375
    uint16_t w;
 
376
    int16_t rw;
 
377
    uint32_t d;
 
378
    int32_t rd;
 
379
    /*    uint48_t f; FIXME */
 
380
    uint64_t q;
 
381
    int64_t rq;
 
382
    struct {
 
383
      enum X86REGS r1;  /* scaled */
 
384
      enum X86REGS r2;  /* added */
 
385
      uint8_t scale; /* r1 multiplier */
 
386
      int32_t disp;
 
387
    } marg;
 
388
  } arg;
 
389
};
 
390
 
 
391
 
 
392
/* FIXME: pack this thing and make macroes to access it in different compilers */
 
393
struct DISASMED {
 
394
  uint16_t table_op;
 
395
  uint16_t real_op;
 
396
  enum DIS_STATE state;
 
397
  uint32_t opsize;
 
398
  uint32_t adsize;
 
399
  uint32_t segment;
 
400
  struct DIS_ARGS args[3];
 
401
  uint8_t cur;
 
402
};
 
403
 
 
404
#endif