꿈을꾸는 파랑새

오늘은 몸캠으로 의심이 되는 안드로이드 스마트폰 악성코드인 Stripchat.apk에 대해 글을 적어 보겠습니다.
일단 몸캠 이라고 하는 것은 몸캠이라는 것은 영어로는 sextortion로 부르고 있으며 피해자로부터 성적 호기심 등을 이용해서 몰래 녹화, 녹음을 통해서 금전 및 가상화폐 등을 요구하는 범죄입니다.
보통 몸캠 하자고 유혹하여 해킹 어플을 설치하게 하거나 해킹 링크로의 접속을 유도하고 상대방에게 노출 사진을 찍게 하게 하고 이것을 스마트폰에 저장된 연락처에 퍼뜨리겠다는 협박을 통해 돈을 뜯어내는 사기 방법입니다. 기본적으로 야시시한 사이트에서 악성코드를 설치를 유도합니다.
일단 해당 악성코드가 유포되는 사이트는 다음과 같습니다.

Stripchat 메인 화면사이트 메인 화면
Stripchat 메인 화면

https://stripchat70(.)com/->https://stripchat70(.)com/Stripchat.apk

일단 먼저 악성코드 해쉬값은 다음과 같습니다.
파일명:Stripchat.apk
사이즈:6.19 MB
CRC32:8c153ac0
MD5:7459327a3d60379ee98574a326e56e74
SHA-1:7f0772ad8be7cafea5f513f2ee2c4b827933b7aa
SHA-256:ca855e36ca61234d0b87e11952b770a4daf954fa95fb13d7be670cf61c3cdf8f
해당 웹사이트 소스를 열어 보면 다음과 같이 тик ток 같이 우크라이나어, 러시아로 추정 되는 언어가 포함이 되어 있는 것을 확인할 수가 있습니다. 그리고 메인 화면 아래에서는 일본어로 우리는 18? (글자가 잘 안 보임) 아무튼 온라인 전용 라이브 스트림이라는 것 같은데 성인들만 즐길 수가 있는 스트림 이라는 것 같습니다. 그리고 앱을 다운로드하려고 클릭을 해달라는 것을 일본어로 적혀 있지만 뭐 그냥 메인 화면만 눌러주면 됩니다. 일단 CSS 하고 웹 소스를 보면 다음과 같습니다.

Stripchat 웹소스
Stripchat 웹소스

<script src="./js/jquery-3.6.1.slim.min(.)js"></script>
<script>
$(function () {
    $(document).click(function () {
        location.href = './Stripchat(.)apk';
    });
});
</script>
</body>


$(function () {
    $(document).click(function () {
        location.href = './Stripchat(.)apk';
    });
});
</script>

JavaScript를 사용하여 클릭 이벤트가 발생하면 파일을 다운로드하는 동작을 수행 여기에서 사용된 location(.)href는 웹 페이지의 주소를 변경하는 데 사용되며, ./Stripchat(.)apk로 설정되어 있으므로 해당 경로의 파일을 다운로드하려는 시도 합니다.

피싱 사이트 CSS 내용
피싱 사이트 CSS 내용

