Exemple #1
0
    def _assign_value_wide(self, instruction):
        """
        For 64 bit, it has two register, which is vx and vx+1
        """
        reg = instruction[1]
        value = instruction[2]
        index = int(reg[1:])
        reg_plus_one = f"v{index + 1}"

        variable_object = RegisterObject(reg, value)
        variable_object2 = RegisterObject(reg_plus_one, value)
        self.table_obj.insert(index, variable_object)
        self.table_obj.insert(index + 1, variable_object2)
Exemple #2
0
    def AGET_OBJECT(self, instruction):
        """
        aget-object vx,vy,vz

        Gets an object reference value of an object reference array into vx. The array is referenced by vy and is
        indexed by vz.

        It means vx = vy[vz].
        """

        reg = instruction[1]
        index = int(reg[1:])

        try:

            array_obj = self.table_obj.get_obj_list(
                int(re.sub("[^0-9]", "", instruction[2][1:])), ).pop()
            array_index = self.table_obj.get_obj_list(
                int(re.sub("[^0-9]", "", instruction[3])), ).pop()

            variable_object = RegisterObject(
                reg,
                f"{array_obj.value}[{array_index.value}]",
            )
            self.table_obj.insert(index, variable_object)

        except IndexError as e:
            log.exception(f"{e} in AGET_OBJECT")
Exemple #3
0
    def MOVE_RESULT_WIDE(self, instruction):
        """
        move-result-wide vx

        Move the long/double result value of the previous method invocation into vx,vx+1.
        """
        reg = instruction[1]
        index = int(reg[1:])
        try:
            pre_ret = self.ret_stack.pop()
            variable_object = RegisterObject(reg, pre_ret)
            variable_object2 = RegisterObject(f"v{index + 1}", pre_ret)
            self.table_obj.insert(index, variable_object)
            self.table_obj.insert(index + 1, variable_object2)
        except IndexError as e:
            log.exception(f"{e} in MOVE_RESULT_WIDE")
    def test_move_result_object(self, pyeval):
        v6_mock_variable_obj = RegisterObject("v6", "some_string", None)

        pyeval.table_obj.insert(6, v6_mock_variable_obj)

        assert pyeval.table_obj.pop(6).register_name == "v6"
        assert pyeval.table_obj.pop(6).value == "some_string"
        assert pyeval.table_obj.pop(6).called_by_func == []

        first_instruction = [
            "invoke-virtual",
            "v6",
            "Lcom/google/progress/ContactsCollecter;->getContactList()Ljava/lang/String;",
        ]

        second_instruction = ["move-result-object", "v1"]

        pyeval.INVOKE_VIRTUAL(first_instruction)
        pyeval.MOVE_RESULT_OBJECT(second_instruction)

        assert pyeval.table_obj.pop(1).register_name == "v1"
        assert (
            pyeval.table_obj.pop(1).value ==
            "Lcom/google/progress/ContactsCollecter;->getContactList()Ljava/lang/String;(some_string)"
        )
        assert pyeval.table_obj.pop(1).called_by_func == []
Exemple #5
0
    def _assign_value(self, instruction):

        reg = instruction[1]
        value = instruction[2]
        index = int(reg[1:])

        variable_object = RegisterObject(reg, value)
        self.table_obj.insert(index, variable_object)
    def test_init(self, variable_obj):
        with pytest.raises(TypeError):
            variable_obj_with_no_argu = RegisterObject()

        assert isinstance(variable_obj, RegisterObject)
        assert variable_obj.register_name == "v3"
        assert variable_obj.value == "append()"
        assert variable_obj.called_by_func == []
Exemple #7
0
    def _move(self, instruction):

        reg = instruction[1]
        index = int(reg[1:])
        try:
            pre_ret = self.ret_stack.pop()
            variable_object = RegisterObject(reg, pre_ret)
            self.table_obj.insert(index, variable_object)
        except IndexError as e:

            log.exception(f"{e} in _move")
def pyeval():
    pyeval = PyEval()

    # mock_hash_table = [...[], [v4_mock_variable_obj], [], [],
    # [v9_mock_variable_obj]....]
    v4_mock_variable_obj = RegisterObject(
        "v4",
        "Lcom/google/progress/SMSHelper;",
        None,
    )
    v9_mock_variable_obj = RegisterObject(
        "v9",
        "some_string",
        "java.io.file.close()",
    )
    pyeval.table_obj.insert(4, v4_mock_variable_obj)
    pyeval.table_obj.insert(9, v9_mock_variable_obj)

    yield pyeval

    del pyeval
    def test_aget_object(self, pyeval):
        """
        aget-object vx,vy,vz

        It means vx = vy[vz].
        """
        v2_mock_variable_obj = RegisterObject(
            "v2",
            "some_list_like[1,2,3,4]",
            "java.io.file.close()",
        )
        v3_mock_variable_obj = RegisterObject("v3", "2", None)
        pyeval.table_obj.insert(2, v2_mock_variable_obj)
        pyeval.table_obj.insert(3, v3_mock_variable_obj)

        instruction = ["aget-object", "v1", "v2", "v3"]

        pyeval.AGET_OBJECT(instruction)

        pyeval.table_obj.pop(1).register_name == "v1"
        pyeval.table_obj.pop(1).value = "some_list_like[1,2,3,4][2]"
        assert pyeval.table_obj.pop(1).called_by_func == []
    def test_called_by_func(self, variable_obj):
        variable_obj_with_called_by_func = RegisterObject(
            "v3",
            "append()",
            "toString()",
        )

        assert variable_obj_with_called_by_func.called_by_func == [
            "toString()",
        ]

        variable_obj.called_by_func = "file_list"
        variable_obj.called_by_func = "file_delete"

        assert variable_obj.called_by_func == ["file_list", "file_delete"]
def variable_obj():
    variable_obj = RegisterObject("v3", "append()", None)

    yield variable_obj

    del variable_obj