린엔진 튜토리얼 - Hook Helper(훅 헬퍼) 사용방법
린엔진의 새로운 기능인 훅 헬퍼(Hook Helper) 사용 방법 강좌입니다.
Hook Helper?
Hook Helper : http://linforum.kr/bbs/board.php?bo_table=linBoard&wr_id=198
훅 헬퍼의 초기 컨셉은 치트엔진의 오토 어셈블과 동일하게 ARM 어셈블리어를 삽입하도록 만드려고 하였으나,
어려운 어셈블리어를 직접 짤 필요가 없이 쉽게 후킹이 가능한 Frida 라는 강력한 후킹 프레임워크가 존재합니다.
그렇기 때문에 훅 헬퍼는 초보자들도 쉽게 사용할 수 있으며, 동적으로 빠르게 확인이 필요한 작업에 용이하도록 개발 컨셉을 변경하였습니다.
UI에서 단순 버튼 클릭 몇번으로 쉽게 후킹할 수 있습니다.
조건문이 필요한 복잡한 후킹 포인트는 Frida 를 사용하고,
빠르게 단순한 인자 확인 및 변경이 필요한 포인트 또는 동적확인 용도는 Hook Helper 기능을 사용하시면 됩니다.
사용 방법
이전 강좌인 "린엔진 튜토리얼 - IL2CPP 분석"에서 타겟 앱이었던 "Roguelike RPG Offline"이라는 싱글 RPG 게임을 대상으로 진행하겠습니다.
1. 이전 강좌와 동일하게 앱을 어태치한 뒤, View -> Hook Helper 를 클릭하여 훅 헬퍼창을 오픈합니다.
2. 가장 먼저 Interceptor 타입의 훅을 사용하여 리턴되는 값을 가로채서 확인해보도록 하겠습니다.
우선 Hook Helper 창에서 오른쪽에 Add를 클릭한 뒤 Dialog에 위와 같이 입력합니다.
FileName : 후킹할 타겟의 SO 이름을 적어주시면 됩니다. Symbol Name : 해당 SO의 후킹할 심볼을 입력하면 되며, 심볼이 없거나 오프셋을 더하여 후킹할 경우에는 Set Offset을 체크하고 값을 적어주시면 됩니다. Type : 후킹할 타입 지정이 가능합니다. 중간에 있는 Add 버튼 : 인자의 개수를 늘릴 수 있으며, 인자 타입을 선택 및 인자값 변경이 가능합니다. RET : 리턴되는 값의 타입 및 교체될 값을 지정합니다. |
FileName에는 libil2cpp.so 를 입력합니다.
libil2cpp.so의 심볼은 모두 제거되었기 때문에 해당 오프셋을 Symbol Name에 입력하고 Set Offset에 체크하면 됩니다.
이전 강좌에서 분석했던 함수인 get_Health()의 offset 값인 0xD3AFE8을 입력합니다. (16진수 입력)
-> public int get_Health(); // RVA: 0xD3AFE8 Offset: 0xD3AFE8
Type은 Interceptor를 선택합니다.
RET에는 리턴되는 값이 int 타입이기 때문에 %d를 선택합니다.
이렇게 후킹하게 되면 리턴되는 값을 가로챌 수 있습니다.
3. 후킹테이블이 등록되고 등록된 행의 가장 오른쪽에 존재하는 Status가 빨간 글씨의 "HOOK SUCCESS"로 변경되었다면 후킹에 성공한 상태입니다.
4. 실제 몬스터와 전투시 get_Health() 함수의 반환값이 Log에 기록되는것을 확인할 수 있습니다.
Detail에서 "===> (634)"는 리턴되는 값이 634를 뜻합니다.
해당 함수를 가로채서 실제 체력값을 리턴하는것을 확인했으니 리턴되는값을 변경시키도록 해보겠습니다.
5. 리턴값을 변경하기 전 해당 함수는 이미 후킹이 되어 있기 때문에 우선 후킹을 해제해야 합니다.
해당 행을 클릭하고 오른쪽에 Delete 버튼을 클릭하여 후킹을 해제시킵니다.
6. Hook Helper 창에서 다시 Add 버튼을 클릭하여 Replace 타입을 선택하면 리턴되는 값 또는 인자값을 변경할 수 있습니다.
dialog에 위와 같이 동일하게 작성합니다.
Type은 Replace을 선택한 뒤 리턴될 값을 "12345"로 변경합니다.
이렇게 후킹하게 되면 리턴되는 값을 "12345"로 변경하여 반환하게 됩니다.
7. 후킹테이블이 등록되고 등록된 행의 가장 오른쪽에 존재하는 Status가 빨간 글씨의 "HOOK SUCCESS"로 변경되었다면 후킹에 성공한 상태입니다.
8. 게임으로 돌아가서 확인을 해보면 체력값이 12345 값으로 고정되어 피가 감소되지 않는 모습을 확인할 수 있습니다.
9. 후킹테이블은 로드/세이브 기능도 제공합니다.
앱을 종료한 뒤 등록되었던 행을 더블클릭하여 "Loop Until found" 체크박스에 체크한 뒤에 OK를 눌러 다시 저장합니다.
Loop Until found - 해당 라이브러리가 로드되지 않았을 경우 로드될 때 까지 기다린뒤에 후킹하는 옵션입니다.
Hook Helper 창 왼쪽 상단에 File을 눌러 save를 클릭하여 저장이 가능하며, open하고 앱을 다시 실행하면 자동으로 후킹됩니다.