File: test_session.py

package info (click to toggle)
androguard 3.4.0~a1-17
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 89,880 kB
  • sloc: python: 25,183; xml: 3,203; java: 1,849; makefile: 216; sh: 17
file content (117 lines) | stat: -rw-r--r-- 5,292 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import unittest

import sys
from androguard.core.bytecodes.apk import APK

from androguard import session


class SessionTest(unittest.TestCase):
    def testSessionDex(self):
        s = session.Session()
        s.add("examples/android/TestsAndroguard/bin/classes.dex")

        self.assertEqual(len(s.analyzed_apk), 0)
        self.assertEqual(len(s.analyzed_files), 1)
        self.assertEqual(len(s.analyzed_digest), 1)
        self.assertEqual(len(s.analyzed_vms), 1)
        self.assertEqual(len(s.analyzed_dex), 1)

    def testSessionDexIPython(self):
        """ Test if exporting ipython works"""
        s = session.Session(export_ipython=True)
        s.add("examples/android/TestsAndroguard/bin/classes.dex")

        self.assertEqual(len(s.analyzed_apk), 0)
        self.assertEqual(len(s.analyzed_files), 1)
        self.assertEqual(len(s.analyzed_digest), 1)
        self.assertEqual(len(s.analyzed_vms), 1)
        self.assertEqual(len(s.analyzed_dex), 1)

    def testSessionAPK(self):
        s = session.Session()
        s.add("examples/android/TestsAndroguard/bin/TestActivity.apk")

        self.assertEqual(len(s.analyzed_apk), 1)
        self.assertEqual(len(s.analyzed_files), 1)
        self.assertEqual(len(s.analyzed_files['examples/android/TestsAndroguard/bin/TestActivity.apk']), 2)
        self.assertEqual(len(s.analyzed_digest), 2)
        # Two VMs analyzed: one at the APK level, one at the dex level
        self.assertEqual(len(s.analyzed_vms), 2)
        self.assertEqual(len(s.analyzed_dex), 1)

    def testSessionAPKIP(self):
        """Test if exporting to ipython works with APKs"""
        s = session.Session(export_ipython=True)
        s.add("examples/android/TestsAndroguard/bin/TestActivity.apk")

        self.assertEqual(len(s.analyzed_apk), 1)
        self.assertEqual(len(s.analyzed_files), 1)
        self.assertEqual(len(s.analyzed_files['examples/android/TestsAndroguard/bin/TestActivity.apk']), 2)
        self.assertEqual(len(s.analyzed_digest), 2)
        # Two VMs analyzed: one at the APK level, one at the dex level
        self.assertEqual(len(s.analyzed_vms), 2)
        self.assertEqual(len(s.analyzed_dex), 1)

    def testSessionSave(self):
        s = session.Session()
        with open("examples/android/TestsAndroguard/bin/TestActivity.apk",
                  "rb") as fd:
            s.add("examples/android/TestsAndroguard/bin/TestActivity.apk",
                  fd.read())
            session.Save(s, "test_session")

    @unittest.skipIf(True, "fails in autopkgtest but works locally, probably Python 3.12 issue")
    def testSessionLoad(self):
        s = session.Session()
        with open("examples/android/TestsAndroguard/bin/TestActivity.apk",
                  "rb") as fd:
            s.add("examples/android/TestsAndroguard/bin/TestActivity.apk",
                  fd.read())
            session.Save(s, "test_session")

        self.assertIn('2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7', s.analyzed_dex.keys())
        self.assertIn('3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb', s.analyzed_apk.keys())
        x = s.analyzed_apk['3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb'][0]
        self.assertIsInstance(x, APK)

        nsession = session.Load("test_session")
        self.assertIn('2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7', nsession.analyzed_dex.keys())
        self.assertIn('3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb', nsession.analyzed_apk.keys())
        y = nsession.analyzed_apk['3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb'][0]
        self.assertIsInstance(y, APK)

    def testSessionClassesDex(self):
        """Test if all classes.dex are added into the session"""
        from androguard.core.bytecodes.dvm import DalvikVMFormat
        from androguard.core.analysis.analysis import Analysis

        s = session.Session()

        # 0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951
        x = s.add("examples/tests/Test.dex")
        self.assertEqual(x, "0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951")
        self.assertIn('0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951', s.analyzed_dex)

        dexfiles = list(s.get_objects_dex())

        self.assertEqual(len(dexfiles), 1)
        df = dexfiles[0]
        self.assertEqual(df[0], "0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951")
        self.assertIsInstance(df[1], DalvikVMFormat)
        self.assertIsInstance(df[2], Analysis)
        self.assertIn(df[1], df[2].vms)

        x = s.add("examples/android/TestsAndroguard/bin/TestActivity.apk")
        self.assertEqual(x, '3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb')
        self.assertIn('2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7', s.analyzed_dex)

        dexfiles = list(s.get_objects_dex())
        self.assertEqual(len(dexfiles), 2)
        self.assertEqual(sorted(['0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951',
            '2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7']),
            sorted(map(lambda x: x[0], dexfiles)))


if __name__ == '__main__':
    unittest.main()