47 #define MIN(a,b) (((a)<(b))?(a):(b))
48 #define MAX(a,b) (((a)>(b))?(a):(b))
57 if (vm_mngr->
sex == __BYTE_ORDER)
65 if (vm_mngr->
sex == __BYTE_ORDER)
73 if (vm_mngr->
sex == __BYTE_ORDER)
82 uint64_t *ptr = (uint64_t *) addr;
83 fprintf(stderr,
"addr 0x%"PRIX64
" val 0x%"PRIX64
"\n", addr-base, *ptr);
96 if ((mpn->
ad <= ad) && (ad <mpn->ad + mpn->
size))
118 if ((mpn->
ad <= ad) && (ad <mpn->ad + mpn->
size)) {
119 *addr_base = mpn->
ad;
131 if ( mpn && (mpn->
ad <= ad) && (ad < mpn->ad + mpn->
size))
134 fprintf(stderr,
"WARNING: address 0x%"PRIX64
" is not mapped in virtual memory:\n", ad);
144 if ((mpn->
ad <= ad) && (ad < mpn->ad + mpn->
size))
147 fprintf(stderr,
"WARNING: address 0x%"PRIX64
" is not mapped in virtual memory:\n", ad);
161 unsigned char * addr;
171 fprintf(stderr,
"access to non readable page!! %"PRIX64
"\n", ad);
180 if ((b->
ad <= ad) && (ad < b->ad + b->
size))
185 addr = &((
unsigned char*)mpn->
ad_hp)[ad - mpn->
ad];
188 if (ad - mpn->
ad + my_size/8 <= mpn->
size){
191 ret = *((
unsigned char*)addr)&0xFF;
194 ret = *((
unsigned short*)addr)&0xFFFF;
198 ret = *((
unsigned int*)addr)&0xFFFFFFFF;
202 ret = *((uint64_t*)addr)&0xFFFFFFFFFFFFFFFFULL;
212 unsigned int new_size = my_size;
219 addr = &((
unsigned char*)mpn->
ad_hp)[ad - mpn->
ad];
220 ret |= (*((
unsigned char*)addr)&0xFF)<<(index);
247 uint64_t
ad, uint64_t src)
250 unsigned char * addr;
258 fprintf(stderr,
"access to non writable page!! %"PRIX64
"\n", ad);
267 if ((b->
ad <= ad) && (ad < b->ad + b->
size))
271 addr = &((
unsigned char*)mpn->
ad_hp)[ad - mpn->
ad];
274 if (ad - mpn->
ad + my_size/8 <= mpn->
size){
277 *((
unsigned char*)addr) = src&0xFF;
281 *((
unsigned short*)addr) = src&0xFFFF;
285 *((
unsigned int*)addr) = src&0xFFFFFFFF;
289 *((uint64_t*)addr) = src&0xFFFFFFFFFFFFFFFFULL;
322 addr = &((
unsigned char*)mpn->
ad_hp)[ad - mpn->
ad];
323 *((
unsigned char*)addr) = src&0xFF;
341 for (i = 0; i < 16; i += 4) {
342 nib_a = (a >> i) & (0xF);
343 nib_b = (b >> i) & (0xF);
345 j = (carry + nib_a + nib_b);
364 for (i = 0; i < 16; i += 4) {
365 nib_a = (a >> i) & (0xF);
366 nib_b = (b >> i) & (0xF);
368 j = (carry + nib_a + nib_b);
398 if ((cbp->
ad_start < addr + my_size/8) &&
400 #ifdef DEBUG_MIASM_AUTOMOD_CODE
401 fprintf(stderr,
"**********************************\n");
402 fprintf(stderr,
"self modifying code %"PRIX64
" %.8X\n",
404 fprintf(stderr,
"**********************************\n");
421 pyaddr = PyLong_FromUnsignedLongLong(addr);
426 b = PyDict_GetItem(vm_mngr->
addr2obj, pyaddr);
492 buffer = malloc(size);
493 *buffer_ptr = buffer;
495 fprintf(stderr,
"cannot alloc read\n");
504 PyErr_SetString(PyExc_RuntimeError,
"cannot find address");
508 len =
MIN(size, mpn->
size - (addr - mpn->
ad));
509 memcpy(buffer, (
char*)(mpn->
ad_hp + (addr - mpn->
ad)), len);
529 PyErr_SetString(PyExc_RuntimeError,
"cannot find address");
533 len =
MIN(size, mpn->
size - (addr - mpn->
ad));
534 memcpy(mpn->
ad_hp + (addr-mpn->
ad), buffer, len);
547 #if defined(__builtin_parity)
548 return __builtin_parity(a);
550 unsigned int tmp, cpt;
571 return (i8_a >> b)&0xff;
574 return (i16_a >> b)&0xffff;
577 return (i32_a >> b)&0xffffffff;
579 fprintf(stderr,
"inv size in shift %d\n", size);
606 uint64_t a, uint64_t
b)
609 unsigned short u16_a;
614 return (u8_a >> b)&0xff;
617 return (u16_a >> b)&0xffff;
620 return (u32_a >> b)&0xffffffff;
622 fprintf(stderr,
"inv size in shift %"PRIx64
"\n", size);
655 return (a<<b)&0xffff;
657 return (a<<b)&0xffffffff;
659 return (a<<b)&0xffffffffffffffff;
661 fprintf(stderr,
"inv size in shift %"PRIx64
"\n", size);
687 case 8: mask = 0xff;
break;
688 case 16: mask = 0xffff;
break;
689 case 32: mask = 0xffffffff;
break;
690 default: fprintf(stderr,
"inv size in mul %d\n", size); exit(0);
695 return ((int64_t)a * (int64_t) b) & mask;
704 case 8: mask = 0xff;
break;
705 case 16: mask = 0xffff;
break;
706 case 32: mask = 0xffffffff;
break;
707 default: fprintf(stderr,
"inv size in mul %d\n", size); exit(0);
712 res = ((uint64_t)a * (uint64_t)
b);
713 return (res >> 32) & mask;
749 res = (int64_t)a*(int64_t)
b;
756 return (a*b) & 0xffff;
763 return (c>>16) & 0xffff;
769 unsigned int div_op(
unsigned int size,
unsigned int a,
unsigned int b,
unsigned int c)
777 num = ((int64_t)a << size) +
b;
783 unsigned int rem_op(
unsigned int size,
unsigned int a,
unsigned int b,
unsigned int c)
793 num = ((int64_t)a << size) +
b;
794 num = (int64_t)num-c*(num/c);
807 tmp = (a << b) | ((a&0xFF) >> (size-
b));
810 tmp = (a << b) | ((a&0xFFFF) >> (size-
b));
813 tmp = (a << b) | ((a&0xFFFFFFFF) >> (size-
b));
814 return tmp&0xffffffff;
816 tmp = (a << b) | ((a&0xFFFFFFFFFFFFFFFF) >> (size-
b));
817 return tmp&0xFFFFFFFFFFFFFFFF;
819 fprintf(stderr,
"inv size in rotleft %"PRIX64
"\n", size);
832 tmp = ((a&0xFF) >> b) | (a << (size-
b));
835 tmp = ((a&0xFFFF) >> b) | (a << (size-
b));
838 tmp = ((a&0xFFFFFFFF) >> b) | (a << (size-
b));
839 return tmp&0xffffffff;
841 tmp = ((a&0xFFFFFFFFFFFFFFFF) >> b) | (a << (size-
b));
842 return tmp&0xFFFFFFFFFFFFFFFF;
844 fprintf(stderr,
"inv size in rotright %"PRIX64
"\n", size);
867 fprintf(stderr,
"inv size in rclleft %d\n", size);
876 tmp = (tmp << b) | ((tmp&0x1FF) >> (size-
b));
879 tmp = (tmp << b) | ((tmp&0x1FFFF) >> (size-
b));
882 tmp = (tmp << b) | ((tmp&0x1FFFFFFFFULL) >> (size-
b));
883 return tmp&0xffffffff;
885 fprintf(stderr,
"inv size in rclleft %d\n", size);
901 tmp = (cf<<
size) | a;
908 tmp = (tmp << b) | ((tmp&0x1FF) >> (size-
b));
911 tmp = (tmp << b) | ((tmp&0x1FFFF) >> (size-
b));
914 tmp = (tmp << b) | ((tmp&0x1FFFFFFFFULL) >> (size-
b));
917 fprintf(stderr,
"inv size in rclleft %d\n", size);
931 for (i=size-1; i>=0; i--){
935 fprintf(stderr,
"sanity check error bsr\n");
943 for (i=0; i<
size; i++){
947 fprintf(stderr,
"sanity check error bsf\n");
965 unsigned int cpuid(
unsigned int a,
unsigned int reg_num)
968 fprintf(stderr,
"not implemented cpuid reg %x\n", reg_num);
1002 fprintf(stderr,
"WARNING not implemented cpuid index %X!\n", a);
1031 #ifdef DEBUG_MIASM_DOUBLE
1033 printf(
"%d float %e\n", m, d);
1043 #ifdef DEBUG_MIASM_DOUBLE
1045 printf(
"%"PRId64
" double %e\n", m, d);
1054 d = (double)(m&0xffff);
1055 #ifdef DEBUG_MIASM_DOUBLE
1057 printf(
"%d double %e\n", m, d);
1067 #ifdef DEBUG_MIASM_DOUBLE
1069 printf(
"%d double %e\n", m, d);
1079 #ifdef DEBUG_MIASM_DOUBLE
1081 printf(
"%"PRId64
" double %e\n", m, d);
1091 #ifdef DEBUG_MIASM_DOUBLE
1093 printf(
"%e int %d\n", d, i);
1103 #ifdef DEBUG_MIASM_DOUBLE
1105 printf(
"%e int %"PRId64
"\n", d, i);
1115 #ifdef DEBUG_MIASM_DOUBLE
1117 printf(
"%e + %e -> %e\n", a, b, c);
1126 #ifdef DEBUG_MIASM_DOUBLE
1128 printf(
"%e - %e -> %e\n", a, b, c);
1137 #ifdef DEBUG_MIASM_DOUBLE
1139 printf(
"%e * %e -> %e\n", a, b, c);
1148 #ifdef DEBUG_MIASM_DOUBLE
1150 printf(
"%e / %e -> %e\n", a, b, c);
1159 #ifdef DEBUG_MIASM_DOUBLE
1161 printf(
"%e tan %e\n", a, b);
1172 #ifdef DEBUG_MIASM_DOUBLE
1174 printf(
"%e double %e\n", a, c);
1183 #ifdef DEBUG_MIASM_DOUBLE
1185 printf(
"%e sin %e\n", a, b);
1194 #ifdef DEBUG_MIASM_DOUBLE
1196 printf(
"%e cos %e\n", a, b);
1205 c = a * exp2(trunc(b));
1206 #ifdef DEBUG_MIASM_DOUBLE
1208 printf(
"%e *exp2 %e -> %e\n", a, b, c);
1217 #ifdef DEBUG_MIASM_DOUBLE
1219 printf(
"%e exp2 -1 %e\n", a, b);
1228 #ifdef DEBUG_MIASM_DOUBLE
1230 printf(
"%e sqrt %e\n", a, b);
1239 #ifdef DEBUG_MIASM_DOUBLE
1241 printf(
"%e abs %e\n", a, b);
1276 m = *((
unsigned int*)&f);
1277 #ifdef DEBUG_MIASM_DOUBLE
1279 printf(
"%d %e\n", m, d);
1287 m = *((uint64_t*)&d);
1288 #ifdef DEBUG_MIASM_DOUBLE
1290 printf(
"%"PRId64
" %e\n", m, d);
1300 mpn = malloc(
sizeof(*mpn));
1302 fprintf(stderr,
"cannot alloc mpn\n");
1308 fprintf(stderr,
"cannot alloc %d\n", size);
1324 cbp = malloc(
sizeof(*cbp));
1326 fprintf(stderr,
"cannot alloc cbp\n");
1351 printf(
"ad start %"PRIX64
" ad_stop %"PRIX64
"\n",
1438 if (mpn->
ad >= mpn_a->
ad + mpn_a->
size)
1440 if (mpn->
ad + mpn->
size <= mpn_a->
ad)
1442 printf(
"is mpn in! %"PRIX64
" %"PRIX64
" \n", mpn_a->
ad, mpn_a->
size);
1443 printf(
"known:! %"PRIX64
" %"PRIX64
" \n", mpn->
ad, mpn->
size);
1479 if (mpn->
ad < mpn_a->
ad)
1501 buf_final = malloc(1);
1502 if (buf_final == NULL) {
1503 printf(
"cannot alloc\n");
1506 buf_final[0] =
'\x00';
1509 length = snprintf(buf,
sizeof(buf),
1510 "ad 0x%"PRIX64
" size 0x%"PRIX64
" %c%c%c\n",
1512 (uint64_t)mpn->
size,
1517 total_len += length+1;
1518 buf_final = realloc(buf_final, total_len);
1519 if (buf_final == NULL) {
1520 printf(
"cannot alloc\n");
1523 strcat(buf_final, buf);
1534 printf(
"ad %"PRIX64
" size %"PRIX64
" access %"PRIX64
"\n",
1546 mpn_a = malloc(
sizeof(*mpn_a));
1548 printf(
"cannot alloc\n");
1564 if (mpn->
ad == ad && mpn->
access == access)
1585 if (ad == 0 || mpn->
ad <ad)
1593 unsigned int get_memory_page_from_min_ad(
unsigned int size)
1597 unsigned int min_ad = min_page_ad;
1603 c_ad = (mpn->
ad + mpn->
size+0x1000)&0xfffff000;
1606 if (mpn->
ad <= min_ad){
1611 if (mpn->
ad - min_ad < size){
1631 if (!(i%0x10) && i){
1634 for (j=-0x10;j<0;j++){
1635 if (isprint(m[i+j])){
1636 printf(
"%c", m[i+j]);
1644 printf(
"%.2X ", m[i]&0xFF);
1648 for (j=i;j<last+0x10;j++)
1652 if (isprint(m[last+j])){
1653 printf(
"%c", m[last+j]);
1671 printf(
"access segment %X\n", d);
1677 printf(
"access segment ok %X\n", d);
1684 printf(
"load segment limit %X\n", d);
1690 printf(
"load segment limit ok %X\n", d);
struct memory_breakpoint_info_head memory_breakpoint_pool
void reset_memory_breakpoint(vm_mngr_t *vm_mngr)
unsigned int umul16_lo(unsigned short a, unsigned short b)
#define EXCEPT_CODE_AUTOMOD
int imul_hi_op_16(short a, short b)
unsigned char vm_MEM_LOOKUP_08(vm_mngr_t *vm_mngr, uint64_t addr)
void insert_mpn_in_tab(struct memory_page_node *mpn_a)
static void memory_page_write(vm_mngr_t *vm_mngr, unsigned int my_size, uint64_t ad, uint64_t src)
unsigned int rem_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c)
uint64_t vm_MEM_LOOKUP_64(vm_mngr_t *vm_mngr, uint64_t addr)
#define LIST_FOREACH(var, head, field)
unsigned int cpuid(unsigned int a, unsigned int reg_num)
unsigned int code_bloc_pool_ad_min
void init_memory_page_pool(vm_mngr_t *vm_mngr)
unsigned int fcom_c1(double a, double b)
uint16_t set_endian16(vm_mngr_t *vm_mngr, uint16_t val)
void add_memory_breakpoint(vm_mngr_t *vm_mngr, uint64_t ad, uint64_t size, unsigned int access)
#define LIST_REMOVE(elm, field)
int imul_hi_op_32(int a, int b)
void reset_code_bloc_pool(vm_mngr_t *vm_mngr)
unsigned int vm_MEM_LOOKUP_32(vm_mngr_t *vm_mngr, uint64_t addr)
int shift_right_arith(unsigned int size, int a, unsigned int b)
uint16_t bcdadd_16(uint16_t a, uint16_t b)
void add_memory_page(vm_mngr_t *vm_mngr, struct memory_page_node *mpn_a)
#define MEMORY_PAGE_POOL_MASK_BIT
double int_32_to_double(unsigned int m)
void reset_memory_page_pool(vm_mngr_t *vm_mngr)
unsigned int div_op(unsigned int size, unsigned int a, unsigned int b, unsigned int c)
struct memory_page_node * memory_page_pool_tab[MAX_MEMORY_PAGE_POOL_TAB]
#define LIST_INSERT_AFTER(listelm, elm, field)
#define LIST_INSERT_HEAD(head, elm, field)
int vm_write_mem(vm_mngr_t *vm_mngr, uint64_t addr, char *buffer, uint64_t size)
uint64_t get_exception_flag(vm_mngr_t *vm_mngr)
unsigned int get_memory_page_next(vm_mngr_t *vm_mngr, unsigned int n_ad)
int rcl_cf_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
int is_mem_mapped(vm_mngr_t *vm_mngr, uint64_t ad)
int rcr_cf_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
unsigned short vm_MEM_LOOKUP_16(vm_mngr_t *vm_mngr, uint64_t addr)
void vm_MEM_WRITE_64(vm_mngr_t *vm_mngr, uint64_t addr, uint64_t src)
uint32_t set_endian32(vm_mngr_t *vm_mngr, uint32_t val)
#define MAX_MEMORY_PAGE_POOL_TAB
void check_write_code_bloc(vm_mngr_t *vm_mngr, uint64_t my_size, uint64_t addr)
#define EXCEPT_ACCESS_VIOL
unsigned int imul_lo_op_16(short a, short b)
int rcl_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
void vm_MEM_WRITE_16(vm_mngr_t *vm_mngr, uint64_t addr, unsigned short src)
struct memory_page_list_head memory_page_pool
double fmul(double a, double b)
#define Endian32_Swap(value)
void dump_code_bloc(vm_mngr_t *vm_mngr)
unsigned int fcom_c3(double a, double b)
unsigned int access_segment(unsigned int d)
int imul_hi_op_08(char a, char b)
#define EXCEPT_BREAKPOINT_INTERN
unsigned int fcom_c0(double a, double b)
uint64_t rot_left(uint64_t size, uint64_t a, uint64_t b)
unsigned int load_segment_limit_ok(unsigned int d)
void vm_MEM_WRITE_08(vm_mngr_t *vm_mngr, uint64_t addr, unsigned char src)
unsigned int umul16_hi(unsigned short a, unsigned short b)
unsigned int double_to_mem_32(double d)
unsigned int parity(unsigned int a)
double mem_32_to_double(unsigned int m)
int rcr_rez_op(unsigned int size, unsigned int a, unsigned int b, unsigned int cf)
double fscale(double a, double b)
unsigned int imul_lo_op_32(int a, int b)
void remove_memory_breakpoint(vm_mngr_t *vm_mngr, uint64_t ad, unsigned int access)
void dump_memory_breakpoint_pool(vm_mngr_t *vm_mngr)
unsigned int imul_lo_op_08(char a, char b)
int64_t double_to_int_64(double d)
unsigned int access_segment_ok(unsigned int d)
uint64_t get_mem_base_addr(vm_mngr_t *vm_mngr, uint64_t ad, uint64_t *addr_base)
unsigned int x86_bsr(uint64_t src, unsigned int size)
struct memory_page_list_head memory_page_pool
struct memory_page_node * create_memory_page_node(uint64_t ad, unsigned int size, unsigned int access)
double fsub(double a, double b)
void hexdump(char *m, unsigned int l)
#define Endian64_Swap(value)
double int_64_to_double(uint64_t m)
int is_mpn_in_tab(vm_mngr_t *vm_mngr, struct memory_page_node *mpn_a)
uint64_t double_to_mem_64(double d)
unsigned int code_bloc_pool_ad_max
double fadd(double a, double b)
unsigned int load_segment_limit(unsigned int d)
#define LIST_INSERT_BEFORE(listelm, elm, field)
unsigned int my_imul08(unsigned int a, unsigned int b)
unsigned int load_tr_segment_selector(unsigned int d)
void print_val(uint64_t base, uint64_t addr)
uint64_t rot_right(uint64_t size, uint64_t a, uint64_t b)
unsigned int fcom_c2(double a, double b)
double int_16_to_double(unsigned int m)
int32_t double_to_int_32(double d)
void dump_code_bloc_pool(vm_mngr_t *vm_mngr)
uint64_t shift_left_logic(uint64_t size, uint64_t a, uint64_t b)
PyObject * addr2BlocObj(vm_mngr_t *vm_mngr, uint64_t addr)
void init_code_bloc_pool(vm_mngr_t *vm_mngr)
unsigned int mul_hi_op(unsigned int size, unsigned int a, unsigned int b)
double mem_64_to_double(uint64_t m)
uint64_t set_endian64(vm_mngr_t *vm_mngr, uint64_t val)
uint64_t shift_right_logic(uint64_t size, uint64_t a, uint64_t b)
void add_code_bloc(vm_mngr_t *vm_mngr, struct code_bloc_node *cbp)
char * dump(vm_mngr_t *vm_mngr)
static uint64_t memory_page_read(vm_mngr_t *vm_mngr, unsigned int my_size, uint64_t ad)
struct code_bloc_list_head code_bloc_pool
struct memory_page_node * get_memory_page_from_address(vm_mngr_t *vm_mngr, uint64_t ad)
struct code_bloc_node * create_code_bloc_node(uint64_t ad_start, uint64_t ad_stop)
unsigned int x86_bsf(uint64_t src, unsigned int size)
unsigned int mul_lo_op(unsigned int size, unsigned int a, unsigned int b)
#define Endian16_Swap(value)
void init_memory_breakpoint(vm_mngr_t *vm_mngr)
void vm_MEM_WRITE_32(vm_mngr_t *vm_mngr, uint64_t addr, unsigned int src)
double fdiv(double a, double b)
uint16_t bcdadd_cf_16(uint16_t a, uint16_t b)
int vm_read_mem(vm_mngr_t *vm_mngr, uint64_t addr, char **buffer_ptr, uint64_t size)