기본적으로 자바에서 call 하는 함수의 경우에는 Java_com_xxx 이와 같은 형식으로 함수 네이밍이 되어있다.
그런데 C, C++ 내부에서 사용하려고 클래스를 만들거나 그 안의 함수를 후킹할 때 IDA에서 function List로 볼 때는 그냥 개발자가 선언한 함수 이름으로 보이지만 실제 frida 등을 통해서 후킹할 때는 맹글링된 이름을 가져와야한다.
뭐 사실 나도 frida에 대해서 많은 함수를 써본것도 아니니 다른 방법을 통해 후킹이 가능하다면 댓글 부탁드림미다....
## Name Mangling ??
우선 Name Mangling이 뭔지 알아보자.
위키에 따르면 컴파일러에서 프로그래밍 entity에 대한 고유한 이름을 해결해야 하는 필요성으로 인해 발생하는 다양한 기술 문제를 해결하기 위해 사용되는 기술이다.
그러니까 한마디로 컴파일러가 각 Scope 마다 전역변수 또는 함수에 대하여 구분을 하기 위해 컴파일러 단계에서 이름을 변경한다고 생각하자. 그러면 링커라는 녀석이 맹글링된 이름을 통해 각 함수를 구분할 수 있다.
## 실습
#전체적인 구성도
간단하게 실습 app을 만들어보자... 왜냐면 본인은 이거 써먹을 곳이 앱 진단에서 밖에 안써먹기 때문에 내가 편한 예시를 든다.
진짜 대충 만들기는 했지만.... 간단하게 설명하자면 보통 자바에서 C,C++ 함수를 호출할 때 미리 C++ 헤더파일에 정의되어 있고 자바 소스코드 에서도 선언을 해줘야 호출이 가능하다.
이 상태에서 Java_com 함수가 암호화를 한다던지 뭐 다른 부가적인 기능이 필요해서 c++ 내에 다른 함수를 또 정의해서 사용한다던가 하는 일이 생길 수 있다. 그렇게 내부에 새로운 함수를 정의해서 사용하는데, 앱을 진단하다 보면 해당 함수를 후킹하는 상황이 필요할 때가 있음. 그럴 때 그냥 Calculator 에 있는 함수 이름을 Frida를 통해 FindModuleName 인가 이런 함수로 가져오면 해당 함수 주소 값을 제대로 못가져온다.
#자바에서 호출하는 함수
위에 보이는 함수들은 자바에서 호출하는 함수들이다. (함수이름 : ohho, com)
그런데 그 안에서 Calculator 객체를 생성하여 그 안에서 fc, getco 같은 함수를 부르고 있다.
#IDA 에선 어떻게 보이지 ??
IDA 에서 함수 검색을 했을 때는 위의 사진과 같이 검색이 가능하다. 근데 저거 이름 그대로 후킹하면
주소값을 못찾을꺼다....
그래서 해당 함수를 클릭해서 그래프 뷰를 보게되면 아래와 같이 맹글링된 이름을 확인할 수 있다.
그래서 해당 함수를 어떻게 후킹하고 왜 저렇게 매핑이 되는지는 다음에 알아보자!
'Technical Docs > Android' 카테고리의 다른 글
Smali 수정으로 logcat 남기기 (0) | 2022.06.02 |
---|---|
Manifest 구조를 알아보자 (0) | 2022.01.10 |
Smali 코드로 Toast 생성하기 (0) | 2021.12.17 |
Android Native C++ string Frida로 출력 (0) | 2021.12.17 |
NDK Jstring to string (char *) 문자열 변경 (0) | 2021.12.08 |