KR102443938B1 - 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치 - Google Patents
코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치 Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N20/00—Machine learning
Abstract
코드 시퀀스 기반 지능형 핵심코드 식별 방법은, 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 단계; 추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 단계; 벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 단계; 타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 단계; 및 상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계;를 포함한다. 이에 따라, 애플리케이션이 실제로 동작하는 Smali 코드 시퀀스를 이용하여 애플리케이션의 객관적인 평가가 가능하다.
Description
본 발명은 코드 시퀀스 기반 지능형 핵심코드 식별 방법, 이를 수행하기 위한 기록 매체 및 장치에 관한 것으로서, 더욱 상세하게는 애플리케이션이 실제로 동작하는 소스 코드에 기반한 Smali 코드 시퀀스를 이용하여 애플리케이션을 객관적으로 평가하는 기술에 관한 것이다.
애플리케이션의 평가 기법은 대부분 퍼미션, 디스크립션, 유저 리뷰를 기반으로 수행되고 있다. 퍼미션과 디스크립션은 개발자의 주관적인 관점에서 요청되고, 작성되기 때문에, 객관성이 떨어지고 정확한 평가를 기대하기 어렵다.
또한, 퍼미션의 경우 개발자가 해당 퍼미션의 의미와 영향을 정확히 알지 못하고 과도하게 퍼미션을 요청하는 경우 애플리케이션의 실제 동작과 관계없이 평가에 영향을 미치는 경우가 많다.
유저 리뷰 역시 작성하는 유저의 주관적인 관점에서 작성되기 때문에 객관성이 떨어지게 되며, 기존의 기법들은 애플리케이션의 실제적인 동작을 정확히 반영하지 못한다는 한계점이 있다.
최근 애플리케이션의 실제 동작을 담당하는 API를 기반으로 하는 평가 방법이 등장하였지만, 이용되는 딥러닝, 머신러닝 기술이 다소 단순하여 API의 실제 사용 관계를 파악하지 못해서 API의 특징을 효과적으로 평가에 이용하지 못하고 있다.
또한, 애플리케이션을 분류할 때 일반 애플리케이션 또는 악성 애플리케이션의 단순한 분류만 가능하다는 한계가 있다.
이에, 본 발명의 기술적 과제는 이러한 점에서 착안된 것으로 본 발명의 목적은 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 제공하는 것이다.
본 발명의 다른 목적은 상기 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 수행하기 위한 컴퓨터 프로그램이 기록된 기록 매체를 제공하는 것이다.
본 발명의 또 다른 목적은 상기 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 수행하기 위한 장치를 제공하는 것이다.
상기한 본 발명의 목적을 실현하기 위한 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법은, 애플리케이션을 디컴파일 하여 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는 본 발명의 일 실시예에 따른 코드 시퀀스 기반 지능형 핵심코드 식별 방법의 흐름도이다.
도 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]
예를 들어, 타겟 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: 식별부
100: 시퀀스 추출부
200: 벡터화부
300: 학습부
400: 분류부
500: 식별부
Claims (11)
- 코드 시퀀스 기반 지능형 핵심코드 식별 장치로 수행되는 코드 시퀀스 기반 지능형 핵심코드 식별 방법에 있어서,
애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 단계;
추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 단계;
벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 단계;
타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 단계; 및
상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계;를 포함하고,
상기 학습 데이터 셋을 구축하는 단계는,
추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 단계; 및
딥러닝 모델에 입력으로 사용하기 위해 상기 학습 데이터 셋을 벡터화하는 단계;를 포함하고,
상기 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 단계는,
상기 Smali 코드 시퀀스를 추출하는 단계에서 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하되, 모든 Smali 코드 시퀀스를 애플리케이션 카테고리별로 라벨링하여 학습 데이터 셋을 생성하고, 생성된 학습 데이터 셋의 OPcode 부분, 파라미터, 문자열 및 메모리 주소만을 전처리하여 학습 데이터 셋을 구축하고,
상기 학습 데이터 셋을 벡터화하는 단계는,
상기 학습 데이터 셋으로 구축하는 단계에서 구축된 학습 데이터 셋을 숫자로 변환하여 딕셔너리화하고, 딕셔너리화로 변환된 학습 데이터 셋을 밀집 벡터 형태로 변환하여 벡터화하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
- 삭제
- 제1항에 있어서, 상기 Smali 코드 시퀀스를 추출하는 단계는,
카테고리별 애플리케이션을 디컴파일 하여 Smali 코드를 추출하는 단계; 및
Smali 코드를 Smali 코드 시퀀스로 변환하는 단계;를 포함하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
- 제1항에 있어서, 상기 카테고리 분류 결과를 생성하는 단계는,
상기 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
- 제1항에 있어서, 상기 주요 Smali 코드 시퀀스를 식별하여 제공하는 단계는,
상기 딥러닝 모델에 대한 설명을 제공하는 알고리즘(LIME: Local Interpretable Model-Agnostic Explanation)을 이용하는, 코드 시퀀스 기반 지능형 핵심코드 식별 방법.
- 제1항에 따른 상기 코드 시퀀스 기반 지능형 핵심코드 식별 방법을 수행하기 위한 컴퓨터 프로그램이 기록된 컴퓨터로 판독 가능한 저장 매체.
- 애플리케이션을 디컴파일 하여 Smali 코드 시퀀스(code Sequence)를 추출하는 시퀀스 추출부;
추출된 Smali 코드 시퀀스를 벡터화하여 학습 데이터 셋을 구축하는 벡터화부;
벡터화된 Smali 코드 시퀀스를 딥러닝 모델로 학습하여 분류기를 생성하는 학습부;
타겟 애플리케이션의 Smali 코드 시퀀스를 상기 분류기의 입력으로 사용하여 카테고리 분류 결과를 생성하는 분류부; 및
상기 타겟 애플리케이션의 분류 결과를 도출한 주요 Smali 코드 시퀀스를 식별하여 제공하는 식별부;를 포함하고,
상기 벡터화부는,
추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하는 데이터 셋 생성부; 및
딥러닝 모델에 입력으로 사용하기 위해 상기 학습 데이터 셋을 벡터화하는 임베딩부;를 포함하고,
상기 데이터 셋 생성부는,
상기 시퀀스 추출부에서 추출한 모든 Smali 코드 시퀀스를 학습 데이터 셋으로 구축하되, 모든 Smali 코드 시퀀스를 애플리케이션 카테고리별로 라벨링하여 학습 데이터 셋을 생성하고, 생성된 학습 데이터 셋의 OPcode 부분, 파라미터, 문자열 및 메모리 주소만을 전처리하여 학습 데이터 셋을 구축하고,
상기 임베딩부는,
상기 데이터 셋 생성부에서 구축된 학습 데이터 셋을 숫자로 변환하여 딕셔너리화하고, 딕셔너리화로 변환된 학습 데이터 셋을 밀집 벡터 형태로 변환하여 벡터화하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
- 삭제
- 제7항에 있어서, 상기 시퀀스 추출부는,
카테고리별 애플리케이션을 디컴파일 하여 Smali 코드를 추출하는 Smali 코드부; 및
Smali 코드를 Smali 코드 시퀀스로 변환하는 Smali 시퀀스 변환부;를 포함하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
- 제7항에 있어서, 상기 분류부는,
상기 타겟 애플리케이션에 대해 분류될 카테고리 중 가장 확률이 높은 카테고리로 분류하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
- 제7항에 있어서, 상기 식별부는,
상기 딥러닝 모델에 대한 설명을 제공하는 알고리즘(LIME: Local Interpretable Model-Agnostic Explanation)을 이용하는, 코드 시퀀스 기반 지능형 핵심코드 식별 장치.
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)
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 | 엘아이지넥스원 주식회사 | 기계학습 기반 소프트웨어 정적 시험 거짓경보 분류 장치 및 방법 |
-
2020
- 2020-12-24 KR KR1020200182736A patent/KR102443938B1/ko active IP Right Grant
-
2021
- 2021-01-28 WO PCT/KR2021/001123 patent/WO2022139063A1/ko unknown
Non-Patent Citations (2)
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 |