안녕하세요 프린이입니다!! 고수분들께 질문드립니다!!

홈 > 안드로이드 > 안드로이드
안드로이드

안녕하세요 프린이입니다!! 고수분들께 질문드립니다!!

2 린뽀럼 11 7264 0

안녕하세요!!


안드로이드 애플리케이션 분석 중 루팅 탐지 로직이 네이티브 단에서 이루어지는 것으로 판단되어

해당 라이브러리 내 특정 함수의 레지스터 값을 변조하기 위하여 

 

       var 대상 라이브러리 = Module.findBaseAddress('대상 라이브러리');

       console.log("대상 라이브러리 주소 값 : " + 대상 라이브러리);


위와 같이 Module.findBaseAddress 를 이용, 라이브러리의 주소를 추출하려고 시도하였지만 

라이브러리를 찾지 못하고 계속 "NULL" ​이 출력되었습니다.


그래서 애플리케이션 실행 시 흐름을 파악하기 위하여 LogFilter 를 이용한 분석 결과,

예를 들어 pid 2170번​으로 애플리케이션 실행 된 후 

하기 이미지와 같이 pid 6129번​으로  후킹 대상 라이브러리가 로드되는 것을 확인하였습니다.

 

이후에 애플리케이션의 pid인 2170번이 6129번에 의해 종료되었다는 것도 확인할 수 있었습니다.



이를 통해 라이브러리 주소가 출력 되지 않은 이유가 Module.findBaseAddress 코드 실행 시 

pid 2170 프로세스 내에서만 대상 라이브러리를 찾으려고 시도했기 때문일 것 같다는 결과를 도출해낼 수 있었습니다.

 

질문

 1. 제가 해석한 로그의 의미가 맞나요??

 2. FRIDA 코드를 이용하여 다른 프로세스(라이브러리가 로드되는) 접근 후 라이브러리 후킹도 가능한가요??

 3. 애플리케이션 실행 시 라이브러리를 메모리에 올리고 애플리케이션 실행 및 루팅 탐지에 필요한 코드를 모두 실행시킨 후 

    삭제시켜서 FRIDA 코드로 후킹할 수 없다면 어떻게 후킹 할 수 있을까요??

11 Comments
3 하리하리 2022.04.24 13:19  
cat /proc/pid/maps 확인 시 프로세스에 라이브러리 파일이 로드 된 상태여야 오프셋 확인 가능
러이브러리 로드 함수는 dlopen이지만 자바에서 system.load()시 android_dlopen_ext가 실행
android_dlopen_ext에 interceptor해서 onEnter 실행 시 첫번째 인자 라이브러리명 확인 필요
Interceptor.attach(Module.findExportByName(null, 'android_dlopen_ext'), {
  onEnter(a) {
      this.path = a[0].readCString();
      this.target = this.path.split("/").pop();
      if(this.target==‘’)
          this.flag = true;
  },onLeave(r){
      if(this.flag)
          var base=Module.findBaseAddress(‘’);
  }
})
네이티브 코드는 java.perform() 외부에 작성
1. 코드가 잘못 됐을 확률 높음
2. 상기 동일
3. 파일 삭제 시에도 라이브러리 언로드되지 않는 이상 당연히 코드 삽입 가능
2 린뽀럼 2022.04.26 18:26  
안녕하세요!! 답변 주셔서 감사합니다!!
작성해주신 코드로
android_dlopen_ext에 interceptor해서 onEnter 실행 시 대상 라이브러리가 출력되는 것을 확인하였고 
onLeave 에서 var base=Module.findBaseAddress(‘’); 를 통해
메모리 주소를 출력하려고 하였지만 여전히 null 이 뜹니다 ㅠ.ㅠ
이와 같은 경우에는 메모리에 아직 로드가 되지 않은 것으로 판단해야 할까요?
3 하리하리 2022.04.26 22:22  
앱을 실행하고 예를 들어서,
# cat /proc/대상pid/maps | grep 라이브러리명
74b7343000-74b7369000 r-xp 00000000 103:12 56216 /data/app/패키지명/lib/arm64/라이브러리명
0x74b7343000 값이 찾으시는 해당 라이브러리의 base address에요.
만약 해당 값이 존재한다면 코드 문제일 확률이 높고
출력이 안된다면 해당 라이브러리는 아예 쓰질 않거나 앱 구동 시 로드되지 않고 코드 중간에 실행 될 수도 있어요.
전체 코드나 네이티브쪽 코드를 대략적으로 올려주시면 확인 가능합니다.:)
2 린뽀럼 2022.05.04 11:59  
댓글내용 확인
3 하리하리 2022.05.04 20:37  
댓글내용 확인
2 린뽀럼 2022.05.10 21:28  
댓글내용 확인
6 arahan 2022.04.28 11:18  
일반적인 경우 /data/app/패키지명/lib/arm64/라이브러리명 경로가 라이브러리 호출 경로입니다.

하지만 일부 앱보안 솔루션이 적용된 앱의 경우 보안상의 이유로 다른 경로에서 불러오는 경우가 있습니다.

'Jnitrace' 도구를 검색해서 사용하시거나,

아래 코드와 같이 앱이 사용하는 라이브러리 호출 경로를 먼저 확인하셔야 합니다.

Interceptor.attach(Module.findExportByName(null, 'android_dlopen_ext'), {
  onEnter: function (args) {
      this.path = Memory.readUtf8String(args[0]);
      console.log(" \n[+] android_dlopen_ext path : " + this.path);
  },
  onLeave: function (retval) {
  }
});

//Case 2.
Interceptor.attach(Module.findExportByName(null, 'dlopen'), {
  onEnter: function (args) {
      this.path = Memory.readUtf8String(args[0]);
      console.log(" \n[+] dlopen path : " + this.path);
  },
  onLeave: function (retval) {
  }
});

이 모든게 확인 되었는데도 안되신다면 후킹하고자 하는 라이브러리 모듈이 올라가는 시점에 정확히 후킹을 거셔야합니다.
2 린뽀럼 2022.05.04 12:00  
답변 감사합니다.
올려주신 코드로 확인 결과, 후킹 대상 라이브러리는 /data/app/패키지명/lib/arm/라이브러리명 이 출력되어
일반적인 경우와 똑같이 호출되는 것을 확인할 수 있었습니다.
4 hooder 2022.05.23 17:47  
댓글내용 확인
1 kong 2022.05.27 04:21  
포인트 얻는 방법?
1 Zkskf 2022.06.12 06:15  
엄청나군요
Category