def atypes_process_bptr_test(): mem = MockMemory() alloc = MemoryAlloc(mem) # alloc proc proc = Process.alloc(alloc) # set list proc.seg_list = 0x100 assert proc.seg_list == BAddr(0x40) # check in mem seg list baddr struct = proc.get_type_struct() off = struct.pr_SegList_field.offset addr = proc.addr + off assert mem.r32(addr) == 0x40 # setup CLI cli = CLI.alloc(alloc) proc.cli = cli assert type(proc.cli) is CLI assert proc.cli == cli.addr # check in mem CLI baddr off = struct.pr_CLI_field.offset addr = proc.addr + off assert mem.r32(addr) == BAddr.from_addr(cli.addr).get_baddr() cli.free() # done proc.free() assert alloc.is_all_free()
def init_struct_test(): mem = MockMemory() # setup init table init_tab = 0x100 mem_ptr = 0x200 ib = InitStructBuilder(mem, init_tab) ib.init_byte(0, 21) ib.init_word(12, 0xDEAD) ib.init_long(34, 0xCAFEBABE) ib.init_struct(ib.SIZE_LONG, 40, [23, 42]) ib.init_struct(ib.SIZE_WORD, 64, [11, 7]) ib.init_struct(ib.SIZE_BYTE, 80, [1, 2, 3]) ib.end() # build struct i = InitStruct(mem) i.init_struct(init_tab, mem_ptr, 32) # check struct assert mem.r8(mem_ptr + 0) == 21 assert mem.r16(mem_ptr + 12) == 0xDEAD assert mem.r32(mem_ptr + 34) == 0xCAFEBABE assert mem.r32(mem_ptr + 40) == 23 assert mem.r32(mem_ptr + 44) == 42 assert mem.r16(mem_ptr + 64) == 11 assert mem.r16(mem_ptr + 66) == 7 assert mem.r8(mem_ptr + 80) == 1 assert mem.r8(mem_ptr + 81) == 2 assert mem.r8(mem_ptr + 82) == 3
def libtypes_process_bptr_test(): mem = MockMemory() alloc = MemoryAlloc(mem) # alloc proc proc = Process.alloc(alloc) # set list (as baddr) proc.seg_list.bptr = 0x40 assert proc.seg_list.bptr == 0x40 # check in mem seg list baddr off = proc.sdef.pr_SegList.offset addr = proc.addr + off assert mem.r32(addr) == 0x40 # setup CLI cli = CLI.alloc(alloc) proc.cli.ref = cli assert type(proc.cli.ref) is CLI assert proc.cli.aptr == cli.addr # check in mem CLI baddr off = proc.sdef.pr_CLI.offset addr = proc.addr + off assert mem.r32(addr) == cli.addr >> 2 cli.free() # done proc.free() assert alloc.is_all_free()
def init_struct_test(): mem = MockMemory() # setup init table init_tab = 0x100 mem_ptr = 0x200 ib = InitStructBuilder(mem, init_tab) ib.init_byte(0, 21) ib.init_word(12, 0xdead) ib.init_long(34, 0xcafebabe) ib.init_struct(ib.SIZE_LONG, 40, [23, 42]) ib.init_struct(ib.SIZE_WORD, 64, [11, 7]) ib.init_struct(ib.SIZE_BYTE, 80, [1, 2, 3]) ib.end() # build struct i = InitStruct(mem) i.init_struct(init_tab, mem_ptr, 32) # check struct assert mem.r8(mem_ptr + 0) == 21 assert mem.r16(mem_ptr + 12) == 0xdead assert mem.r32(mem_ptr + 34) == 0xcafebabe assert mem.r32(mem_ptr + 40) == 23 assert mem.r32(mem_ptr + 44) == 42 assert mem.r16(mem_ptr + 64) == 11 assert mem.r16(mem_ptr + 66) == 7 assert mem.r8(mem_ptr + 80) == 1 assert mem.r8(mem_ptr + 81) == 2 assert mem.r8(mem_ptr + 82) == 3
def astructs_astruct_baddr_test(): mem = MockMemory() ms = MyStruct(mem, 0x10) # write int to baddr ms.ms_SegList.set(0x40) # bptr auto converts back to baddr assert ms.ms_SegList.get() == 0x40 # baddr is stored in mem assert mem.r32(0x14) == 0x40 # write baddr ms.ms_SegList.set(0x20) assert mem.r32(0x14) == 0x20
def astruct_astruct_baddr_test(): mem = MockMemory() ms = MyStruct(mem, 0x10) # write int (addr) to baddr ms.ms_SegList = 0x100 # baddr auto converts back to addr assert ms.ms_SegList == 0x100 # but its an BAddr assert type(ms.ms_SegList) is BAddr assert ms.ms_SegList == BAddr(0x40) # baddr is stored in mem assert mem.r32(0x14) == 0x40 # write baddr ms.ms_SegList = BAddr(0x20) assert ms.ms_SegList == BAddr(0x20) assert mem.r32(0x14) == 0x20
def mem_cache_rwx_write_test(): mem = MemoryCache(0x100, 0x210) # build cache contents mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xdead) assert mem.r16(0x200) == 0xdead mem.w32(0x300, 0xcafebabe) assert mem.r32(0x300) == 0xcafebabe mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # write to main mem main_mem = MockMemory() mem.write_cache(main_mem) # check main mem assert main_mem.r8(0x100) == 42 assert main_mem.r16(0x200) == 0xdead assert main_mem.r32(0x300) == 0xcafebabe assert main_mem.read(0, 0x101) == 43 assert main_mem.read(1, 0x202) == 0x1234 assert main_mem.read(2, 0x304) == 0x11223344
def mem_cache_rwx_read_test(): mem = MockMemory() # build main mem contents mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xDEAD) assert mem.r16(0x200) == 0xDEAD mem.w32(0x300, 0xCAFEBABE) assert mem.r32(0x300) == 0xCAFEBABE mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # write to cache cmem = MemoryCache(0x100, 0x210) cmem.read_cache(mem) # check cache mem assert cmem.r8(0x100) == 42 assert cmem.r16(0x200) == 0xDEAD assert cmem.r32(0x300) == 0xCAFEBABE assert cmem.read(0, 0x101) == 43 assert cmem.read(1, 0x202) == 0x1234 assert cmem.read(2, 0x304) == 0x11223344
def mem_access_bptr_test(): mem = MockMemory() a = AccessStruct(mem, MyBCPLStruct, 0x42) # write/read addr a.w_s("bs_TestBptr", 44) assert a.r_s("bs_TestBptr") == 44 # check auto converted baddr assert mem.r32(0x42) == 11
def astructs_enum_inst_test(): mem = MockMemory() mem.w32(4, 3) # instance me = MyEnum(mem=mem, addr=4) assert me.get() == MyEnum.a assert str(me) == "a" assert repr(me) == "MyEnum('a')" assert int(me) == MyEnum.a # change me.set(MyEnum.c) assert me.get() == MyEnum.c assert str(me) == "c" assert int(me) == MyEnum.c assert mem.r32(4) == MyEnum.c me.set("b") assert me.get() == MyEnum.b assert str(me) == "b" assert int(me) == MyEnum.b assert mem.r32(4) == MyEnum.b
def machine_mem_rw_test(): mem = MockMemory() mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xDEAD) assert mem.r16(0x200) == 0xDEAD mem.w32(0x300, 0xCAFEBABE) assert mem.r32(0x300) == 0xCAFEBABE mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # invalid values with pytest.raises(ValueError): mem.w8(0x100, 0x100) with pytest.raises(ValueError): mem.w8(0x100, -1) # invalid values with pytest.raises(struct.error): mem.w16(0x100, 0x10000) with pytest.raises(struct.error): mem.w16(0x100, -2) # invalid values with pytest.raises(struct.error): mem.w32(0x100, 0x100000000) with pytest.raises(struct.error): mem.w32(0x100, -3) # invalid type with pytest.raises(TypeError): mem.w8(0x100, "hello") # invalid type with pytest.raises(struct.error): mem.w16(0x100, "hello") # invalid type with pytest.raises(struct.error): mem.w32(0x100, "hello") # invalid width with pytest.raises(ValueError): mem.write(7, 0x202, 12) with pytest.raises(ValueError): mem.read(7, 0x202)
def machine_mem_rw_test(): mem = MockMemory() mem.w8(0x100, 42) assert mem.r8(0x100) == 42 mem.w16(0x200, 0xdead) assert mem.r16(0x200) == 0xdead mem.w32(0x300, 0xcafebabe) assert mem.r32(0x300) == 0xcafebabe mem.write(0, 0x101, 43) assert mem.read(0, 0x101) == 43 mem.write(1, 0x202, 0x1234) assert mem.read(1, 0x202) == 0x1234 mem.write(2, 0x304, 0x11223344) assert mem.read(2, 0x304) == 0x11223344 # invalid values with pytest.raises(ValueError): mem.w8(0x100, 0x100) with pytest.raises(ValueError): mem.w8(0x100, -1) # invalid values with pytest.raises(struct.error): mem.w16(0x100, 0x10000) with pytest.raises(struct.error): mem.w16(0x100, -2) # invalid values with pytest.raises(struct.error): mem.w32(0x100, 0x100000000) with pytest.raises(struct.error): mem.w32(0x100, -3) # invalid type with pytest.raises(ValueError): mem.w8(0x100, 'hello') # invalid type with pytest.raises(struct.error): mem.w16(0x100, 'hello') # invalid type with pytest.raises(struct.error): mem.w32(0x100, 'hello') # invalid width with pytest.raises(ValueError): mem.write(7, 0x202, 12) with pytest.raises(ValueError): mem.read(7, 0x202)
def astructs_bitfield_inst_test(): mem = MockMemory() mem.w32(4, 1) # instance bf = MyBF(mem=mem, addr=4) assert str(bf) == "a" assert repr(bf) == "MyBF('a')" assert int(bf) == MyBF.a assert bf.has_bits(MyBF.a) assert bf.has_bits("a") # set bit bf.set_bits(MyBF.c) assert str(bf) == "a|c" assert int(bf) == MyBF.c | MyBF.a assert bf.has_bits("c") assert bf.has_bits(MyBF.c) assert bf.has_bits("a") assert bf.has_bits(MyBF.a) assert mem.r32(4) == MyBF.c | MyBF.a # clr bit bf.clr_bits(MyBF.a) assert str(bf) == "c" assert int(bf) == MyBF.c assert bf.has_bits("c") assert bf.has_bits(MyBF.c) assert not bf.has_bits("a") assert not bf.has_bits(MyBF.a) assert mem.r32(4) == MyBF.c # set value bf.set(MyBF.a | MyBF.b) assert str(bf) == "a|b" assert int(bf) == MyBF.b | MyBF.a assert bf.has_bits("b") assert bf.has_bits(MyBF.b) assert bf.has_bits("a") assert bf.has_bits(MyBF.a) assert mem.r32(4) == MyBF.b | MyBF.a
def make_functions_ptr_test(): mem = MockMemory() # build an offset array ptr = 0 fptrs = [0x100, 0x202, 0x404, 0x808, 0x10000] for fptr in fptrs: mem.w32(ptr, fptr) ptr += 4 mem.w32s(ptr, -1) # build func table lib_base = 0x800 mf = MakeFuncs(mem) size = mf.make_functions(lib_base, 0) assert size == len(fptrs) * 6 # check jump table ptr = lib_base - 6 for fptr in fptrs: assert mem.r16(ptr) == op_jmp assert mem.r32(ptr+2) == fptr ptr -= 6
def make_functions_offset_test(): mem = MockMemory() # build an offset array ptr = 0 offsets = [-10, 2, 16, 32, 68, 100] for off in offsets: mem.w16s(ptr, off) ptr += 2 mem.w16s(ptr, -1) # build func table disp_base = 0x1000 lib_base = 0x800 mf = MakeFuncs(mem) size = mf.make_functions(lib_base, 0, disp_base) assert size == len(offsets) * 6 # check jump table ptr = lib_base - 6 for off in offsets: addr = disp_base + off assert mem.r16(ptr) == op_jmp assert mem.r32(ptr+2) == addr ptr -= 6