KR102443938B1 - 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치 - Google Patents

코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치 Download PDF

Info

Publication number
KR102443938B1
KR102443938B1 KR1020200182736A KR20200182736A KR102443938B1 KR 102443938 B1 KR102443938 B1 KR 102443938B1 KR 1020200182736 A KR1020200182736 A KR 1020200182736A KR 20200182736 A KR20200182736 A KR 20200182736A KR 102443938 B1 KR102443938 B1 KR 102443938B1
Authority
KR
South Korea
Prior art keywords
smali
code sequence
data set
code
training data
Prior art date
Application number
KR1020200182736A
Other languages
English (en)
Other versions
KR20220091733A (ko
Inventor
이정현
반영훈
Original Assignee
숭실대학교 산학협력단
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 숭실대학교 산학협력단 filed Critical 숭실대학교 산학협력단
Priority to KR1020200182736A priority Critical patent/KR102443938B1/ko
Priority to PCT/KR2021/001123 priority patent/WO2022139063A1/ko
Priority to US17/288,969 priority patent/US20220207296A1/en
Publication of KR20220091733A publication Critical patent/KR20220091733A/ko
Application granted granted Critical
Publication of KR102443938B1 publication Critical patent/KR102443938B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N20/00Machine learning

Abstract

코드 시퀀스 기반 지능형 핵심코드 식별 방법은, 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 단계; 추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 단계; 벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 단계; 타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 단계; 및 상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계;를 포함한다. 이에 따라, 애플리케이션이 실제로 동작하는 Smali 코드 시퀀스를 이용하여 애플리케이션의 객관적인 평가가 가능하다.

Description

코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치{METHOD FOR IDENTIFYING INTELLIGENT CORE CODE BASED ON CODE SEQUENCE, RECORDING MEDIUM AND DEVICE FOR PERFORMING THE METHOD}
본 발명은 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치에 관한 것으로서, 더욱 상세하게는 애플리케이션이 실제로 동작하는 소스 코드에 기반한 Smali 코드 시퀀스를 이용하여 애플리케이션을 객관적으로 평가하는 기술에 관한 것이다.
애플리케이션의 평가 기법은 대부분 퍼미션, 디스크립션, 유저 리뷰를 기반으로 수행되고 있다. 퍼미션과 디스크립션은 개발자의 주관적인 관점에서 요청되고, 작성되기 때문에, 객관성이 떨어지고 정확한 평가를 기대하기 어렵다.
또한, 퍼미션의 경우 개발자가 해당 퍼미션의 의미와 영향을 정확히 알지 못하고 과도하게 퍼미션을 요청하는 경우 애플리케이션의 실제 동작과 관계없이 평가에 영향을 미치는 경우가 많다.
유저 리뷰 역시 작성하는 유저의 주관적인 관점에서 작성되기 때문에 객관성이 떨어지게 되며, 기존의 기법들은 애플리케이션의 실제적인 동작을 정확히 반영하지 못한다는 한계점이 있다.
최근 애플리케이션의 실제 동작을 담당하는 API를 기반으로 하는 평가 방법이 등장하였지만, 이용되는 딥러닝, 머신러닝 기술이 다소 단순하여 API의 실제 사용 관계를 파악하지 못해서 API의 특징을 효과적으로 평가에 이용하지 못하고 있다.
또한, 애플리케이션을 분류할 때 일반 애플리케이션 또는 악성 애플리케이션의 단순한 분류만 가능하다는 한계가 있다.
KR 10-2020-0096766 A KR 10-2144044 B1 KR 10-1477050 B1
이에, 본 발명의 기술적 과제는 이러한 점에서 착안된 것으로 본 발명의 목적은 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 제공하는 것이다.
본 발명의 다른 목적은 상기 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 수행하기 위한 컴퓨터 프로그램이 기록된 기록 매체를 제공하는 것이다.
본 발명의 또 다른 목적은 상기 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 수행하기 위한 장치를 제공하는 것이다.
상기한 본 발명의 목적을 실현하기 위한 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법은, 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 단계; 추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 단계; 벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 단계; 타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 단계; 및 상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계;를 포함한다.
본 발명의 실시예에서, 상기 학습 데이터 셋을 구축하는 단계는, 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 단계; 및 딥러닝 모델에 입력으로 사용하기 위해 상기 학습 데이터 셋을 벡터화하는 단계;를 포함할 수 있다.
본 발명의 실시예에서, 상기 Smali 코드 시퀀스를 추출하는 단계는, 카테고리별 애플리케이션을 디컴파일 하여 Smali 코드를 추출하는 단계; 및 Smali 코드를 Smali 코드 시퀀스로 변환하는 단계;를 포함할 수 있다.
본 발명의 실시예에서, 상기 카테고리 분류 결과를 생성하는 단계는, 상기 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류할 수 있다.
본 발명의 실시예에서, 상기 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계는, 상기 딥러닝 모델에 대한 설명을 제공하는 알고리즘(LIME: Local Interpretable Model-Agnostic Explanation)을 이용할 수 있다.
상기한 본 발명의 다른 목적을 실현하기 위한 일 실시예에 따른 컴퓨터로 판독 가능한 저장 매체에는, 상기 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 수행하기 위한 컴퓨터 프로그램이 기록되어 있다.
상기한 본 발명의 또 다른 목적을 실현하기 위한 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 장치는, 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 시퀀스 추출부; 추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 벡터화부; 벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 학습부; 타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 분류부; 및 상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 식별부;를 포함한다.
본 발명의 실시예에서, 상기 벡터화부는, 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 데이터 셋 생성부; 및 딥러닝 모델에 입력으로 사용하기 위해 상기 학습 데이터 셋을 벡터화하는 임베딩부;를 포함할 수 있다.
본 발명의 실시예에서, 상기 시퀀스 추출부는, 카테고리별 애플리케이션을 디컴파일 하여 Smali 코드를 추출하는 Smali 코드부; 및 Smali 코드를 Smali 코드 시퀀스로 변환하는 Smali 시퀀스 변환부;를 포함할 수 있다.
본 발명의 실시예에서, 상기 분류부는, 상기 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류할 수 있다.
본 발명의 실시예에서, 상기 식별부는, 상기 딥러닝 모델에 대한 설명을 제공하는 알고리즘(LIME: Local Interpretable Model-Agnostic Explanation)을 이용할 수 있다.
이와 같은 코드 시퀀스 기반 지능형 핵심코드 식별 방법에 따르면, 애플리케이션이 실제로 동작하는 소스 코드에 기반한 Smali 코드를 추출하여 Smali 코드 시퀀스로 변환하여 이용하므로, 애플리케이션의 실제 동작 흐름을 파악하고, 딥러닝 모델을 이용하여 애플리케이션의 카테고리 분류와 함께 애플리케이션의 주요 Smali 코드 시퀀스를 파악할 수 있는 기술이다. 그러므로 실제 동작에 기반한 주요 Smali 코드 시퀀스를 파악하여 보안을 강화함으로써 악성 행위로 인한 피해를 사전에 방지할 수 있을 것으로 기대된다.
도 1은 본 발명의 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 장치의 블록도이다.
도 2는 도 1의 시퀀스 추출부의 Smali 코드 시퀀스 추출 과정을 설명하는 도면이다.
도 3은 도 1의 벡터화부의 블록도이다.
도 4는 본 발명의 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법의 흐름도이다.
후술하는 본 발명에 대한 상세한 설명은, 본 발명이 실시될 수 있는 특정 실시예를 예시로서 도시하는 첨부 도면을 참조한다. 이들 실시예는 당업자가 본 발명을 실시할 수 있기에 충분하도록 상세히 설명된다. 본 발명의 다양한 실시예는 서로 다르지만 상호 배타적일 필요는 없음이 이해되어야 한다. 예를 들어, 여기에 기재되어 있는 특정 형상, 구조 및 특성은 일 실시예에 관련하여 본 발명의 정신 및 범위를 벗어나지 않으면서 다른 실시예로 구현될 수 있다. 또한, 각각의 개시된 실시예 내의 개별 구성요소의 위치 또는 배치는 본 발명의 정신 및 범위를 벗어나지 않으면서 변경될 수 있음이 이해되어야 한다. 따라서, 후술하는 상세한 설명은 한정적인 의미로서 취하려는 것이 아니며, 본 발명의 범위는, 적절하게 설명된다면, 그 청구항들이 주장하는 것과 균등한 모든 범위와 더불어 첨부된 청구항에 의해서만 한정된다. 도면에서 유사한 참조부호는 여러 측면에 걸쳐서 동일하거나 유사한 기능을 지칭한다.
이하, 도면들을 참조하여 본 발명의 바람직한 실시예들을 보다 상세하게 설명하기로 한다.
도 1은 본 발명의 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 장치의 블록도이다.
본 발명에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 장치(10, 이하 장치)는 애플리케이션의 Smali 코드를 기반으로 애플리케이션의 주요 Smali 코드 시퀀스를 식별하여 평가한다. Smali 코드는 애플리케이션이 실제로 동작하는 소스 코드에 기반하기 때문에 이를 변환한 Smali 코드 시퀀스를 이용하면 애플리케이션의 실제 동작 흐름을 반영하므로 애플리케이션의 객관적인 평가가 가능하다.
도 1을 참조하면, 본 발명에 따른 장치(10)는 시퀀스 추출부(100), 벡터화부(200), 학습부(300), 분류부(400) 및 식별부(500)를 포함한다.
본 발명의 상기 장치(10)는 코드 시퀀스 기반 지능형 핵심코드 식별을 수행하기 위한 소프트웨어(애플리케이션)가 설치되어 실행될 수 있으며, 상기 시퀀스 추출부(100), 상기 벡터화부(200), 상기 학습부(300), 상기 분류부(400) 및 상기 식별부(500)의 구성은 상기 장치(10)에서 실행되는 상기 코드 시퀀스 기반 지능형 핵심코드 식별을 수행하기 위한 소프트웨어에 의해 제어될 수 있다.
상기 장치(10)는 별도의 단말이거나 또는 단말의 일부 모듈일 수 있다. 또한, 상기 시퀀스 추출부(100), 상기 벡터화부(200), 상기 학습부(300), 상기 분류부(400) 및 상기 식별부(500)의 구성은 통합 모듈로 형성되거나, 하나 이상의 모듈로 이루어 질 수 있다. 그러나, 이와 반대로 각 구성은 별도의 모듈로 이루어질 수도 있다.
상기 장치(10)는 이동성을 갖거나 고정될 수 있다. 상기 장치(10)는, 서버(server) 또는 엔진(engine) 형태일 수 있으며, 디바이스(device), 기구(apparatus), 단말(terminal), UE(user equipment), MS(mobile station), 무선기기(wireless device), 휴대기기(handheld device) 등 다른 용어로 불릴 수 있다.
상기 장치(10)는 운영체제(Operation System; OS), 즉 시스템을 기반으로 다양한 소프트웨어를 실행하거나 제작할 수 있다. 상기 운영체제는 소프트웨어가 장치의 하드웨어를 사용할 수 있도록 하기 위한 시스템 프로그램으로서, 안드로이드 OS, iOS, 윈도우 모바일 OS, 바다 OS, 심비안 OS, 블랙베리 OS 등 모바일 컴퓨터 운영체제 및 윈도우 계열, 리눅스 계열, 유닉스 계열, MAC, AIX, HP-UX 등 컴퓨터 운영체제를 모두 포함할 수 있다.
상기 시퀀스 추출부(100)는 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출한다. 상기 시퀀스 추출부(100)는 카테고리별 애플리케이션에 대해 애플리케이션을 디컴파일하여 Smali(An Assembler/Disassembler for Android's dex format) 코드를 추출한다. Smali 코드에는 애플리케이션의 세세한 동작 및 기능들이 다 담겨있다. 이후, Smali 코드 시퀀스로 변환하여 코드 동작 순서를 확인하게 된다.
도 2를 참조하면, smali 코드를 추출하는 구체적인 과정은 다음과 같다. APK를 디컴파일하면 안드로이드 패키지의 안에 Signature, AndroidManifest.xml, Resources, classes.dex 4가지가 존재한다. 이 중 classes.dex 파일을 추출할 수 있다. 이렇게 추출된 DEX 파일에는 header, string_ids, type_ids, proto_ids, field_ids, method_ids, class_def, data, link_data 9가지 필드가 존재한다.
여기서 class.def 필드 클래스 정보는 class_def_item 필드가 가지고 있고, class_def_item내의 class_data_off 필드는 class_data_item의 위치가 있다. Class_data_item은 메소드 정보를 가지고 있는데 encoded_method로 되어있어, 내부에 존재하는 code_off 필드를 이용하여 code_item의 위치를 찾고 insns필드에 실직적인 바이트코드가 존재한다.
이렇게 추출된 바이트 코드를 사람이 볼 수 있게 smali 코드로 변환하여 준다. 이렇게 변환된 Smali 코드를 이용하여 코드 동작 순서 시퀀스화 하여 추출한다.
일 실시예로, APK 분석도구인 androguard를 이용하여 Smali 코드 시퀀스를 추출할 수 있다. APK를 Androguard의 입력으로 사용하여, classes.dex 파일을 추출하고, method를 추출하여 bytecode를 리턴해주고, smali 코드로 변환하여 준다. 추출된 Smali 코드 및 Smali 코드 시퀀스의 일례는 각각 다음의 표 1과 같다.
Smali Code
invoke_ Ljava/lang/Object;-><init>()V return_ move_ invoke_ Landroid/arch/core/executor/ArchTaskExecutor;->postToMainThread(Ljava/lang/Runnable;)V return_ move_ invoke_ Landroid/arch/core/executor/ArchTaskExecutor;->executeOnDiskIO(Ljava/lang/Runnable;)V return_ const_ "9" new_ "[I" fill_ sput_ Landroid/support/a/a/a;->a[I const_ "8" new_ "[I" fill_ sput_ Landroid/support/a/a/a;->b[I const_ "13" new_ "I" fill_ sput_ Landroid/support/a/a/a;->c[I const_ "2" new_ "[I" fill_ sput_ Landroid/support/a/a/a;->d[I const_ "1" new_ "[I" const_ "0" constv3 "16843161" aputv3 sput_ Landroid/support/a/a/a;->e[I new_ "[I" fill_ sput_ Landroid/support/a/a/a;->f[I return_ fill_ (x03, x00, x01, x01, x21, x01, x01, x01, x55, x01, x01, x01, x59, x01, x01, x01, x1f, x03, x01, x01, xea, x03, x01, x01, xfb, x03, x01, x01, x02, x04, x01, x01, x03, x04, x01, x01) fill_ (x03, x00, x01, x01, xb5, x01, x01, x01, xb6, x01, x01, x01, x24, x03, x01, x01, x25, x03, x01, x01, x26, x03, x01, x01, x5a, x04, x01, x01, x5b, x04, x01, x01) fill_ (x03, x00, x01, x01, x04, x04, x01, x01, x05, x04, x01, x01, x06, x04, x01, x01, x07, x04, x01, x01, x08, x04, x01, x01, x09, x04, x01, x01, x0a, x04, x01, x01, x0b, x04, x01, x01, x0c, x04, x01, x01, x0d, x04, x01, x01, xcb, x04, x01, x01, xcc, x04, x01, x01) fill_ (x03, x00, x01, x01, x05, x04, x01, x01) fill_ (x03, x00, x01, x01, xcd, x01, x01, x01) iput_ Landroid/support/a/a/b$1;->aLandroid/support/a/a/b; invoke_ Ljava/lang/Object;-><init>()V return_ iget_ Landroid/support/a/a/b$1;->aLandroid/support/a/a/b; invoke_ Landroid/support/a/a/b;->invalidateSelf()V return_
...
Smali Code Sequence
'igetv0, v1, Lafu/org/checkerframework/checker/formatter/FormatUtil$ExcessiveOrMissingFormatArgumentException;->expectedI', 'returnv0'
'invoke-directv0, Ljava/lang/Object;-><init>()V', 'return-void'
'invoke-directv0, Ljava/lang/Exception;-><init>()V', 'iput-objectv1, v0, Lafu/org/checkerframework/checker/regex/RegexUtil$CheckedPatternSyntaxException;->pseLjava/util/regex/PatternSyntaxException;', 'return-void'
'invoke-staticv2, Ljava/util/regex/Pattern;->compile(Ljava/lang/String;)Ljava/util/regex/Pattern;', 'move-result-objectv0', 'invoke-staticv0, Lafu/org/checkerframework/checker/regex/RegexUtil;->getGroupCount(Ljava/util/regex/Pattern;)I', 'move-resultv0', 'if-gev0, v3, +00dh', 'new-instancev1, Ljava/util/regex/PatternSyntaxException;', 'invoke-staticv2, v3, v0, Lafu/org/checkerframework/checker/regex/RegexUtil;->regexErrorMessage(Ljava/lang/String;II)Ljava/lang/String;', 'move-result-objectv3', 'const/4v0, -1', 'invoke-directv1, v3, v2, v0, Ljava/util/regex/PatternSyntaxException;-><init>(Ljava/lang/String;Ljava/lang/String;I)V', 'return-objectv1', 'const/4v2, 0', 'return-objectv2', 'move-exceptionv2', 'return-objectv2'
'const/4v0, 0', 'invoke-staticv1, v0, Lafu/plume/RegexUtil;->isRegex(Ljava/lang/String;I)Z', 'move-resultv1', 'returnv1'
'const-stringv0, "%(\\d+\\$)?([-#+0, (\\<]*)?(\\d+)\\.\\d+)?([tT])?([a-zA-Z%])"', 'invoke-staticv0, Ljava/util/regex/Pattern;->compile(Ljava/lang/String;)Ljava/util/regex/Pattern;', 'move-result-objectv0', 'sput-objectv0, Lafu/org/checkerframework/checker/formatter/FormatUtil;->fsPatternLjava/util/regex/Pattern;', 'return-void']['invoke-directv0, Ljava/lang/Object;-><init>()V', 'return-void'
상기 벡터화부(200)는 추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축한다. 도 3을 참조하면, 상기 벡터화부(200)는 데이터 셋 생성부(210) 및 임베딩부(230)를 포함할 수 있다.
상기 벡터화부(200)는 추출한 모든 Smali 코드 시퀀스를 종합하여 OPcode 부분과 파라미터, 문자열 및 메모리 주소를 전처리 해서 학습 데이터 셋으로 구축한다. 학습 데이터 셋을 구축하기 위하여, 추출된 Smali 코드 시퀀스의 애플리케이션 카테고리별로 라벨링하여 학습 데이터 셋을 생성하여 준다.
일 실시예로 애플리케이션 50개씩, 6개의 카테고리(music_and_audio, education, game, beauty, tools, weather)로 하여 총 300개의 애플리케이션을 학습 데이터 셋을 구축할 수 있다.
상기 임베딩부(230)는 딥러닝 모델에 입력으로 사용하기 위해 학습 데이터 셋을 벡터화한다. 앞서 생성된 학습 데이터 셋을 가지고 숫자로 변환하여 딕셔너리화 하여 준다. 이후 딕셔너리화된 Smali 코드 시퀀스를 밀집 벡터 형태로 변환하여 임베딩하여 준다.
일 실시예로 Smali 코드 시퀀스 4,386,662개를 이용하여 딕셔너리를 구축하였고, 벡터화 할 수 있다. 딕셔너리 구축결과의 일례는 다음의 표 3과 같다.
No. Smali code Sequence
0 invoke_ Ljava/lang/Object;-><init>()V ...
1 move_ invoke_ Landroid/arch/core/executor ...
2 const_ "9" new_ "[I" fill_ sput_ Landroid/support ...
3 iput_ Landroid/support/a/a/b$1;->aLandroid ...
4 new_ Ljava/lang/ref/WeakReference; invoke_ ...
5 igetv_ Lafu/org/checkerframework/checker ...
... ...
4386656 iget_ Lcom/bumptech/glide/reques ...
4386657 check_ Landroid/graphics/drawable/Draw ...
4386658 invoke_ Lcom/google/android/gms/ ...
4386659 check_ Lcom/google/android/gms/common/ ...
4386660 invoke_ Landroidx/appcompat/app/AppC ...
4386661 new_ Lcom/google/android/material/ ...
상기 학습부(300)는 벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성한다. 다시 말해, 상기 학습부(300)는 벡터화된 학습 데이터 셋을 딥러닝 모델에 입력하여 분류기를 생성하고, CNN 딥러닝 알고리즘을 이용하여 예측 모델을 학습한다.
일 실시예로 예측모델에 사용된 합성곱 레이어(Convolution Layer)의 개수는 4개 이고, 활성화 함수(activation function)은 ReLu를 사용하였다. Max pooling으로 값이 큰 특정 피쳐만 사용하였다. GRU(Gated Recurrent Unit)를 사용하여 학습 가중치의 개수를 줄여 총 140,613,114개의 파라미터를 가지고 예측 모델을 학습한다. 예측 모델 학습에서 얻은 모델 검증 정확도는 0.8361로 측정되었다.
상기 분류부(400)는 타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성한다. 상기 분류부(400)는 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류할 수 있다.
예측 모델 학습 후, 모델에서 딥러닝 시각화기법인 LIME(Local Interpretable Model-agnostic Explanations)을 사용하여 각각의 카테고리에서 가장 영향이 큰 smali 코드 시퀀스를 추출할 수 있다. LIME을 구하는 식은 다음의 수학식 1과 같다.
[수학식 1]
Figure 112020140717949-pat00001
Figure 112020140717949-pat00002
여기서, f는 알고 싶은 예측이 복잡한 모델, g는 지역적으로 비교할 단순한 모델이다. X는 데이터이고,
Figure 112020140717949-pat00003
는 모델 g식에서의 계수이고
Figure 112020140717949-pat00004
로 정의한다.
예를 들어, 타겟 APK를 대상으로 Smali 코드를 추출하고 학습데이터화 하여 예측 모델에 입력으로 사용했을 때, 예측 모델이 타켓 APK를 music_and_audio라고 분류했다면, 예측 모델에 LIME을 이용하여 타켓 APK를 music_and_audio라고 분류한 중요한 Smali 코드를 보여준다.
일 실시예로 카테고리별 중요 Smali 코드 시퀀스는 다음의 표 4 내지 표 6와 같다.
music_and_audio game
sget_ Landroid/os/Build$VERSION;->SDK_INTI const_ "21" if_ invoke_ Landroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V goto_ sget_ Landroidx/transition/ImageViewUtils;->sAnimateTransformMethodLjava/lang/reflect/Method; if_ const_ "1" new_ [Ljava/lang/Object; const_ "0" aput_ invoke_ Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; goto_ move_ new_ Ljava/lang/RuntimeException; invoke_ Ljava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable; move_ invoke_ Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V throw_ return_ invoke_ Lkotlin/random/Random$Default;-><init>()V return_
iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; if_ sget_ Landroidx/renderscript/Element$DataType;->FLOAT_64Landroidx/renderscript/Element$DataType; const_ "3" invoke_ Landroidx/renderscript/Element;->createVector(Landroidx/renderscript/RenderScript;Landroidx/renderscript/Element$DataType;I)Landroidx/renderscript/Element; move_ iput_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; return_ sget_ Landroid/os/Build$VERSION;->SDK_INTI const_ "21" if_ invoke_ Landroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V goto_ sget_ Landroidx/transition/ImageViewUtils;->sAnimateTransformMethodLjava/lang/reflect/Method; if_ const_ "1" new_ [Ljava/lang/Object; const_ "0" aput_ invoke_ Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; goto_ move_ new_ Ljava/lang/RuntimeException; invoke_ Ljava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable; move_ invoke_ Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V throw_ return_
invoke_ Ljava/lang/Object;-><init>()V new_ Ljava/lang/ThreadLocal; invoke_ Ljava/lang/ThreadLocal;-><init>()V iput_ Lbolts/BoltsExecutors$ImmediateExecutor;->executionDepthLjava/lang/ThreadLocal; return_ iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; if_ sget_ Landroidx/renderscript/Element$DataType;->FLOAT_64Landroidx/renderscript/Element$DataType; const_ "3" invoke_ Landroidx/renderscript/Element;->createVector(Landroidx/renderscript/RenderScript;Landroidx/renderscript/Element$DataType;I)Landroidx/renderscript/Element; move_ iput_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; return_
iget_ Lokhttp3/Cookie;->secureZ return_ iget_ Landroidx/documentfile/provider/SingleDocumentFile;->mContextLandroid/content/Context; iget_ Landroidx/documentfile/provider/SingleDocumentFile;->mUriLandroid/net/Uri; invoke_ Landroidx/documentfile/provider/DocumentsContractApi19;->isDirectory(Landroid/content/Context;Landroid/net/Uri;)Z move_ return_
invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mSubDecorLandroid/view/ViewGroup; constv1 "16908290" invoke_ Landroid/view/ViewGroup;->findViewById(I)Landroid/view/View; move_ check_ Landroid/view/ViewGroup; invoke_ Landroid/view/ViewGroup;->removeAllViews()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mContextLandroid/content/Context; invoke_ Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater; move_ invoke_ Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View; iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mAppCompatWindowCallbackLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->getWrapped()Landroid/view/Window$Callback; move_ invoke_ Landroid/view/Window$Callback;->onContentChanged()V return_ invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mSubDecorLandroid/view/ViewGroup; constv1 "16908290" invoke_ Landroid/view/ViewGroup;->findViewById(I)Landroid/view/View; move_ check_ Landroid/view/ViewGroup; invoke_ Landroid/view/ViewGroup;->removeAllViews()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mContextLandroid/content/Context; invoke_ Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater; move_ invoke_ Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View; iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mAppCompatWindowCallbackLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->getWrapped()Landroid/view/Window$Callback; move_ invoke_ Landroid/view/Window$Callback;->onContentChanged()V return_
iget_ Landroidx/transition/Visibility$DisappearListener;->mSuppressLayoutZ if_ iget_ Landroidx/transition/Visibility$DisappearListener;->mLayoutSuppressedZ if_ iget_ Landroidx/transition/Visibility$DisappearListener;->mParentLandroid/view/ViewGroup; if_ iput_ Landroidx/transition/Visibility$DisappearListener;->mLayoutSuppressedZ invoke_ Landroidx/transition/ViewGroupUtils;->suppressLayout(Landroid/view/ViewGroup;Z)V return_
education beauty
invoke_ Landroidx/loader/content/ModernAsyncTask;->isCancelled()Z move_ if_ invoke_ Landroidx/loader/content/ModernAsyncTask;->onCancelled(Ljava/lang/Object;)V goto_ invoke_ Landroidx/loader/content/ModernAsyncTask;->onPostExecute(Ljava/lang/Object;)V sget_ Landroidx/loader/content/ModernAsyncTask$Status;->FINISHEDLandroidx/loader/content/ModernAsyncTask$Status; iput_ Landroidx/loader/content/ModernAsyncTask;->mStatusLandroidx/loader/content/ModernAsyncTask$Status; return_ invoke_ Ljava/lang/Object;-><init>()V new_ Ljava/lang/ThreadLocal; invoke_ Ljava/lang/ThreadLocal;-><init>()V iput_ Lbolts/BoltsExecutors$ImmediateExecutor;->executionDepthLjava/lang/ThreadLocal; return_
('iput_ Lcom/airbnb/lottie/LottieDrawable;->performanceTrackingEnabledZ iget_ Lcom/airbnb/lottie/LottieDrawable;->compositionLcom/airbnb/lottie/LottieComposition; if_ invoke_ Lcom/airbnb/lottie/LottieComposition;->setPerformanceTrackingEnabled(Z)V return_ iput_ Lcom/airbnb/lottie/LottieDrawable;->performanceTrackingEnabledZ iget_ Lcom/airbnb/lottie/LottieDrawable;->compositionLcom/airbnb/lottie/LottieComposition; if_ invoke_ Lcom/airbnb/lottie/LottieComposition;->setPerformanceTrackingEnabled(Z)V return_
'invoke_ Ljava/lang/Object;-><init>()V new_ Ljava/lang/ThreadLocal; invoke_ Ljava/lang/ThreadLocal;-><init>()V iput_ Lbolts/BoltsExecutors$ImmediateExecutor;->executionDepthLjava/lang/ThreadLocal; return_ iget_ Lokhttp3/Cookie;->secureZ return_
iget_ Lokhttp3/Cookie;->secureZ return_ invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mSubDecorLandroid/view/ViewGroup; constv1 "16908290" invoke_ Landroid/view/ViewGroup;->findViewById(I)Landroid/view/View; move_ check_ Landroid/view/ViewGroup; invoke_ Landroid/view/ViewGroup;->removeAllViews()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mContextLandroid/content/Context; invoke_ Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater; move_ invoke_ Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View; iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mAppCompatWindowCallbackLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->getWrapped()Landroid/view/Window$Callback; move_ invoke_ Landroid/view/Window$Callback;->onContentChanged()V return_
const_ "0" move_ move_ move_ move_ move_ invoke_ invoke_ Lio/reactivex/Flowable;->window(JLjava/util/concurrent/TimeUnit;Lio/reactivex/Scheduler;JZ)Lio/reactivex/Flowable; move_ return_ iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; if_ sget_ Landroidx/renderscript/Element$DataType;->FLOAT_64Landroidx/renderscript/Element$DataType; const_ "3" invoke_ Landroidx/renderscript/Element;->createVector(Landroidx/renderscript/RenderScript;Landroidx/renderscript/Element$DataType;I)Landroidx/renderscript/Element; move_ iput_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; return_
new_ Lio/reactivex/internal/operators/observable/ObservableFromPublisher; invoke_ Lio/reactivex/internal/operators/observable/ObservableFromPublisher;-><init>(Lorg/reactivestreams/Publisher;)V invoke_ Lio/reactivex/plugins/RxJavaPlugins;->onAssembly(Lio/reactivex/Observable;)Lio/reactivex/Observable; move_ return_
weather tools
invoke_ Landroidx/loader/content/ModernAsyncTask;->isCancelled()Z move_ if_ invoke_ Landroidx/loader/content/ModernAsyncTask;->onCancelled(Ljava/lang/Object;)V goto_ invoke_ Landroidx/loader/content/ModernAsyncTask;->onPostExecute(Ljava/lang/Object;)V sget_ Landroidx/loader/content/ModernAsyncTask$Status;->FINISHEDLandroidx/loader/content/ModernAsyncTask$Status; iput_ Landroidx/loader/content/ModernAsyncTask;->mStatusLandroidx/loader/content/ModernAsyncTask$Status; return_ ('sgetv0 Landroid/os/Build$VERSION;->SDK_INTI const_ "21" if_ invoke_ Landroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V goto_ sget_ Landroidx/transition/ImageViewUtils;->sAnimateTransformMethodLjava/lang/reflect/Method; if_ const_ "1" new_ [Ljava/lang/Object; const_ "0" aput_ invoke_ Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; goto_ move_ new_ Ljava/lang/RuntimeException; invoke_ Ljava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable; move_ invoke_ Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V throw_ return_
sgetv0 Landroid/os/Build$VERSION;->SDK_INTI const_ "21" if_ invoke_ Landroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V goto_ sget_ Landroidx/transition/ImageViewUtils;->sAnimateTransformMethodLjava/lang/reflect/Method; if_ const_ "1" new_ [Ljava/lang/Object; const_ "0" aput_ invoke_ Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; goto_ move_ new_ Ljava/lang/RuntimeException; invoke_ Ljava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable; move_ invoke_ Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V throw_ return_ iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; if_ sget_ Landroidx/renderscript/Element$DataType;->FLOAT_64Landroidx/renderscript/Element$DataType; const_ "3" invoke_ Landroidx/renderscript/Element;->createVector(Landroidx/renderscript/RenderScript;Landroidx/renderscript/Element$DataType;I)Landroidx/renderscript/Element; move_ iput_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; return_
iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; if_ sget_ Landroidx/renderscript/Element$DataType;->FLOAT_64Landroidx/renderscript/Element$DataType; const_ "3" invoke_ Landroidx/renderscript/Element;->createVector(Landroidx/renderscript/RenderScript;Landroidx/renderscript/Element$DataType;I)Landroidx/renderscript/Element; move_ iput_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; iget_ Landroidx/renderscript/RenderScript;->mElement_DOUBLE_3Landroidx/renderscript/Element; return_ iget_ Landroidx/documentfile/provider/SingleDocumentFile;->mContextLandroid/content/Context; iget_ Landroidx/documentfile/provider/SingleDocumentFile;->mUriLandroid/net/Uri; invoke_ Landroidx/documentfile/provider/DocumentsContractApi19;->isDirectory(Landroid/content/Context;Landroid/net/Uri;)Z move_ return_
iget_ Lokhttp3/Cookie;->secureZ return_ invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mSubDecorLandroid/view/ViewGroup; constv1 "16908290" invoke_ Landroid/view/ViewGroup;->findViewById(I)Landroid/view/View; move_ check_ Landroid/view/ViewGroup; invoke_ Landroid/view/ViewGroup;->removeAllViews()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mContextLandroid/content/Context; invoke_ Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater; move_ invoke_ Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View; iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mAppCompatWindowCallbackLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->getWrapped()Landroid/view/Window$Callback; move_ invoke_ Landroid/view/Window$Callback;->onContentChanged()V return_
invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mSubDecorLandroid/view/ViewGroup; constv1 "16908290" invoke_ Landroid/view/ViewGroup;->findViewById(I)Landroid/view/View; move_ check_ Landroid/view/ViewGroup; invoke_ Landroid/view/ViewGroup;->removeAllViews()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mContextLandroid/content/Context; invoke_ Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater; move_ invoke_ Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View; iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mAppCompatWindowCallbackLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->getWrapped()Landroid/view/Window$Callback; move_ invoke_ Landroid/view/Window$Callback;->onContentChanged()V return_ > 3380905.00', 0.0001078366650393867) iget_ Landroidx/transition/Visibility$DisappearListener;->mSuppressLayoutZ if_ iget_ Landroidx/transition/Visibility$DisappearListener;->mLayoutSuppressedZ if_ iget_ Landroidx/transition/Visibility$DisappearListener;->mParentLandroid/view/ViewGroup; if_ iput_ Landroidx/transition/Visibility$DisappearListener;->mLayoutSuppressedZ invoke_ Landroidx/transition/ViewGroupUtils;->suppressLayout(Landroid/view/ViewGroup;Z)V return_
상기 식별부(500)는 상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공한다.
상기 식별부(500)는 중요 Smali 코드 시퀀스 식별기를 포함하여, 상기 분류부(400)가 결과를 도출할 때 가장 영향이 큰 주요 Smali 코드 시퀀스들을 출력할 수 있다.
이에 따라, 타겟 애플리케이션이 어떤 카테고리에 속해 있고, 그 중에서 타겟 애플리케이션이 중요하다고 가지고 있는 Smali 코드 시퀀스를 출력하게 된다.
일 실시예로 타겟 애플리케이션에서 music_and_audio 카테고리로 분류되었을 때, 중요 Smali 코드 시퀀스는 다음과 같이 출력된다.
“sget_ Landroid/os/Build$VERSION;->SDK_INTI const_ "21" if_ invoke_ Landroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V goto_ sget_ Landroidx/transition/ImageViewUtils;->sAnimateTransformMethodLjava/lang/reflect/Method; if_ const_ "1" new_ [Ljava/lang/Object; const_ "0" aput_ invoke_ Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; goto_ move_ new_ Ljava/lang/RuntimeException; invoke_ Ljava/lang/reflect/InvocationTargetException;->getCause()Ljava/lang/Throwable; move_ invoke_ Ljava/lang/RuntimeException;-><init>(Ljava/lang/Throwable;)V throw_ return_”
...
“invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl;->ensureSubDecor()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mSubDecorLandroid/view/ViewGroup; constv1 "16908290" invoke_ Landroid/view/ViewGroup;->findViewById(I)Landroid/view/View; move_ check_ Landroid/view/ViewGroup; invoke_ Landroid/view/ViewGroup;->removeAllViews()V iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mContextLandroid/content/Context; invoke_ Landroid/view/LayoutInflater;->from(Landroid/content/Context;)Landroid/view/LayoutInflater; move_ invoke_ Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View; iget_ Landroidx/appcompat/app/AppCompatDelegateImpl;->mAppCompatWindowCallbackLandroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback; invoke_ Landroidx/appcompat/app/AppCompatDelegateImpl$AppCompatWindowCallback;->getWrapped()Landroid/view/Window$Callback; move_ invoke_ Landroid/view/Window$Callback;->onContentChanged()V return_ ”
이렇게 출력된 중요 Smali 코드 시퀀스를 가지고 APK 파일이 제대로 분류가 되었는지 확인함과 동시에, 공격자로부터 보호해야 할 코드 부분도 확인하여 보호기법을 적용할 수 있는 리스트를 제공하여 활용할 수 있다.
도 4는 본 발명의 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법의 흐름도이다.
본 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법은, 도 1의 장치(10)와 실질적으로 동일한 구성에서 진행될 수 있다. 따라서, 도 1의 장치(10)와 동일한 구성요소는 동일한 도면부호를 부여하고, 반복되는 설명은 생략한다.
또한, 본 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법은 코드 시퀀스 기반 지능형 핵심코드 식별을 수행하기 위한 소프트웨어(애플리케이션)에 의해 실행될 수 있다.
본 발명은 애플리케이션의 Smali 코드를 기반으로 애플리케이션의 주요 Smali 코드 시퀀스를 식별하여 평가한다. Smali 코드는 애플리케이션이 실제로 동작하는 소스 코드에 기반하기 때문에 이를 변환한 Smali 코드 시퀀스를 이용하면 애플리케이션의 실제 동작 흐름을 반영하므로 애플리케이션의 객관적인 평가가 가능하다.
도 4를 참조하면, 본 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법은, 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출한다(단계 S10). 상기 Smali 코드 시퀀스를 추출하는 단계는, 카테고리별 애플리케이션을 디컴파일 하여 Smali 코드를 추출하고, Smali 코드를 Smali 코드 시퀀스로 변환한다.
추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축 한다(단계 S20). 상기 학습 데이터 셋을 구축하는 단계는, 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하고, 딥러닝 모델에 입력으로 사용하기 위해 상기 학습 데이터 셋을 벡터화한다.
벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성한다(단계 S30).
타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성한다(단계 S40). 상기 카테고리 분류 결과를 생성하는 단계는, 상기 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류할 수 있다.
상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공한다(단계 S50). 상기 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계는, 상기 딥러닝 모델에 대한 설명을 제공하는 알고리즘(LIME: Local Interpretable Model-Agnostic Explanation)을 이용할 수 있다.
Smali 코드 시퀀스의 결과를 도출할 때 가장 영향이 큰 주요 Smali 코드 시퀀스들을 출력한다(단계 S60). 이에 따라, 타겟 애플리케이션이 어떤 카테고리에 속해 있고, 그 중에서 타겟 애플리케이션이 중요하다고 가지고 있는 Smali 코드 시퀀스를 출력하게 된다.
이와 같은 코드 시퀀스 기반 지능형 핵심코드 식별 방법에 따르면, 애플리케이션이 실제로 동작하는 소스 코드에 기반한 Smali 코드를 추출하여 Smali 코드 시퀀스로 변환하여 이용하므로, 애플리케이션의 실제 동작 흐름을 파악하고, 딥러닝 모델을 이용하여 애플리케이션의 카테고리 분류와 함께 애플리케이션의 주요 Smali 코드 시퀀스를 파악할 수 있는 기술이다. 그러므로 실제 동작에 기반한 주요 Smali 코드 시퀀스를 파악하여 보안을 강화함으로써 악성 행위로 인한 피해를 사전에 방지할 수 있을 것으로 기대된다.
이와 같은, 코드 시퀀스 기반 지능형 핵심코드 식별 방법은 애플리케이션으로 구현되거나 다양한 컴퓨터 구성요소를 통하여 수행될 수 있는 프로그램 명령어의 형태로 구현되어 컴퓨터 판독 가능한 기록 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능한 기록 매체는 프로그램 명령어, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다.
상기 컴퓨터 판독 가능한 기록 매체에 기록되는 프로그램 명령어는 본 발명을 위하여 특별히 설계되고 구성된 것들이거니와 컴퓨터 소프트웨어 분야의 당업자에게 공지되어 사용 가능한 것일 수도 있다.
컴퓨터 판독 가능한 기록 매체의 예에는, 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체, CD-ROM, DVD와 같은 광기록 매체, 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 ROM, RAM, 플래시 메모리 등과 같은 프로그램 명령어를 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다.
프로그램 명령어의 예에는, 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드도 포함된다. 상기 하드웨어 장치는 본 발명에 따른 처리를 수행하기 위해 하나 이상의 소프트웨어 모듈로서 작동하도록 구성될 수 있으며, 그 역도 마찬가지이다.
이상에서는 실시예들을 참조하여 설명하였지만, 해당 기술 분야의 숙련된 당업자는 하기의 특허 청구의 범위에 기재된 본 발명의 사상 및 영역으로부터 벗어나지 않는 범위 내에서 본 발명을 다양하게 수정 및 변경시킬 수 있음을 이해할 수 있을 것이다.
본 발명은 애플리케이션의 Smali 코드 시퀀스를 기반으로 애플리케이션의 주요 Smali 코드 시퀀스를 식별하여 평가한다. Smali 코드는 애플리케이션이 실제로 동작하는 소스 코드에 기반 하기 때문에 이를 이용하여 변환한 Smali 코드 시퀀스를 이용하면 애플리케이션의 실제 동작 흐름을 잘 반영하므로 애플리케이션의 객관적인 평가가 가능하다.
따라서, 모바일 애플리케이션의 코드 분석을 통해 중요 코드를 식별하여 악성 행위로 인한 피해를 방지할 수 있는 모바일 애플리케이션 중요 코드 탐지 도구로 활용 가능하다.
10: 코드 시퀀스 기반 지능형 핵심코드 식별 장치
100: 시퀀스 추출부
200: 벡터화부
300: 학습부
400: 분류부
500: 식별부

Claims (11)

  1. 코드 시퀀스 기반 지능형 핵심코드 식별 장치로 수행되는 코드 시퀀스 기반 지능형 핵심코드 식별 방법에 있어서,
    애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 단계;
    추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 단계;
    벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 단계;
    타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 단계; 및
    상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계;를 포함하고,
    상기 학습 데이터 셋을 구축하는 단계는,
    추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 단계; 및
    딥러닝 모델에 입력으로 사용하기 위해 상기 학습 데이터 셋을 벡터화하는 단계;를 포함하고,
    상기 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 단계는,
    상기 Smali 코드 시퀀스를 추출하는 단계에서 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하되, 모든 Smali 코드 시퀀스를 애플리케이션 카테고리별로 라벨링하여 학습 데이터 셋을 생성하고, 생성된 학습 데이터 셋의 OPcode 부분, 파라미터, 문자열 및 메모리 주소만을 전처리하여 학습 데이터 셋을 구축하고,
    상기 학습 데이터 셋을 벡터화하는 단계는,
    상기 학습 데이터 셋으로 구축하는 단계에서 구축된 학습 데이터 셋을 숫자로 변환하여 딕셔너리화하고, 딕셔너리화로 변환된 학습 데이터 셋을 밀집 벡터 형태로 변환하여 벡터화하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
  2. 삭제
  3. 제1항에 있어서, 상기 Smali 코드 시퀀스를 추출하는 단계는,
    카테고리별 애플리케이션을 디컴파일 하여 Smali 코드를 추출하는 단계; 및
    Smali 코드를 Smali 코드 시퀀스로 변환하는 단계;를 포함하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
  4. 제1항에 있어서, 상기 카테고리 분류 결과를 생성하는 단계는,
    상기 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
  5. 제1항에 있어서, 상기 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계는,
    상기 딥러닝 모델에 대한 설명을 제공하는 알고리즘(LIME: Local Interpretable Model-Agnostic Explanation)을 이용하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
  6. 제1항에 따른 상기 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 수행하기 위한 컴퓨터 프로그램이 기록된 컴퓨터로 판독 가능한 저장 매체.
  7. 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 시퀀스 추출부;
    추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 벡터화부;
    벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 학습부;
    타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 분류부; 및
    상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 식별부;를 포함하고,
    상기 벡터화부는,
    추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 데이터 셋 생성부; 및
    딥러닝 모델에 입력으로 사용하기 위해 상기 학습 데이터 셋을 벡터화하는 임베딩부;를 포함하고,
    상기 데이터 셋 생성부는,
    상기 시퀀스 추출부에서 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하되, 모든 Smali 코드 시퀀스를 애플리케이션 카테고리별로 라벨링하여 학습 데이터 셋을 생성하고, 생성된 학습 데이터 셋의 OPcode 부분, 파라미터, 문자열 및 메모리 주소만을 전처리하여 학습 데이터 셋을 구축하고,
    상기 임베딩부는,
    상기 데이터 셋 생성부에서 구축된 학습 데이터 셋을 숫자로 변환하여 딕셔너리화하고, 딕셔너리화로 변환된 학습 데이터 셋을 밀집 벡터 형태로 변환하여 벡터화하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
  8. 삭제
  9. 제7항에 있어서, 상기 시퀀스 추출부는,
    카테고리별 애플리케이션을 디컴파일 하여 Smali 코드를 추출하는 Smali 코드부; 및
    Smali 코드를 Smali 코드 시퀀스로 변환하는 Smali 시퀀스 변환부;를 포함하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
  10. 제7항에 있어서, 상기 분류부는,
    상기 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
  11. 제7항에 있어서, 상기 식별부는,
    상기 딥러닝 모델에 대한 설명을 제공하는 알고리즘(LIME: Local Interpretable Model-Agnostic Explanation)을 이용하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
KR1020200182736A 2020-12-24 2020-12-24 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치 KR102443938B1 (ko)

Priority Applications (3)

Application Number Priority Date Filing Date Title
KR1020200182736A KR102443938B1 (ko) 2020-12-24 2020-12-24 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치
PCT/KR2021/001123 WO2022139063A1 (ko) 2020-12-24 2021-01-28 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치
US17/288,969 US20220207296A1 (en) 2020-12-24 2021-01-28 Code sequence based intelligent key code identification method and recording medium and device for performing the same

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020200182736A KR102443938B1 (ko) 2020-12-24 2020-12-24 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치

Publications (2)

Publication Number Publication Date
KR20220091733A KR20220091733A (ko) 2022-07-01
KR102443938B1 true KR102443938B1 (ko) 2022-09-16

Family

ID=82158055

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020200182736A KR102443938B1 (ko) 2020-12-24 2020-12-24 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치

Country Status (2)

Country Link
KR (1) KR102443938B1 (ko)
WO (1) WO2022139063A1 (ko)

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9535674B2 (en) * 2012-12-21 2017-01-03 Bmc Software, Inc. Application wrapping system and method
US9977904B2 (en) * 2014-02-25 2018-05-22 Board Of Regents, The University Of Texas System Systems and methods for automated detection of application vulnerabilities
KR101477050B1 (ko) 2014-05-28 2015-01-08 충남대학교산학협력단 메모리 덤프 기법을 이용한 어플리케이션의 실행코드 추출 방법
KR101605783B1 (ko) * 2014-09-12 2016-03-24 고려대학교 산학협력단 악성 애플리케이션 탐지 방법 및 이 방법을 실행시키는 컴퓨터프로그램
KR20160082644A (ko) * 2014-12-30 2016-07-08 충남대학교산학협력단 코드 블록 구분을 통한 악성 코드 탐지 방법 및 장치
KR101557455B1 (ko) * 2015-04-21 2015-10-07 숭실대학교산학협력단 응용 프로그램 코드 분석 장치 및 그것을 이용한 코드 분석 방법
KR101778679B1 (ko) * 2015-10-02 2017-09-14 네이버 주식회사 딥러닝을 이용하여 텍스트 단어 및 기호 시퀀스를 값으로 하는 복수 개의 인자들로 표현된 데이터를 자동으로 분류하는 방법 및 시스템
WO2019135425A1 (ko) 2018-01-04 2019-07-11 라인플러스 주식회사 오픈소스 소프트웨어의 라이선스를 검증하는 방법 및 시스템
KR102144044B1 (ko) 2020-01-21 2020-08-12 엘아이지넥스원 주식회사 기계학습 기반 소프트웨어 정적 시험 거짓경보 분류 장치 및 방법

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
Marco Tulio Ribeiro et al., "Why Should I Trust You? - Explaining the Predictions of Any Classifier"(2016.08.)*
Robin Andrew Nix, "Applying Deep Learning Techniques to the Analysis of Android APKs"(2016.)*

Also Published As

Publication number Publication date
WO2022139063A1 (ko) 2022-06-30
KR20220091733A (ko) 2022-07-01

Similar Documents

Publication Publication Date Title
US20200394313A1 (en) System and method for application security profiling
CN110737899B (zh) 一种基于机器学习的智能合约安全漏洞检测方法
US11783054B2 (en) System and method for information flow analysis of application code
US10303874B2 (en) Malicious code detection method based on community structure analysis
Hashemi et al. Visual malware detection using local malicious pattern
EP2472425B1 (en) System and method for detecting unknown malware
US20060005166A1 (en) Method, system and program product for determining java software code plagiarism and infringement
CN107832619A (zh) Android平台下应用程序漏洞自动化挖掘系统及方法
Lin et al. Automated forensic analysis of mobile applications on Android devices
CN103631904B (zh) 反病毒分析期间选择同或异步文件访问方法的系统和方法
CN105022957B (zh) 随选检测恶意程序的方法及其电子装置
US20200344261A1 (en) Method of application malware detection based on dynamic api extraction, and readable medium and apparatus for performing the method
Cho et al. Security assessment of code obfuscation based on dynamic monitoring in android things
US11809557B2 (en) Mobile malicious code classification method based on feature selection and recording medium and device for performing the same
KR102283054B1 (ko) Api 호출 그래프 추출 기반 모바일 애플리케이션 악성 행위 패턴 탐지 방법, 이를 수행하기 위한 기록 매체 및 장치
CN108664791A (zh) 一种超文本预处理器代码中的网页后门检测方法及装置
US20200233624A1 (en) Method, device and computer program product for updating user interface
KR102011725B1 (ko) 악성코드 검출을 위한 화이트리스트 구축 방법 및 이를 수행하기 위한 기록매체 및 장치
CN111026433A (zh) 基于代码变更历史的软件代码质量问题自动修复方法、系统及介质
Qiu et al. Predicting the impact of android malicious samples via machine learning
CN112817877B (zh) 异常脚本检测方法、装置、计算机设备和存储介质
US20220058260A1 (en) Binary image stack cookie protection
KR102443938B1 (ko) 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치
CN113971284B (zh) 基于JavaScript的恶意网页检测方法、设备及计算机可读存储介质
Yang et al. Clustering study of crowdsourced test report with multi-source heterogeneous information

Legal Events

Date Code Title Description
E701 Decision to grant or registration of patent right
GRNT Written decision to grant