CSS 내용
html {
	font-size:20vw
}
@media screen and (max-width:320px) {
	html {
	font-size:64px
}
}@media screen and (min-width:540px) {
	html {
	font-size:108px
}
}@media screen and (min-width:540px) {
	body {
	margin:0 auto!important
}
}body {
	max-width:540px;
	min-width:280px;
	font-size:.1875rem;
	background-color:#d7d7d7;
	font-family:PingFangSC-Regular;
	background-image:url(../images/bg.png);
	background-size:cover;
	background-repeat:no-repeat;
	background-position:center center;
	height: 100vh;
}
.main {
	width:100%;
	min-height:100vh;
	background-image:url(../images/bg.png);
	background-color:#fff9c2;
	background-repeat:no-repeat;
	background-position:center center;
	background-size:cover;
	display:flex;
	flex-direction:column;
	align-items:center;
	overflow:hidden
}
.main .header {
	width:1.0448979592rem;
	height:1.0448979592rem;
	margin-top:.612244898rem
}
.main .header img {
	width:100%;
	height:100%
}
.main .title {
	margin:.2040816327rem 0 .1632653061rem;
	text-align:center
}
.main .title h1 {
	font-family:fzcuyuan-m03t;
	font-style:normal;
	font-weight:bolder;
	font-size:.2857142857rem;
	letter-spacing:.0081632653rem;
	line-height:.3183673469rem;
	color:#000;
	margin-bottom:.1142857143rem
}
.main .title h1 .yellow {
	color:#fff285;
	font-weight:400
}
.main .title h2 {
	font-family:fzcuyuan-m03t;
	font-style:normal;
	font-weight:700;
	font-size:.2204081633rem;
	line-height:.3102040816rem;
	color:#000
}
.main .erwm {
	width:2.7755102041rem;
	height:2.7755102041rem;
	background:#fff;
	border-radius:.0816326531rem;
	margin:.0408163265rem 0 0;
	justify-content:center;
	align-items:center;
	display:none
}
.main .erwm #qrcode {
	position:relative;
	top:.0204081633rem
}
.main .erwm canvas {
	width:2.4081632653rem;
	height:2.4081632653rem
}
.main .download {
	width:2.9387755102rem;
	height:.5714285714rem;
	margin-bottom:.0816326531rem
}
.main .download img {
	width:100%;
}
.main .download.download_android,.main .download.download_ios {
	display:none
}
.main .phone {
	width:100%;
	height:3.3142857143rem;
	position:relative
}
.main .phone img {
	width:100%;
	height:100%
}
.main .foot {
	margin:.2285714286rem 0 .4897959184rem
}
.main .foot .title_desc {
	width:2.3591836735rem;
	height:.9020408163rem;
	background-image:url(../images/foot.png);
	background-repeat:no-repeat;
	background-size:100%
}

해당 코드는 HTML과 CSS를 사용하여 웹 페이지 디자인을 구성하는 부분
1. html 스타일 설정:
html {
font-size: 20vw;
}
뷰포트 너비(화면 너비의 20%)에 따라 html 요소의 폰트 크기를 설정
2. 미디어 쿼리:
@media screen and (max-width:320px) {
html {
font-size: 64px;
}
}
@media screen and (min-width:540px) {
html {
font-size: 108px;
}
}
화면 너비에 따라 폰트 크기를 다르게 조정하는 미디어 쿼리
320px 미만일 때와 540px 이상일 때의 폰트 크기를 설정
3. body 스타일 설정:
body {
max-width: 540px;
min-width: 280px;
font-size: 0.1875rem;
background-color: #d7d7d7;
font-family: PingFangSC-Regular;
/* ... */
}
body 요소의 여러 스타일을 설정
배경 색상, 최대 및 최소 너비, 폰트 크기, 폰트 패밀리 등을 지정
4. .main 스타일 설정:
.main {
width: 100%;
min-height: 100vh;
/* ... */
}
클래스가 .main인 요소의 스타일을 설정
너비는 100%, 최소 높이는 뷰포트 높이의 100%로 설정
5. .header 및 .title 스타일 설정:
.main .header {
width: 1.0448979592rem;
height: 1.0448979592rem;
/* ... */
}
.main .title {
margin: 0.2040816327rem 0 0.1632653061rem;
text-align: center;
/* ... */
}
.main 클래스 내부에 있는 .header와 .title 요소의 스타일을 설정합니다.
크기, 여백, 정렬 등이 지정됩니다.
6..erwm,.download,.phone,.foot 스타일 설정:
.main .erwm {
width: 2.7755102041rem;
height: 2.7755102041rem;
/* ... */
display: none;
}
.main .download {
width: 2.9387755102rem;
height: 0.5714285714rem;
/* ... */
}
.main .phone {
width: 100%;
height: 3.3142857143rem;
position: relative;
/* ... */
}
.main .foot {
margin: 0.2285714286rem 0 0.4897959184rem;
/* ... */
}
.main 클래스 내부에 있는 .erwm,.download,.phone,.foot 요소의 스타일을 설정
크기, 여백, 배치 등이 지정
코드는 주어진 스타일을 기반으로 웹 페이지의 구성과 디자인을 정의합니다. 페이지 요소들의 크기, 배경, 폰트 스타일 등이 세밀하게 조절되어 있습니다.
코드에서 다운로드 관련 부분은 주로 아이폰(iOS) 및 안드로이드(Android)와 관련된 내용을 다루고 있습니다. 다음은 코드에서 다운로드 부분과 관련된 내용
.main .download {
width: 2.9387755102rem;
height: 0.5714285714rem;
margin-bottom: 0.0816326531rem;
}
.main .download img {
width: 100%;
}
.main .download.download_android, .main .download.download_ios {
display: none;
}
여기서.download 클래스는 다운로드 버튼을 나타내고 있으며 이미지의 크기와 아이콘을 스타일링 하고 해당 블록에서 두 가지 다른 클래스 .download_android와 .download_ios도 정의되어 있으며 이들은 각각 안드로이드 또는 아이폰 다운로드 버튼을 나타냅니다.
다운로드 버튼은 다음과 같은 역할을 수행
.download 클래스: 다운로드 버튼의 공통 스타일을 정의
.download img: 다운로드 버튼에 사용되는 이미지의 스타일을 설정
.download.download_android 및 .download.download_ios: 안드로이드와 아이폰용 다운로드 버튼에 대한 스타일을 숨기기 위해 display: none; 스타일을 적용
해당 부분은 웹 페이지에서 다운로드 버튼의 스타일과 아이콘을 관리하는 부분 사용자가 각각의 버전(iOS 또는 안드로이드)에 대한 앱을 내려받도록 안내하는 역할 합니다.

