본문 바로가기

Mobile/Android

[연습3]JNI 디버깅

am start -a android.intent.action.MAIN -n tuto.knowryu.tutorial2_native/tuto.knowryu.tutorial2_native.MainActivity


JNI 디버깅 방식1



1. 두 개의 IDA를 실행하여 한개의 IDA에는 classese.dex 를 다른 하나의 IDA에는 대상 SO 파일을 로드한다.

2. adb를 이용하여 tcp forward 후 (C:\>adb forward tcp:23915 tcp:23946 , adb forward tcp:23946 tcp:23946) 

3. classese.dex를 올린 IDA에서 원하는 부분(SO파일 적재 전)에 브레이크 포인트 설정 후 디버거 -> 디버그 옵션에서 set specific options 항목을 선택

하고 Fill From AndroidManifest.xml을 선택하여 해당 앱의 메니페스트 파일을 지정한다.

4. 두번째 아이다에서 SO파일 중 원하는 부분에 브레이크 포인트를 설정한다.

5. 첫번째 아이다에서 실행버튼을 눌러 앱을 실행시키고 

6. F9를 사용하여 (3)에서 설정한 브레이크 포인트까지 이동한다. 

7. 두번째 아이다에서 어태치 프로세스를 이용하여 해당 앱에 어태치한다.

8. 이후 첫번째 아이다에서 F9를 이용하여 완전실행시키면 두번쨰 아이다 쪽으로 디버깅 제어권이 넘어간다.

9. 동일하게 두번째 아이디에서 미리 지정한 브포까지 이동하고 디버깅한다.





JNI 디버깅 방식2(so파일 로드부가 액티비티부에 있는 경우 - am 이용)



1. 디버깅하기 원하는 앱의 SO파일을 아이다에 로드한다.

2. 다음과 같이 스마트폰의 경로, SO파일 이름, 주소 등을 설정한다.

3. 디버깅할 앱을 스마트폰 혹은 에뮬에서 실행시킨다.

4. 원하는 부분에 브레이크 포인트 설정 후 아이다에서 해당 앱에 어태치한다.

3. 어태치가 성공적으로 된 경우 F9를 눌러 실행상태로 대기한다.

4. 액티비티 자체에 so파일 로드부가 있는 경우 다음과 같은 명령어를 사용(설정)하여 원하는 액티비티를 재호출한다.

C:\>adb shell am start -a android.intent.action.MAIN -n tuto.knowryu.tutorial2_native/tuto.knowryu.tutorial2_native.MainActivity

5. 재호출시 원하는 부분으로 이동한것을 확인할 수 있다.