22 #define __BYTE_ORDER __BYTE_ORDER__
23 #elif defined(__NetBSD__)
24 #define __BYTE_ORDER _BYTE_ORDER
25 #define __BIG_ENDIAN _BIG_ENDIAN
26 #define __LITTLE_ENDIAN _LITTLE_ENDIAN
29 #define Endian16_Swap(value) \
30 ((((uint16_t)((value) & 0x00FF)) << 8) | \
31 (((uint16_t)((value) & 0xFF00)) >> 8))
33 #define Endian32_Swap(value) \
34 ((((uint32_t)((value) & 0x000000FF)) << 24) | \
35 (((uint32_t)((value) & 0x0000FF00)) << 8) | \
36 (((uint32_t)((value) & 0x00FF0000)) >> 8) | \
37 (((uint32_t)((value) & 0xFF000000)) >> 24))
39 #define Endian64_Swap(value) \
40 (((((uint64_t)value)<<56) & 0xFF00000000000000ULL) | \
41 ((((uint64_t)value)<<40) & 0x00FF000000000000ULL) | \
42 ((((uint64_t)value)<<24) & 0x0000FF0000000000ULL) | \
43 ((((uint64_t)value)<< 8) & 0x000000FF00000000ULL) | \
44 ((((uint64_t)value)>> 8) & 0x00000000FF000000ULL) | \
45 ((((uint64_t)value)>>24) & 0x0000000000FF0000ULL) | \
46 ((((uint64_t)value)>>40) & 0x000000000000FF00ULL) | \
47 ((((uint64_t)value)>>56) & 0x00000000000000FFULL))
57 #define BREAKPOINT_READ 1
58 #define BREAKPOINT_WRITE 2
60 #define BREAK_SIGALARM 1<<5
62 #define MAX_MEMORY_PAGE_POOL_TAB 0x100000
63 #define MEMORY_PAGE_POOL_MASK_BIT 12
64 #define PAGE_SIZE (1<<MEMORY_PAGE_POOL_MASK_BIT)
65 #define VM_BIG_ENDIAN 1
66 #define VM_LITTLE_ENDIAN 2
72 struct memory_breakpoint_info_head memory_breakpoint_pool;
127 #define EXCEPT_DO_NOT_UPDATE_PC (1<<25)
130 #define EXCEPT_CODE_AUTOMOD (1<<0)
131 #define EXCEPT_SOFT_BP (1<<1)
132 #define EXCEPT_INT_XX (1<<2)
134 #define EXCEPT_BREAKPOINT_INTERN (1<<10)
136 #define EXCEPT_NUM_UPDT_EIP (1<<11)
138 #define EXCEPT_UNK_MEM_AD ((1<<12) | EXCEPT_DO_NOT_UPDATE_PC)
139 #define EXCEPT_THROW_SEH ((1<<13) | EXCEPT_DO_NOT_UPDATE_PC)
140 #define EXCEPT_UNK_EIP ((1<<14) | EXCEPT_DO_NOT_UPDATE_PC)
141 #define EXCEPT_ACCESS_VIOL ((1<<14) | EXCEPT_DO_NOT_UPDATE_PC)
142 #define EXCEPT_INT_DIV_BY_ZERO ((1<<16) | EXCEPT_DO_NOT_UPDATE_PC)
143 #define EXCEPT_PRIV_INSN ((1<<17) | EXCEPT_DO_NOT_UPDATE_PC)
144 #define EXCEPT_ILLEGAL_INSN ((1<<18) | EXCEPT_DO_NOT_UPDATE_PC)
145 #define EXCEPT_UNK_MNEMO ((1<<19) | EXCEPT_DO_NOT_UPDATE_PC)
178 unsigned int parity(
unsigned int a);
179 unsigned int my_imul08(
unsigned int a,
unsigned int b);
191 unsigned int mul_lo_op(
unsigned int size,
unsigned int a,
unsigned int b);
192 unsigned int mul_hi_op(
unsigned int size,
unsigned int a,
unsigned int b);
201 unsigned int umul16_lo(
unsigned short a,
unsigned short b);
202 unsigned int umul16_hi(
unsigned short a,
unsigned short b);
205 unsigned int div_op(
unsigned int size,
unsigned int a,
unsigned int b,
unsigned int c);
206 unsigned int rem_op(
unsigned int size,
unsigned int a,
unsigned int b,
unsigned int c);
207 uint64_t
rot_left(uint64_t size, uint64_t a, uint64_t
b);
208 uint64_t
rot_right(uint64_t size, uint64_t a, uint64_t
b);
209 int rcl_rez_op(
unsigned int size,
unsigned int a,
unsigned int b,
unsigned int cf);
210 int rcl_cf_op(
unsigned int size,
unsigned int a,
unsigned int b,
unsigned int cf);
213 #define UDIV(sizeA) \
214 uint ## sizeA ## _t udiv ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \
216 uint ## sizeA ## _t r; \
218 vmcpu->exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \
226 #define UMOD(sizeA) \
227 uint ## sizeA ## _t umod ## sizeA (vm_cpu_t* vmcpu, uint ## sizeA ## _t a, uint ## sizeA ## _t b) \
229 uint ## sizeA ## _t r; \
231 vmcpu->exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \
239 #define IDIV(sizeA) \
240 int ## sizeA ## _t idiv ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \
242 int ## sizeA ## _t r; \
244 vmcpu->exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \
252 #define IMOD(sizeA) \
253 int ## sizeA ## _t imod ## sizeA (vm_cpu_t* vmcpu, int ## sizeA ## _t a, int ## sizeA ## _t b) \
255 int ## sizeA ## _t r; \
257 vmcpu->exception_flags |= EXCEPT_INT_DIV_BY_ZERO; \
280 void hexdump(
char* m,
unsigned int l);
357 unsigned int cpuid(
unsigned int a,
unsigned int reg_num);
361 double fadd(
double a,
double b);
362 double fsub(
double a,
double b);
363 double fmul(
double a,
double b);
364 double fdiv(
double a,
double b);
365 double ftan(
double a);
367 double fsin(
double a);
368 double fcos(
double a);
369 double fscale(
double a,
double b);
370 double f2xm1(
double a);
371 double fsqrt(
double a);
372 double fabs(
double a);
373 unsigned int fcom_c0(
double a,
double b);
374 unsigned int fcom_c1(
double a,
double b);
375 unsigned int fcom_c2(
double a,
double b);
376 unsigned int fcom_c3(
double a,
double b);
387 double fadd(
double a,
double b);
398 #define shift_right_arith_08(a, b)\
399 ((((char)(a)) >> ((int)(b)&0x1f))&0xff)
400 #define shift_right_arith_16(a, b)\
401 ((((short)(a)) >> ((int)(b)&0x1f))&0xffff)
402 #define shift_right_arith_32(a, b)\
403 ((((int)(a)) >> ((int)(b)&0x1f))&0xffffffff)
406 #define shift_right_logic_08(a, b)\
407 ((((unsigned char)(a)) >> ((unsigned int)(b)&0x1f))&0xff)
408 #define shift_right_logic_16(a, b)\
409 ((((unsigned short)(a)) >> ((unsigned int)(b)&0x1f))&0xffff)
410 #define shift_right_logic_32(a, b)\
411 ((((unsigned int)(a)) >> ((unsigned int)(b)&0x1f))&0xffffffff)
412 #define shift_right_logic_64(a, b)\
413 ((((int64_t)(a)) >> ((int64_t)(b)&0x3f))&0xffffffffffffffff)
415 #define shift_left_logic_08(a, b)\
416 (((a)<<((b)&0x1f))&0xff)
417 #define shift_left_logic_16(a, b)\
418 (((a)<<((b)&0x1f))&0xffff)
419 #define shift_left_logic_32(a, b)\
420 (((a)<<((b)&0x1f))&0xffffffff)
421 #define shift_left_logic_64(a, b)\
422 (((a)<<((b)&0x3f))&0xffffffffffffffff)
void func_getproc_fake(void)
void init_memory_breakpoint(vm_mngr_t *vm_mngr)
double int2double(unsigned int m)
int vm_read_mem(vm_mngr_t *vm_mngr, uint64_t addr, char **buffer_ptr, uint64_t size)
int imul_hi_op_32(int a, int b)
void MEM_WRITE_64_PASSTHROUGH(uint64_t addr, uint64_t src)
void dump_code_bloc_pool(vm_mngr_t *vm_mngr)
int vm_write_mem(vm_mngr_t *vm_mngr, uint64_t addr, char *buffer, uint64_t size)
int64_t double_to_int_64(double d)
uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b)
void add_memory_breakpoint(vm_mngr_t *vm_mngr, uint64_t ad, uint64_t size, unsigned int access)
int imul_hi_op_16(short a, short b)
unsigned int get_memory_page_max_address(void)
unsigned int code_bloc_pool_ad_min
struct memory_page_node * get_memory_page_from_address(vm_mngr_t *, uint64_t ad)
unsigned int _get_memory_page_max_user_address_py(void)
unsigned int MEM_LOOKUP_32_PASSTHROUGH(uint64_t addr)
uint64_t double_to_mem_64(double d)
void vm_MEM_WRITE_64(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t src)
void _func_loadlib_fake(void)
unsigned char vm_MEM_LOOKUP_08(vm_mngr_t *vm_mngr, uint64_t addr)
void check_write_code_bloc(vm_mngr_t *vm_mngr, uint64_t my_size, uint64_t addr)
void MEM_WRITE_08_PASSTHROUGH(uint64_t addr, unsigned char src)
double fdiv(double a, double b)
unsigned int load_segment_limit(unsigned int d)
unsigned int div_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c)
void func_loadlib_fake(void)
LIST_ENTRY(memory_page_node) next
unsigned int fcom_c2(double a, double b)
unsigned char MEM_LOOKUP_08_PASSTHROUGH(uint64_t addr)
unsigned int imul_lo_op_08(char a, char b)
unsigned int cpuid(unsigned int a, unsigned int reg_num)
unsigned int umul16_lo(unsigned short a, unsigned short b)
unsigned int get_memory_page_max_user_address(void)
double int_32_to_double(unsigned int m)
void vm_MEM_WRITE_16(vm_mngr_t *vm_mngr, uint64_t addr, unsigned short src)
unsigned int access_segment(unsigned int d)
int imul_hi_op_08(char a, char b)
uint64_t vm_MEM_LOOKUP_64(vm_mngr_t *vm_mngr, uint64_t addr)
unsigned int load_segment_limit_ok(unsigned int d)
unsigned int umul16_hi(unsigned short a, unsigned short b)
uint64_t get_mem_base_addr(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t *addr_base)
unsigned int imul_lo_op_16(short a, short b)
void func_free_memory_page(void)
unsigned int vm_MEM_LOOKUP_32(vm_mngr_t *vm_mngr, uint64_t addr)
void func_malloc_memory_page(void)
#define MAX_MEMORY_PAGE_POOL_TAB
void add_memory_page(vm_mngr_t *vm_mngr, struct memory_page_node *mpn_a)
uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b)
unsigned int * code_addr_tab
unsigned short vm_MEM_LOOKUP_16(vm_mngr_t *vm_mngr, uint64_t addr)
unsigned int get_memory_page_max_address_py(void)
PyObject * addr2BlocObj(vm_mngr_t *vm_mngr, uint64_t addr)
unsigned int parity(unsigned int a)
struct memory_page_list_head memory_page_pool
uint64_t shift_right_logic(uint64_t size, uint64_t a, uint64_t b)
int is_mem_mapped(vm_mngr_t *vm_mngr, uint64_t ad)
char * dump(vm_mngr_t *vm_mngr)
unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c)
void MEM_WRITE_32_PASSTHROUGH(uint64_t addr, unsigned int src)
void func_virtualalloc_memory_page(void)
struct code_bloc_node * create_code_bloc_node(uint64_t ad_start, uint64_t ad_stop)
double fmul(double a, double b)
void _func_malloc_memory_page(void)
unsigned int fcom_c1(double a, double b)
unsigned int double_to_mem_32(double d)
void vm_MEM_WRITE_32(vm_mngr_t *vm_mngr, uint64_t addr, unsigned int src)
void vm_throw(vm_mngr_t *vm_mngr, unsigned long flags)
double fscale(double a, double b)
double fsub(double a, double b)
unsigned int MEM_LOOKUP(vm_mngr_t *vm_mngr, unsigned int my_size, uint64_t addr)
int rcl_cf_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
void func_virtualfree_memory_page(void)
void remove_memory_breakpoint(vm_mngr_t *vm_mngr, uint64_t ad, unsigned int access)
void reset_code_bloc_pool(vm_mngr_t *vm_mngr)
int shift_right_arith(unsigned int size, int a, unsigned int b)
void _func_free_memory_page(void)
unsigned int access_segment_ok(unsigned int d)
LIST_HEAD(memory_page_list_head, memory_page_node)
int is_mpn_in_tab(vm_mngr_t *vm_mngr, struct memory_page_node *mpn_a)
void vm_MEM_WRITE_08(vm_mngr_t *vm_mngr, uint64_t addr, unsigned char src)
unsigned int get_memory_page_max_user_address_py(void)
struct code_bloc_list_head code_bloc_pool
void _func_virtualalloc_memory_page(void)
int rcl_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
unsigned int imul_lo_op_32(int a, int b)
void reset_memory_page_pool(vm_mngr_t *vm_mngr)
unsigned int load_tr_segment_selector(unsigned int d)
uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b)
void dump_memory_breakpoint_pool(vm_mngr_t *vm_mngr)
unsigned int fcom_c0(double a, double b)
double int_64_to_double(uint64_t m)
uint64_t exception_flags_new
void init_code_bloc_pool(vm_mngr_t *vm_mngr)
struct memory_page_node * create_memory_page_node(uint64_t ad, unsigned int size, unsigned int access)
unsigned int fcom_c3(double a, double b)
void hexdump(char *m, unsigned int l)
unsigned int _get_memory_page_from_min_ad_py(unsigned int size)
unsigned int code_bloc_pool_ad_max
void _func_virtualfree_memory_page(void)
void _func_getproc_fake(void)
void reset_memory_breakpoint(vm_mngr_t *vm_mngr)
unsigned int _get_memory_page_max_address_py(void)
void MEM_WRITE_16_PASSTHROUGH(uint64_t addr, unsigned short src)
unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b)
double mem_32_to_double(unsigned int m)
unsigned short MEM_LOOKUP_16_PASSTHROUGH(uint64_t addr)
double mem_64_to_double(uint64_t m)
void add_code_bloc(vm_mngr_t *vm_mngr, struct code_bloc_node *cbp)
uint64_t MEM_LOOKUP_64_PASSTHROUGH(uint64_t addr)
void init_memory_page_pool(vm_mngr_t *vm_mngr)
unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b)
double fadd(double a, double b)
unsigned int my_imul08(unsigned int a, unsigned int b)
double int_16_to_double(unsigned int m)
int32_t double_to_int_32(double d)
unsigned int get_memory_page_from_min_ad_py(unsigned int size)