[Android] 루팅 탐지 우회(NOX) - 2. 진단
2. 진단
- 애플리케이션 APK 추출
- Decompile
- jd-gui로 탐지 로직 확인
- NotePad++로 smali 코드 변조
- Compile
- 키생성
- 서명
- Install
- 결과
- 에러 문구
APK 추출
애플리케이션 좌측 마우스로 1초정도 눌러준 후 [추출] 버튼 클릭
Nox가 설치된 경로에 **<애플리케이션이름>** 추출된 것 확인 가능애플리케이션이름>
해당 파일 우클릭해서 [압출 파일 미리 보기]에 있는 classes.dex 만 압축을 풀어 주자.
자 이제 압축을 푼 dex파일을 class파일로 디컴파일 해주겠다.
Decompile
dex2jar 다운로드
https://github.com/pxb1988/dex2jar
해당 사이트에서 dex2jar를 다운로드 받아주자
APK 파일에서 추출한 dex 파일을 dex2jar 폴더 디렉토리에 넣어주자
CMD 창을 열어서 dex2jar 폴더 디렉토리로 설정해주고
d2j-dex2jar.bat <파일이름.dex>
위와 같이 명령어를 입력해주면 java 소스파일을 얻을 수 있다.
jd-gui로 탐지 로직 확인
dex2jar 툴로 디컴파일한 jar 파일을 jd-gui 툴로 열어주면 위와 같이 java 소스코드를 확인할 수 있다.
함수 명이 ‘a’인 것과 루팅 탐지 구문이 보인다.
함수 명이 ‘a’인 이유는 난독화가 적용되어 있어 함수명이 대체 치환되어 있기 때문이다.
자 이제 ‘a’라는 함수 부분을 변조하여 루팀 탐지를 우회해보자.
apktool
1-2강 https://eonion-th3db.github.io/Android-Setting-1-2-JAVA/ 에서
다운로드 받았던 apktool 파일을 Uncrackable1.apk 경로에 넣어주고
CMD에서 위 경로로 위치 시켜주자
java -jar apktool_버전.jar d <파일이름>.apk``파일이름>
d : 디컴파일 옵션
jar : jar 파일로 압축되어 있는 자바 프로그램을 실행
명령어를 실행해주면 APK 파일이 디컴파일되어 폴더가 생성된다.
해당 경로로 타고 들어오면
루팅 탐지 문구가 있었던 MainActivity 파일을 발견할 수 있다.
자 이제 MainActivity.smali 코드를 변조하자
NotePad++로 smail 코드 변조
MainActivity.smali 파일을 NotePad++로 열어보면 루팅 탐지 구문 확인 가능하다.
Root detected 라는 구문이 안나오게하면 루팅 우회 가능할 걸로 판단
다음과 같이 바꿔주자
분기로 판단되는 두 곳
if_nez v0, :cond_0 를 if_nez v0, :cond_1로 바꿔주자
Compile
java -jar apktool_<버전>.jar b <APK파일 디컴파일한 폴더>
b : 컴파일
수정한 smali 파일이 있는 폴더를 다시 APK 파일로 컴파일 해주자.
코드 변조 했던 Uncrackable1 폴더 안에 dist라는 폴더에 컴파일한 APK 파일 생성된 것 확인
키생성
keytool -genkey -v -keystore <파일명>.keystore -alias <별칭> -keyalg RSA -keysize 2048 -validity 10000
genkey : 키(비밀키, 공개키) 생성
verbose : 상세 정보 화면에 표시
keystore : 비밀키와 증명서를 저장하는 키스통의 파일경로 및 파일명 입력
keyalg : 키를 생성하는 알고리즘 지정 (DSA, RSA)
keysize : 키 값 길이
validity : 인증서의 유효기간
서명
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore <키 파일명>.keystore <apk파일명>.apk 별칭
sigalg : 시그니쳐 알고리즘
digestalg : 128비트 고정 길이로 메시지를 압축하는 단방향 해시 알고리즘
verbose : 상세 정보 화면에 표시
sigalg 과 digestalg 을 SHA1으로 설정 시 (disabled) 표시로 서명이 되지 않는 걸 확인할 수 있다.
jdk.jar.disableAlgorithms 으로는 MD2, MD5, 1024 미만 키 길이의 RSA, 1024 미만 키 길이의 DSA, SHA1 이 있으며,
보안 상 문제로 2019-01-01 이후 거부되어 있다.
jarsigner -verify -verbose -certs <apk파일명>.apk
verify : 서명된 jar 파일 확인
certs : 진행 및 인증 과정에서 인증서 화면에 표시
위 명령어를 통해서 서명 됐는지 확인.
Install
먼저, 녹스 내에 설치되어있는 기존 앱 삭제.
nox_adb install <서명된apk파일명>.apk
위 명령어로 설치하거나 드로그 앤 드랍으로 설치해주자.
결과
루팅 탐지 우회 성공!
3강에서는 앱 메모리 내에 노출되는 중요 정보를 찾아보겠다.
에러 문구
install / uninstall 시 발생되는 에러 문구에 대해 알아보자.
- Success :
- 정상 설치
- error : more than one device and emulater
- apk install 시 너무 **많은 단말기 **연결되어 있는 경우이다.
- 하나의 단말기만 연결해주면 해결 가능하다.
- Failure [INSTALL_FAILED_ALREADY_EXISTS]
- 단말기에서 해당 패키지 앱을 삭제하고 다시 설치하자.
- Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
- 재설치 시 (디컴파일 후 컴파일) 나타날 수 있는 에러다.
- 서명까지 완료했지만 설치가 되지 않는 경우 이런 오류가 뜨는데
- 이는 사인 키 값이 서로 맞지 않아 발생한다.
- jarsigner로 서명 과정에서 sigalg 값과 digestalg 값을 동일하게 해주고, 명칭도 정확하게 입력해주자
- ex) -digestalg SHA-256 (O) / -digestalg SHA256(X)