#include <inttypes.h>#include <sys/types.h>
Go to the source code of this file.
Defines | |
| #define | MEM_BYTE_READ(cpu_p, addr, data_p) |
| #define | MEM_BYTE_WRITE(cpu_p, addr, data) |
| #define | MEM_WORD_READ(cpu_p, addr, data_p) |
| #define | MEM_WORD_WRITE(cpu_p, addr, data) |
| #define | MEM_DWORD_READ(cpu_p, addr, data_p) |
| #define | MEM_DWORD_WRITE(cpu_p, addr, data) |
Enumerations | |
| enum | emu_segment { s_cs = 0, s_ss, s_ds, s_es, s_fs, s_gs } |
Functions | |
| struct emu_memory * | emu_memory_new (struct emu *e) |
| void | emu_memory_clear (struct emu_memory *em) |
| void | emu_memory_free (struct emu_memory *em) |
| int32_t | emu_memory_read_byte (struct emu_memory *m, uint32_t addr, uint8_t *byte) |
| int32_t | emu_memory_read_word (struct emu_memory *m, uint32_t addr, uint16_t *word) |
| int32_t | emu_memory_read_dword (struct emu_memory *m, uint32_t addr, uint32_t *dword) |
| int32_t | emu_memory_read_block (struct emu_memory *m, uint32_t addr, void *dest, size_t len) |
| int32_t | emu_memory_read_string (struct emu_memory *m, uint32_t addr, struct emu_string *s, uint32_t maxsize) |
| int32_t | emu_memory_write_byte (struct emu_memory *m, uint32_t addr, uint8_t byte) |
| int32_t | emu_memory_write_word (struct emu_memory *m, uint32_t addr, uint16_t word) |
| int32_t | emu_memory_write_dword (struct emu_memory *m, uint32_t addr, uint32_t dword) |
| int32_t | emu_memory_write_block (struct emu_memory *m, uint32_t addr, void *src, size_t len) |
| void | emu_memory_segment_select (struct emu_memory *m, enum emu_segment s) |
| enum emu_segment | emu_memory_segment_get (struct emu_memory *m) |
| int32_t | emu_memory_alloc (struct emu_memory *m, uint32_t *addr, size_t len) |
| uint32_t | emu_memory_get_usage (struct emu_memory *m) |
| void | emu_memory_mode_ro (struct emu_memory *m) |
| void | emu_memory_mode_rw (struct emu_memory *m) |
| #define MEM_BYTE_READ | ( | cpu_p, | |||
| addr, | |||||
| data_p | ) |
{ int32_t ret = emu_memory_read_byte((cpu_p)->mem, addr, data_p); \
if( ret != 0 ) \
return ret; }
Referenced by instr_adc_10(), instr_adc_12(), instr_add_00(), instr_add_02(), instr_and_20(), instr_and_22(), instr_cmp_38(), instr_cmp_3a(), instr_cmps_a6(), instr_group_1_80_adc(), instr_group_1_80_add(), instr_group_1_80_and(), instr_group_1_80_cmp(), instr_group_1_80_or(), instr_group_1_80_sbb(), instr_group_1_80_sub(), instr_group_1_80_xor(), instr_group_2_c0_rcl(), instr_group_2_c0_rcr(), instr_group_2_c0_rol(), instr_group_2_c0_ror(), instr_group_2_c0_sal(), instr_group_2_c0_sar(), instr_group_2_c0_shr(), instr_group_2_d0_rcl(), instr_group_2_d0_rcr(), instr_group_2_d0_rol(), instr_group_2_d0_ror(), instr_group_2_d0_sal(), instr_group_2_d0_sar(), instr_group_2_d0_shr(), instr_group_2_d2_rcl(), instr_group_2_d2_rcr(), instr_group_2_d2_rol(), instr_group_2_d2_ror(), instr_group_2_d2_sal(), instr_group_2_d2_sar(), instr_group_2_d2_shr(), instr_group_3_f6_div(), instr_group_3_f6_idiv(), instr_group_3_f6_imul(), instr_group_3_f6_mul(), instr_group_3_f6_neg(), instr_group_3_f6_not(), instr_group_3_f6_test(), instr_group_4_fe_dec(), instr_group_4_fe_inc(), instr_lods_ac(), instr_mov_8a(), instr_mov_a0(), instr_movsb(), instr_movsx_0fbe(), instr_movzx_0fb6(), instr_or_08(), instr_or_0a(), instr_sbb_18(), instr_sbb_1a(), instr_scas_ae(), instr_sub_28(), instr_sub_2a(), instr_test_84(), instr_xchg_86(), instr_xor_30(), and instr_xor_32().
| #define MEM_BYTE_WRITE | ( | cpu_p, | |||
| addr, | |||||
| data | ) |
{ int32_t ret = emu_memory_write_byte((cpu_p)->mem, addr, data); \
if( ret != 0 ) \
return ret; }
Referenced by instr_adc_10(), instr_add_00(), instr_and_20(), instr_group_1_80_adc(), instr_group_1_80_add(), instr_group_1_80_and(), instr_group_1_80_cmp(), instr_group_1_80_or(), instr_group_1_80_sbb(), instr_group_1_80_sub(), instr_group_1_80_xor(), instr_group_2_c0_rcl(), instr_group_2_c0_rcr(), instr_group_2_c0_rol(), instr_group_2_c0_ror(), instr_group_2_c0_sal(), instr_group_2_c0_sar(), instr_group_2_c0_shr(), instr_group_2_d0_rcl(), instr_group_2_d0_rcr(), instr_group_2_d0_rol(), instr_group_2_d0_ror(), instr_group_2_d0_sal(), instr_group_2_d0_sar(), instr_group_2_d0_shr(), instr_group_2_d2_rcl(), instr_group_2_d2_rcr(), instr_group_2_d2_rol(), instr_group_2_d2_ror(), instr_group_2_d2_sal(), instr_group_2_d2_sar(), instr_group_2_d2_shr(), instr_group_3_f6_neg(), instr_group_3_f6_not(), instr_group_4_fe_dec(), instr_group_4_fe_inc(), instr_mov_88(), instr_mov_a2(), instr_mov_c6(), instr_movsb(), instr_or_08(), instr_sbb_18(), instr_setcc_0f94(), instr_setcc_0f95(), instr_stos_aa(), instr_sub_28(), instr_xchg_86(), and instr_xor_30().
| #define MEM_DWORD_READ | ( | cpu_p, | |||
| addr, | |||||
| data_p | ) |
{ int32_t ret = emu_memory_read_dword((cpu_p)->mem, addr, data_p); \
if( ret != 0 ) \
return ret; }
Referenced by env_w32_hook_fclose(), env_w32_hook_fopen(), env_w32_hook_fwrite(), instr_adc_11(), instr_adc_13(), instr_add_01(), instr_add_03(), instr_and_21(), instr_and_23(), instr_cmp_39(), instr_cmp_3b(), instr_cmps_a7(), instr_group_1_81_adc(), instr_group_1_81_add(), instr_group_1_81_and(), instr_group_1_81_cmp(), instr_group_1_81_or(), instr_group_1_81_sbb(), instr_group_1_81_sub(), instr_group_1_81_xor(), instr_group_1_83_adc(), instr_group_1_83_add(), instr_group_1_83_and(), instr_group_1_83_cmp(), instr_group_1_83_or(), instr_group_1_83_sbb(), instr_group_1_83_sub(), instr_group_1_83_xor(), instr_group_2_c1_rcl(), instr_group_2_c1_rcr(), instr_group_2_c1_rol(), instr_group_2_c1_ror(), instr_group_2_c1_sal(), instr_group_2_c1_sar(), instr_group_2_c1_shr(), instr_group_2_d1_rcl(), instr_group_2_d1_rcr(), instr_group_2_d1_rol(), instr_group_2_d1_ror(), instr_group_2_d1_sal(), instr_group_2_d1_sar(), instr_group_2_d1_shr(), instr_group_2_d3_rcl(), instr_group_2_d3_rcr(), instr_group_2_d3_rol(), instr_group_2_d3_ror(), instr_group_2_d3_sal(), instr_group_2_d3_sar(), instr_group_2_d3_shr(), instr_group_3_f7_div(), instr_group_3_f7_idiv(), instr_group_3_f7_imul(), instr_group_3_f7_mul(), instr_group_3_f7_neg(), instr_group_3_f7_not(), instr_group_3_f7_test(), instr_group_5_ff_call(), instr_group_5_ff_dec(), instr_group_5_ff_inc(), instr_group_5_ff_jmp(), instr_group_5_ff_push(), instr_imul_0f_af(), instr_imul_69(), instr_imul_6b(), instr_lods_ad(), instr_mov_8b(), instr_mov_a1(), instr_or_09(), instr_or_0b(), instr_sbb_19(), instr_sbb_1b(), instr_scas_af(), instr_sub_29(), instr_sub_2b(), instr_test_85(), instr_xchg_87(), instr_xor_31(), and instr_xor_33().
| #define MEM_DWORD_WRITE | ( | cpu_p, | |||
| addr, | |||||
| data | ) |
{ uint32_t val; \
bcopy(&(data), &val, 4); \
int32_t ret = emu_memory_write_dword((cpu_p)->mem, addr, val); \
if( ret != 0 ) \
return ret; }
Referenced by emu_cpu_step(), instr_adc_11(), instr_add_01(), instr_and_21(), instr_group_10_8f_pop(), instr_group_1_81_adc(), instr_group_1_81_add(), instr_group_1_81_and(), instr_group_1_81_or(), instr_group_1_81_sbb(), instr_group_1_81_sub(), instr_group_1_81_xor(), instr_group_1_83_adc(), instr_group_1_83_add(), instr_group_1_83_and(), instr_group_1_83_or(), instr_group_1_83_sbb(), instr_group_1_83_sub(), instr_group_1_83_xor(), instr_group_2_c1_rcl(), instr_group_2_c1_rcr(), instr_group_2_c1_rol(), instr_group_2_c1_ror(), instr_group_2_c1_sal(), instr_group_2_c1_sar(), instr_group_2_c1_shr(), instr_group_2_d1_rcl(), instr_group_2_d1_rcr(), instr_group_2_d1_rol(), instr_group_2_d1_ror(), instr_group_2_d1_sal(), instr_group_2_d1_sar(), instr_group_2_d1_shr(), instr_group_2_d3_rcl(), instr_group_2_d3_rcr(), instr_group_2_d3_rol(), instr_group_2_d3_ror(), instr_group_2_d3_sal(), instr_group_2_d3_sar(), instr_group_2_d3_shr(), instr_group_3_f7_neg(), instr_group_3_f7_not(), instr_group_5_ff_dec(), instr_group_5_ff_inc(), instr_mov_89(), instr_mov_a3(), instr_mov_c7(), instr_or_09(), instr_sbb_19(), instr_sldt_0f00(), instr_stos_ab(), instr_sub_29(), instr_xchg_87(), and instr_xor_31().
| #define MEM_WORD_READ | ( | cpu_p, | |||
| addr, | |||||
| data_p | ) |
{ int32_t ret = emu_memory_read_word((cpu_p)->mem, addr, data_p); \
if( ret != 0 ) \
return ret; }
Referenced by instr_adc_11(), instr_adc_13(), instr_add_01(), instr_add_03(), instr_and_21(), instr_and_23(), instr_cmp_39(), instr_cmp_3b(), instr_cmps_a7(), instr_group_1_81_adc(), instr_group_1_81_add(), instr_group_1_81_and(), instr_group_1_81_cmp(), instr_group_1_81_or(), instr_group_1_81_sbb(), instr_group_1_81_sub(), instr_group_1_81_xor(), instr_group_1_83_adc(), instr_group_1_83_add(), instr_group_1_83_and(), instr_group_1_83_cmp(), instr_group_1_83_or(), instr_group_1_83_sbb(), instr_group_1_83_sub(), instr_group_1_83_xor(), instr_group_2_c1_rcl(), instr_group_2_c1_rcr(), instr_group_2_c1_rol(), instr_group_2_c1_ror(), instr_group_2_c1_sal(), instr_group_2_c1_sar(), instr_group_2_c1_shr(), instr_group_2_d1_rcl(), instr_group_2_d1_rcr(), instr_group_2_d1_rol(), instr_group_2_d1_ror(), instr_group_2_d1_sal(), instr_group_2_d1_sar(), instr_group_2_d1_shr(), instr_group_2_d3_rcl(), instr_group_2_d3_rcr(), instr_group_2_d3_rol(), instr_group_2_d3_ror(), instr_group_2_d3_sal(), instr_group_2_d3_sar(), instr_group_2_d3_shr(), instr_group_3_f7_div(), instr_group_3_f7_idiv(), instr_group_3_f7_imul(), instr_group_3_f7_mul(), instr_group_3_f7_neg(), instr_group_3_f7_not(), instr_group_3_f7_test(), instr_group_5_ff_call(), instr_group_5_ff_dec(), instr_group_5_ff_inc(), instr_group_5_ff_jmp(), instr_group_5_ff_push(), instr_imul_0f_af(), instr_imul_69(), instr_imul_6b(), instr_lods_ad(), instr_mov_8b(), instr_mov_a1(), instr_movsx_0fbf(), instr_movzx_0fb7(), instr_or_09(), instr_or_0b(), instr_sbb_19(), instr_sbb_1b(), instr_scas_af(), instr_sub_29(), instr_sub_2b(), instr_test_85(), instr_xchg_87(), instr_xor_31(), and instr_xor_33().
| #define MEM_WORD_WRITE | ( | cpu_p, | |||
| addr, | |||||
| data | ) |
{ uint16_t val; \
bcopy(&(data), &val, 2); \
int32_t ret = emu_memory_write_word((cpu_p)->mem, addr, val); \
if( ret != 0 ) \
return ret; }
Referenced by instr_adc_11(), instr_add_01(), instr_and_21(), instr_group_1_81_adc(), instr_group_1_81_add(), instr_group_1_81_and(), instr_group_1_81_or(), instr_group_1_81_sbb(), instr_group_1_81_sub(), instr_group_1_81_xor(), instr_group_1_83_adc(), instr_group_1_83_add(), instr_group_1_83_and(), instr_group_1_83_or(), instr_group_1_83_sbb(), instr_group_1_83_sub(), instr_group_1_83_xor(), instr_group_2_c1_rcl(), instr_group_2_c1_rcr(), instr_group_2_c1_rol(), instr_group_2_c1_ror(), instr_group_2_c1_sal(), instr_group_2_c1_sar(), instr_group_2_c1_shr(), instr_group_2_d1_rcl(), instr_group_2_d1_rcr(), instr_group_2_d1_rol(), instr_group_2_d1_ror(), instr_group_2_d1_sal(), instr_group_2_d1_sar(), instr_group_2_d1_shr(), instr_group_2_d3_rcl(), instr_group_2_d3_rcr(), instr_group_2_d3_rol(), instr_group_2_d3_ror(), instr_group_2_d3_sal(), instr_group_2_d3_sar(), instr_group_2_d3_shr(), instr_group_3_f7_neg(), instr_group_3_f7_not(), instr_group_5_ff_dec(), instr_group_5_ff_inc(), instr_mov_89(), instr_mov_a3(), instr_mov_c7(), instr_or_09(), instr_sbb_19(), instr_sldt_0f00(), instr_stos_ab(), instr_sub_29(), instr_xchg_87(), and instr_xor_31().
| enum emu_segment |
| int32_t emu_memory_alloc | ( | struct emu_memory * | m, | |
| uint32_t * | addr, | |||
| size_t | len | |||
| ) |
References page_alloc(), page_is_alloc(), and PAGE_SIZE.
Referenced by env_w32_hook_malloc().

