clamav/libclamav/bytecode_priv.h

254 lines
6 KiB
C
Raw Normal View History

2009-07-07 23:36:36 +03:00
/*
* Load, verify and execute ClamAV bytecode.
*
2025-02-14 10:24:30 -05:00
* Copyright (C) 2013-2025 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
* Copyright (C) 2009-2013 Sourcefire, Inc.
2009-07-07 23:36:36 +03:00
*
* Authors: Török Edvin
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#ifndef BYTECODE_PRIV_H
#define BYTECODE_PRIV_H
2009-07-31 15:28:36 +03:00
2010-03-20 21:18:54 +02:00
#include <zlib.h>
#include "bytecode.h"
2009-07-31 15:28:36 +03:00
#include "type_desc.h"
2009-09-30 13:41:02 +03:00
#include "execs.h"
#include "bytecode_hooks.h"
2009-12-03 11:37:38 +02:00
#include "fmap.h"
#include "mpool.h"
2010-03-21 15:10:49 +02:00
#include "hashtab.h"
#include "events.h"
2009-07-07 23:36:36 +03:00
typedef uint32_t operand_t;
typedef uint16_t bbid_t;
typedef uint16_t funcid_t;
struct cli_bc_callop {
operand_t *ops;
uint16_t *opsizes;
2009-07-07 23:36:36 +03:00
funcid_t funcid;
uint8_t numOps;
2009-07-07 23:36:36 +03:00
};
struct branch {
operand_t condition;
bbid_t br_true;
bbid_t br_false;
};
struct cli_bc_cast {
uint64_t mask;
operand_t source;
uint8_t size; /* 0: 1-bit, 1: 8b, 2: 16b, 3: 32b, 4: 64b */
2009-07-07 23:36:36 +03:00
};
typedef uint8_t interp_op_t;
2009-07-07 23:36:36 +03:00
struct cli_bc_inst {
enum bc_opcode opcode;
uint16_t type;
2009-07-08 12:45:06 +03:00
operand_t dest;
interp_op_t interp_op; /* opcode for interpreter */
2009-07-07 23:36:36 +03:00
union {
operand_t unaryop;
struct cli_bc_cast cast;
operand_t binop[2];
operand_t three[3];
struct cli_bc_callop ops;
struct branch branch;
bbid_t jump;
2009-07-07 23:36:36 +03:00
} u;
};
struct cli_bc_bb {
unsigned numInsts;
struct cli_bc_inst *insts;
};
struct cli_bc_func {
uint8_t numArgs;
uint16_t numLocals;
uint32_t numInsts;
uint32_t numValues; /* without constants */
2009-07-07 23:36:36 +03:00
uint32_t numConstants;
uint32_t numBytes; /* stack size */
2009-07-07 23:36:36 +03:00
uint16_t numBB;
2009-08-27 18:12:39 +03:00
uint16_t returnType;
2009-07-07 23:36:36 +03:00
uint16_t *types;
uint32_t insn_idx;
struct cli_bc_bb *BB;
struct cli_bc_inst *allinsts;
uint64_t *constants;
2009-11-30 15:22:20 +02:00
unsigned *dbgnodes;
2009-07-07 23:36:36 +03:00
};
2009-11-30 15:22:20 +02:00
struct cli_bc_dbgnode_element {
unsigned nodeid;
unsigned len;
char *string;
2009-11-30 15:22:20 +02:00
uint64_t constant;
};
struct cli_bc_dbgnode {
unsigned numelements;
struct cli_bc_dbgnode_element *elements;
2009-11-30 15:22:20 +02:00
};
#define MAX_OP ~0u
enum trace_level {
trace_none = 0,
trace_func,
trace_param,
trace_scope,
trace_line,
trace_col,
trace_op,
trace_val
};
2010-03-21 12:56:05 +02:00
struct bc_buffer {
unsigned char *data;
unsigned size;
unsigned write_cursor;
unsigned read_cursor;
};
struct bc_inflate {
z_stream stream;
int32_t from;
int32_t to;
int8_t needSync;
2010-03-21 12:56:05 +02:00
};
2010-03-31 10:53:11 +03:00
struct bc_jsnorm {
struct parser_state *state;
int32_t from;
};
enum bc_events {
BCEV_VIRUSNAME,
BCEV_EXEC_RETURNVALUE,
BCEV_WRITE,
BCEV_OFFSET,
BCEV_READ,
BCEV_DBG_STR,
BCEV_DBG_INT,
BCEV_MEM_1,
BCEV_MEM_2,
BCEV_FIND,
BCEV_EXTRACTED,
BCEV_EXEC_TIME,
/* API failures (that are not serious), count must be 0 for testmode */
BCEV_API_WARN_BEGIN,
BCEV_READ_ERR,
BCEV_DISASM_FAIL,
BCEV_API_WARN_END,
/* real errors (write failure) are reported via cli_event_error_str */
BCEV_LASTEVENT
};
2009-07-07 23:36:36 +03:00
struct cli_bc_ctx {
uint8_t timeout; /* must be first byte in struct! */
uint16_t funcid;
unsigned numParams;
2009-07-07 23:36:36 +03:00
/* id and params of toplevel function called */
2009-07-10 16:11:54 +03:00
const struct cli_bc *bc;
const struct cli_bc_func *func;
2010-03-22 17:16:07 +02:00
uint32_t bytecode_timeout;
unsigned bytes;
uint16_t *opsizes;
char *values;
2009-07-07 23:36:36 +03:00
operand_t *operands;
2010-01-18 19:31:59 +02:00
uint32_t file_size;
int outfd;
2009-09-04 17:29:13 +03:00
off_t off;
2009-12-03 11:37:38 +02:00
fmap_t *fmap;
2010-05-12 18:26:02 +03:00
fmap_t *save_map;
2009-09-22 11:03:17 +03:00
const char *virname;
2009-09-30 13:41:02 +03:00
struct cli_bc_hooks hooks;
2010-08-02 17:04:35 +03:00
struct cli_exe_info exeinfo;
2010-08-02 23:06:33 +03:00
uint32_t lsigcnt[64];
uint32_t lsigoff[64];
2010-08-02 15:42:58 +03:00
uint32_t pdf_nobjs;
struct pdf_obj **pdf_objs;
uint32_t *pdf_flags;
2010-08-02 15:42:58 +03:00
uint32_t pdf_size;
uint32_t pdf_startoff;
unsigned pdf_phase;
int32_t pdf_dumpedid;
2010-02-12 16:47:44 +02:00
const struct cli_exe_section *sections;
uint32_t resaddr;
char *tempfile;
void *ctx;
unsigned written;
2010-03-19 15:47:26 +02:00
unsigned filewritten;
unsigned found;
unsigned ninflates;
unsigned nlzmas;
unsigned nbzip2s;
bc_dbg_callback_trace trace;
bc_dbg_callback_trace_op trace_op;
bc_dbg_callback_trace_val trace_val;
bc_dbg_callback_trace_ptr trace_ptr;
const char *directory;
const char *file;
const char *scope;
unsigned trace_level;
uint32_t scopeid;
unsigned line;
unsigned col;
mpool_t *mpool;
struct bc_inflate *inflates;
struct bc_lzma *lzmas;
struct bc_bzip2 *bzip2s;
2010-03-21 12:56:05 +02:00
struct bc_buffer *buffers;
unsigned nbuffers;
2010-03-21 15:10:49 +02:00
unsigned nhashsets;
2010-03-31 10:53:11 +03:00
unsigned njsnorms;
unsigned jsnormwritten;
struct cli_hashset *hashsets;
struct bc_jsnorm *jsnorms;
char *jsnormdir;
2010-05-12 18:26:02 +03:00
struct cli_map *maps;
unsigned nmaps;
unsigned containertype;
unsigned extracted_file_input;
const struct cli_environment *env;
unsigned bytecode_disable_status;
cli_events_t *bc_events;
int on_jit;
int no_diff;
void **jsonobjs;
unsigned njsonobjs;
2009-07-07 23:36:36 +03:00
};
struct cli_all_bc;
cl_error_t cli_vm_execute(const struct cli_bc *bc, struct cli_bc_ctx *ctx, const struct cli_bc_func *func, const struct cli_bc_inst *inst);
#ifdef __cplusplus
extern "C" {
#endif
cl_error_t cli_vm_execute_jit(const struct cli_all_bc *bcs, struct cli_bc_ctx *ctx, const struct cli_bc_func *func);
cl_error_t cli_bytecode_prepare_jit(struct cli_all_bc *bc);
cl_error_t cli_bytecode_init_jit(struct cli_all_bc *bc, unsigned dconfmask);
cl_error_t cli_bytecode_done_jit(struct cli_all_bc *bc, int partial);
#ifdef __cplusplus
}
#endif
2009-07-07 23:36:36 +03:00
#endif