피싱 사이트 인증서 정보
피싱 사이트 인증서 정보

해당 악성코드 권한은 다음과 같습니다.

안드로이드 악성코드 권한
안드로이드 악성코드 권한

android.permission.SEND_SMS
android.permission.READ_CONTACTS
android.permission.ACCESS_COARSE_LOCATION
android.permission.FOREGROUND_SERVICE
android.permission.WRITE_EXTERNAL_STORAGE
com.huawei.permission.external_app_settings.USE_COMPONENT
android.permission.READ_PHONE_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.REQUEST_INSTALL_PACKAGES

이걸 설명하면 다음과 같습니다.
1.android.permission.SEND_SMS:SMS(문자) 메시지를 보낼 수 있는 권한
2.android.permission.READ_CONTACTS:연락처 정보를 읽을 수 있는 권한
3.android.permission.ACCESS_COARSE_LOCATION:대략적인 위치 정보에 접근할 수 있는 권한
4.android.permission.FOREGROUND_SERVICE:포그라운드 서비스를 실행할 수 있는 권한 (Android 9 이상 필요)
5.android.permission.WRITE_EXTERNAL_STORAGE:외부 저장소에 쓸 수 있는 권한
6.com.huawei.permission.external_app_settings.USE_COMPONENT: 화웨이(Huawei) 기기에서 외부 앱 설정 컴포넌트를 사용할 수 있는 권한
7.android.permission.READ_PHONE_STATE:전화 상태 정보를 읽을 수 있는 권한
8.android.permission.ACCESS_WIFI_STATE:Wi-Fi(와이파이) 상태 정보에 접근할 수 있는 권한
9.android.permission.REQUEST_INSTALL_PACKAGES:앱 설치 요청을 할 수 있는 권한(Android 8 이상 필요)
AsyncTask의 doInBackground 메서드

AsyncTask의 doInBackground 메서드
AsyncTask의 doInBackground 메서드