| void emu_memory_clear | ( | struct emu_memory * | em | ) |
References FS_SEGMENT_DEFAULT_OFFSET, PAGE_BITS, PAGESET_BITS, PAGESET_SIZE, emu_memory::pagetable, emu_memory::read_only_access, s_fs, and emu_memory::segment_table.
Referenced by emu_shellcode_run_and_track().
| void emu_memory_free | ( | struct emu_memory * | em | ) |
References PAGE_BITS, PAGESET_BITS, PAGESET_SIZE, and emu_memory::pagetable.
Referenced by emu_free().
| uint32_t emu_memory_get_usage | ( | struct emu_memory * | m | ) |
References PAGE_BITS, PAGE_SIZE, PAGESET_BITS, PAGESET_SIZE, and emu_memory::pagetable.
| void emu_memory_mode_ro | ( | struct emu_memory * | m | ) |
References emu_memory::read_only_access.
Referenced by emu_shellcode_test().
| void emu_memory_mode_rw | ( | struct emu_memory * | m | ) |
References emu_memory::read_only_access.
Referenced by emu_shellcode_test().
| struct emu_memory* emu_memory_new | ( | struct emu * | e | ) | [read] |
References emu_memory::emu, FS_SEGMENT_DEFAULT_OFFSET, PAGE_BITS, PAGESET_BITS, emu_memory::pagetable, emu_memory::read_only_access, s_fs, and emu_memory::segment_table.
Referenced by emu_new().
| int32_t emu_memory_read_block | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| void * | dest, | |||
| size_t | len | |||
| ) |
References emu_memory::emu, emu_errno_set(), emu_memory_read_block(), emu_strerror_set(), OFFSET, PAGE_SIZE, emu_memory::segment_offset, and translate_addr().
Referenced by emu_cpu_parse(), emu_memory_read_block(), emu_memory_read_dword(), emu_memory_read_string(), emu_memory_read_word(), env_linux_hook_socketcall(), env_w32_hook__lwrite(), env_w32_hook_bind(), env_w32_hook_connect(), env_w32_hook_fwrite(), env_w32_hook_send(), env_w32_hook_sendto(), and env_w32_hook_WriteFile().