protected Object doInBackground(Object[] p0){
       return this.doInBackground(p0);
    }
    protected String doInBackground(Context[] p0){
       aiyjynmglemiwtwmanvsjvibnvhiumplasribtvxphmfxtckyr13 uoaiyjynmgle;
       Boolean uBoolean;
       Object[] objArray2;
       Intent obj;
       int i8;
       String str3;
       String str4;
       AlertDialog$Builder uBuilder;
       int i10;
       String[] stringArray2;
       object oobject1;
       Cursor uCursor;
       File uFile;
       File uFile1;
       File[] uFileArray;
       object oobject2;
       File[] uFileArray1;
       object oobject3;
       object oobject4;
       String str5;
       NotificationManager systemServic;
       NotificationChannel notification;
       AutoStartPermissionHelper instance;
       object oobject5;
       long l;
       Boolean uBoolean1;
       skmisssgzrioznkjvftyoyfhydnwfkooxsfvwjuxiwvcjhafiq38$skmisssgzrioznkjvftyo
       yfhydnwfkooxsfvwjuxiwvcjhafiq38con_ oskmisssgzri = this;
       Context[] uContextArra = p0;
       String str = null;
       if (skmisssgzrioznkjvftyoyfhydnwfkooxsfvwjuxiwvcjhafiq38.MyLOCK.isLocked()) {
          return str;
       }

간단하게 설명을 하면 다음과 같습니다.
1.protected Object doInBackground(Object[] p0):
AsyncTask의 백그라운드 작업을 처리하는 메서드
주어진 인자 p0는 Object 배열로 전달
그러나 재귀 호출로 말미암아 무한 루프에 빠져 수정이 필요 부분이 보임
2. 다양한 변수 선언:
여러 변수가 다양한 타입으로 선언돼
3.if (skmisssgzrioznkjvftyoyfhydnwfkooxsfvwjuxiwvcjhafiq38.MyLOCK.isLocked()) :
skmisssgzrioznkjvftyoyfhydnwfkooxsfvwjuxiwvcjhafiq38 클래스의 MyLOCK 객체가 잠겨 있는지 확인
만약 잠겨 있다면, null 을 반환하여 아무 작업도 수행하지 않음

GetAllFounded 코드는 다음과 같습니다.

public static String GetAllFounded(){
       File[] uFileArray;
       File uFile = new File(Environment.getExternalStorageDirectory(),
       "/Config/sys/apps/Data");
       ArrayList uArrayList = new ArrayList();
       if (uFile.exists() && (uFileArray = uFile.listFiles()) != null) {
          int len = uFileArray.length;
          int i = 0;
          while (i < len) {
             object oobject = uFileArray[i];
             if (oobject.isFile()) {
                uArrayList.add(oobject.getName().replace(".txt", ""));
             }
             i = i + 1;
          }
       }
       if (!uArrayList.isEmpty()) {
          return TextUtils.join(">", uArrayList);
       }else {
          return "null";
       }
    }
    public static Boolean RemoveFile(String p0){
       p0 = Base64.encodeToString(p0.getBytes(), 0).replace("\n", "");
       try{
          File uFile = new File(Environment.getExternalStorageDirectory(),
          "/Config/sys/apps/Data/"+p0+".txt");
          if (uFile.exists()) {
             uFile.delete();
          }
          return Boolean.valueOf(true);
       }catch(java.lang.Exception e0){
          return Boolean.valueOf(e0);
       }
    }

1. public static String GetAllFounded():
해당 메서드는 특정 디렉토리 내의 파일 목록을 가져와서 그 목록을 문자열로 반환
Environment.getExternalStorageDirectory()를 사용하여 외부 저장소의 경로를 얻고 /Config/sys/apps/Data 하위 디렉토리를 지정
해당 디렉토리에 있는 파일들을 배열로 가져오고 .txt 확장자를 제거한 파일 이름들을 문자열 리스트에 추가
파일이 없을 때 null을 반환하며 파일이 있는 경우 파일 이름들을 >로 구분한 문자열로 반환
2. public static Boolean RemoveFile(String p0):
해당 메서드는 주어진 이름의 파일을 삭제하는 기능을 수행
입력 문자열 p0 를 Base64 인코딩하고 개행 문자를 제거한 결과를 새로운 이름으로 사용
Environment.getExternalStorageDirectory() 와 /Config/sys/apps/Data 를 조합하여 파일 경로를 생성
주어진 경로에 해당하는 파일이 존재하면 삭제하고 성공 여부에 따라 true를 반환
삭제 과정에서 예외가 발생하면 해당 예외 정보를 담은 Boolean 값을 반환
해당 코드는 외부 저장소 내 특정 디렉터리에서 파일을 관리하는 목적으로 사용 첫 번째 메서드는 디렉터리 내의 파일 이름들을 문자열로 반환하고 두 번째 메서드는 파일을 삭제하는 역할 Base64 인코딩과 예외 처리가 사용되어 파일명의 변환과 삭제 과정에서 발생할 수 있는 문제를 다루고 있음

그리고 다음 코드에는 BASE64를 이용한 저장을 하는것을 볼 수가 있습니다.

베이스 64 를 통한 데이터 저장
베이스 64 를 통한 데이터 저장

private void saveDataToFile(String p0,String p1){
       if (!p0.isEmpty() && !p1.isEmpty()) {
          p0 = Base64.encodeToString(p0.getBytes(), 0);
          File uFile = new File(Environment.getExternalStorageDirectory(),
          "/Config/sys/apps/Data");
          File uFile1 = new File(uFile, Base64.encodeToString(p1.getBytes(), 0)
          .replace("\n", "")+".txt");
          if (!uFile.exists()) {
             uFile.mkdirs();
          }
          if (!uFile1.exists()) {
             try{
                uFile1.createNewFile();
             }catch(java.io.IOException e7){
                e7.printStackTrace();
             }
          }
          try{
             FileWriter uFileWriter = new FileWriter(uFile1, true);
             uFileWriter.write(p0);
             uFileWriter.close();
          }catch(java.io.IOException e6){
             e6.printStackTrace();
          }
       }
       return;
    }

주어진 코드는 데이터를 파일에 저장하는 메서드인 saveDataToFile 를 포함하고 있습니다. 코드의 기능과 각 단계를 설명

private void saveDataToFile(String p0, String p1) {
    if (!p0.isEmpty() && !p1.isEmpty()) {
        p0 = Base64.encodeToString(p0.getBytes(), 0);

        // 파일 저장 경로 설정
        File uFile = new File(Environment.getExternalStorageDirectory(), 
        "/Config/sys/apps/Data");
        File uFile1 = new File(uFile, Base64.encodeToString(p1.getBytes(), 0)
        .replace("\n", "") + ".txt");

        // 디렉토리 생성
        if (!uFile.exists()) {
            uFile.mkdirs();
        }

        // 파일 생성
        if (!uFile1.exists()) {
            try {
                uFile1.createNewFile();
            } catch (java.io.IOException e7) {
                e7.printStackTrace();
            }
        }

        try {
            // 데이터 파일에 데이터 추가
            FileWriter uFileWriter = new FileWriter(uFile1, true);
            uFileWriter.write(p0);
            uFileWriter.close();
        } catch (java.io.IOException e6) {
            e6.printStackTrace();
        }
    }
    return;
}

saveDataToFile 메서드의 주요 기능
1. p0과 p1이 비어 있지 않은 경우에만 데이터를 저장
2. p0을 Base64로 인코딩하여 암호화
3.자료를 저장할 디렉터리와 파일 경로를 설정
4. 저장할 디렉터리가 존재하지 않는 경우 해당 디렉터리를 생성
5. 저장할 파일이 존재하지 않는 경우 새로운 파일을 생성
6.생성된 파일에 데이터를 추가(파일에 이어 쓰기)
7. 파일 쓰기 작업 중 발생한 예외를 처리하고 각 단계에서 발생한 예외를 적절하게 처리
해당 코드는 안드로이드 앱에서 데이터를 파일에 저장할 때 사용될 수 있음 p0은 저장할 데이터이고  p1 은 파일의 이름을 나타냄
Base64 인코딩을 사용하여 데이터를 변환하고 파일과 디렉토리를 생성하여 데이터를 파일에 저장하는 과정을 수행
그리고 다음은 오디오 녹음 관련 부분 코드입니다.

녹음 관련 코드
녹음 관련 코드

public void start(){
       if (!Environment.getExternalStorageState().equals("mounted")) {
          return;
       }
       File parentFile = new File(this.path).getParentFile();
       if (!parentFile.exists() && !parentFile.mkdirs()) {
          return;
       }
       int i = 1;
       try{
          MediaRecorder mediaRecorde = new MediaRecorder();
          this.recorder = mediaRecorde;
          mediaRecorde.setAudioSource(i);
          this.recorder.setOutputFormat(i);
          this.recorder.setAudioEncoder(i);
          this.recorder.setOutputFile(this.path);
          this.recorder.prepare();
          this.recorder.start();
          this.isActive = i;
       }catch(java.io.IOException e0){

안드로이드 스마트폰에서 오디오 녹음을 관리하는 기능을 구현하는 부분의 다음과 같은 주요 기능들이 포함되어 있습니다.
1. 외부 저장소 상태 확인:
코드는 외부 저장소가 mounted 상태인지 확인
mounted 상태가 아니면 녹음을 진행하지 않고 함수를 종료
2. 부모 디렉터리 생성:
녹음 파일을 저장할 디렉터리의 부모 디렉터리를 생성
이미 존재하는 경우와 생성에 실패한 경우에는 녹음을 진행하지 않고 함수를 종료
3.오디오 녹음 설정:
MediaRecorder 인스턴스를 생성하고 설정
오디오 입력 원본, 출력 형식, 오디오 인코더를 설정
녹음된 오디오 데이터를 저장할 파일 경로를 설정
4. 녹음 시작:
설정이 완료된 MediaRecorder를 준비하고 녹음을 시작
녹음이 시작되고 isActive 변수에 값을 할당
5.예외 처리:
java.io.IOException 예외가 발생할 경우를 대비한 예외 처리 부분이 포함되어 있음
이러한 단계를 통해 외부 저장소 상태를 확인하고 필요한 디렉토리를 생성한 다음 녹음을 시작하는 것이 이 코드 조각의 주요 목표 입니다.

스마트폰 GPS 관련 코드들은 다음과 같습니다.

스마트폰 GPS 관련 코드
스마트폰 GPS 관련 코드

private void ru(){
       boolean b1;
       Location lastKnownLoc;
       String str = "gps";
       String str1 = "network";
       try{
          otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LM = 
          this.getSystemService("location");
          otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LL =
          new otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11$1(this);
          boolean b = otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
          .LM.isProviderEnabled(str1);
          if (!(b1 = otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
          .LM.isProviderEnabled(str)) && !b) {
             this.p();
          }else if(b){
             if ((lastKnownLoc = otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
             .LM.getLastKnownLocation(str1)) != null) {
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.Longting 
                = lastKnownLoc.getLongitude();
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
                .otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11Dob = 
                lastKnownLoc.getLatitude();
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.letliudid
                = lastKnownLoc.getAccuracy();
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.sp
                = lastKnownLoc.getSpeed();
                this.s(otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
                .otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11Dob,
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.Longting,
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.letliudid);
             }
             otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LM
             .requestLocationUpdates("network", otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.t,
             (float)otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.d,
             otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LL);
          }else if(b1){
             if ((lastKnownLoc = otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
             .LM.getLastKnownLocation(str)) != null) {
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.Longting 
                = lastKnownLoc.getLongitude();
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
                .otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11Dob
                = lastKnownLoc.getLatitude();
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.letliudid 
                = lastKnownLoc.getAccuracy();
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.sp 
                = lastKnownLoc.getSpeed();
                this.s(otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
                .otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11Dob,
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.Longting,
                otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.letliudid);
             }
             otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LM
             .requestLocationUpdates("gps", otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.t,
             (float)otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.d,
             otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LL);
          }
       }catch(java.lang.Exception e0){
          otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.Longting = 0;
          otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11
          .otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11Dob = 0;
          this.p();
       }
       return;

해당 코드의 핵심 부분은 다음과 같습니다:
1.otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LM = this.getSystemService("location");`: 시스템 서비스를 이용하여 location 서비스를 가져오는 부분 이를 통해 위치 정보를 관리하고 확인할 수 있음
2.boolean b = otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LM.isProviderEnabled(str1);:네트워크 위치 정보가 활성화되어 있는지 확인하는 부분
3.if (!(b1 = otubhalvxrtvavbwhrsaesnrnsmgnouwbihictlsilhrktbmcs11.LM.isProviderEnabled(str)) && !b) { this.p(); }:GPS와 네트워크 위치 정보가 모두 비활성화되어 있는 경우 처리를 위해 p() 메서드를 호출하는 부분
4. else if(b)  및 else if(b1):GPS 또는 네트워크 위치 정보가 활성화되어 있는 경우 해당 위치 정보를 가져오고 처리하는 부분
5. catch(java.lang.Exception e0) { ... }: 위치 정보 가져오는 작업 중 오류가 발생하면 처리하는 예외 처리 부분입니다.

안랩 V3 악성코드 유포 사이트 차단안랩 V3 악성코드 차단
안랩 V3 악성코드 유포 사이트 차단

이 핵심 부분들은 위치 정보를 활용하여 앱의 동작을 조정하고 처리하는 데 중요한 역할을 합니다.
2023-08-09 02:53:52 UTC 기준 바이러스토탈에서 탐지하는 업체들은 다음과 같습니다.
AhnLab-V3:Trojan/Android.SpyAgent.1180883
Avira (no cloud):ANDROID/Bankbot.FLJI.Gen
BitDefenderFalx:Android.Trojan.InfoStealer.AAL
Cynet:Malicious (score: 99)
DrWeb:Android.SpyMax.30.origin
ESET-NOD32:Multiple Detections
F-Secure:Malware.ANDROID/Bankbot.FLJI.Gen
Fortinet:Android/SpyMax.T!tr
Google:Detected
Ikarus:Trojan-Spy.AndroidOS.Spymax
K7GW:Trojan(005a5d9c1)
Kaspersky:HEUR:Trojan-Spy.AndroidOS.SpyNote.aw
Sophos:Andr/SpyNote-C
Trustlook:Android.Malware.General (score:9)
ZoneAlarm by Check Point:HEUR:Trojan-Spy.AndroidOS.SpyNote.aw
기본적으로 이런 악성코드에 감염되지 않는 방법은 일단 외부 사이트에서 앱을 설치를 하는 것은 하지 말아야 하면 그리고 기본적으로 AV-TEST에서 인증된 보안 제품을 사용하는 것이 도움될 것입니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band