| int32_t emu_memory_read_byte | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| uint8_t * | byte | |||
| ) |
References emu_memory::emu, emu_errno_set(), emu_strerror_set(), emu_memory::segment_offset, and translate_addr().
Referenced by emu_cpu_parse().

| int32_t emu_memory_read_dword | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| uint32_t * | dword | |||
| ) |
References emu_memory_read_block().
Referenced by emu_cpu_debug_print(), emu_cpu_parse(), env_linux_hook_execve(), env_linux_hook_socketcall(), and env_w32_hook_CreateProcessA().

| int32_t emu_memory_read_string | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| struct emu_string * | s, | |||
| uint32_t | maxsize | |||
| ) |
References emu_string::data, emu_memory_read_block(), emu_string::size, and translate_addr().
Referenced by env_linux_hook_execve(), env_w32_hook__execv(), env_w32_hook__lcreat(), env_w32_hook_CreateFileA(), env_w32_hook_CreateProcessA(), env_w32_hook_fopen(), env_w32_hook_GetProcAddress(), env_w32_hook_LoadLibrayA(), env_w32_hook_URLDownloadToFileA(), and env_w32_hook_WinExec().

| int32_t emu_memory_read_word | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| uint16_t * | word | |||
| ) |
References emu_memory_read_block().
Referenced by emu_cpu_parse().

| enum emu_segment emu_memory_segment_get | ( | struct emu_memory * | m | ) |
References emu_memory::segment_current.
Referenced by emu_env_w32_new(), instr_cmps_a6(), instr_cmps_a7(), instr_group_10_8f_pop(), instr_group_5_ff_push(), instr_scas_ae(), and instr_scas_af().
| void emu_memory_segment_select | ( | struct emu_memory * | m, | |
| enum emu_segment | s | |||
| ) |
References emu_memory::segment_current, emu_memory::segment_offset, and emu_memory::segment_table.
Referenced by emu_cpu_step(), emu_env_w32_new(), instr_cmps_a6(), instr_cmps_a7(), instr_group_10_8f_pop(), instr_group_5_ff_push(), instr_scas_ae(), and instr_scas_af().
| int32_t emu_memory_write_block | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| void * | src, | |||
| size_t | len | |||
| ) |
References emu_memory_write_block(), OFFSET, page_alloc(), PAGE_SIZE, emu_memory::read_only_access, emu_memory::segment_offset, and translate_addr().
Referenced by emu_env_w32_load_dll(), emu_env_w32_new(), emu_getpc_check(), emu_memory_write_block(), emu_memory_write_dword(), emu_memory_write_word(), emu_shellcode_run_and_track(), emu_shellcode_test(), env_w32_hook_GetSystemDirectoryA(), env_w32_hook_GetTempPathA(), and env_w32_hook_recv().

| int32_t emu_memory_write_byte | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| uint8_t | byte | |||
| ) |
References page_alloc(), emu_memory::read_only_access, emu_memory::segment_offset, and translate_addr().

| int32_t emu_memory_write_dword | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| uint32_t | dword | |||
| ) |
References emu_memory_write_block(), and emu_memory::read_only_access.
Referenced by emu_env_w32_new(), env_w32_hook_CreateProcessA(), and env_w32_hook_WriteFile().

| int32_t emu_memory_write_word | ( | struct emu_memory * | m, | |
| uint32_t | addr, | |||
| uint16_t | word | |||
| ) |
References emu_memory_write_block(), and emu_memory::read_only_access.

1.6.1