저번에 libchilsan.so에서 게임 관련을 담당한다는 것을 알아낸 이후 USIM 결제 관련을 바로 들어가기 보다는 먼저 게임에서 사용되는 재화인 황금 돼지를 소비하지 않고 물건을 구매할 수 있도록 패치한 다음
분석이 좀 익숙해지면 그때 본격적으로 USIM 결제 관련을 분석하는 방향으로 가려고 계획을 세웠다
그래서 황금돼지가 부족할때 뜨는 텍스트인 '돼지가 부족합니다.' 이 텍스트를 기드라에서 찾아야되는데, 삽질을 많이 헀다.
왜냐하면 어떤 인코딩 방식을 통해 한국어 데이터가 저장돼있는지 몰랐기 때문,
그래도 데이터가 분명히 있을 거라고 믿고 인코딩해서 하나씩 검색해본 덕에 금방 찾을 수 있었다.
결과적으로는 EUC-KR 방식으로 데이터가 저장돼있었고,
EUC-KR 방식이 게임에서 한국어 데이터를 저장할때 주로 사용되는 방식인지는 잘 모르겠으나 아무튼 찾았으니 다행이었다.
무튼 패치 방법은 리버싱을 조금만 해본 사람이더라도 바로 이해할 수 있는 리버싱 초보 레벨1 아주 기초 수준의 작업이었다.
그냥 해당 메시지를 출력하는 부분으로 분기하지 않도록 분기문을 패치해버리면 끝난다.
이렇게 패치를 하고 apk 사이닝을 직접 한다음에 기기에 설치하려고 했는데 계속 패키지가 잘못되어 앱이 설치되지 않았다고 떴다.
그래서 뭐가 잘못인지 한참 찾다가 Apk Easy Tool 이라는 도구를 써봤더니 설치가 잘 됐다. 사이닝할때 안드로이드 스튜디오에서 제공하는 debug.keystore를 써서 그런건가? 아니면 다른 문제일수도 있지만 무튼 설치가 잘 됐다.
설치하고 실행해보니까 구매가 잘 된다!!! 앱이 엄청 허술하다.
근데 문제는 레벨이 낮다며 장착이 안된다.. 이것도 위와 마찬가지 방법으로 아주 easyy하게 해결할 수 있었다.

일단 이렇게 만들어놓고 이제 USIM 관련 로직을 분석해야 된다.
일단 저번에 jadx로 잠깐 apk를 열어봤을때 IAP 관련된 코드들이 있어서
아, 결제를 안드쪽에서 담당하는구나라고 추측할 수 있었기에 게임을 담당하는 libchilsan.so와 결제를 담당하는 안드로이드 java 코드간에 어떠한 함수로 결제 결과를 주고 받겠구나까지는 생각할 수 있었기에,
안드로이드쪽이 libchilsan.so에서 어떤 네이티브 함수를 꺼내와서 사용하고 있는지 보기 위해 NativeClass쪽을 봤더니 누가봐도 수상한 다음 함수가 있었다.

OnNativeBuyResult..? 결제 이후 처리를 담당하는 함수같다.
그래서 바로 기드라에서 해당 함수를 찾았고

호출하는 함수들을 따라가다보니 다음 코드를 발견하게 되었다.

처음에는 buyProcCB라고 하고 아무런 정보가 없길래 뭐지 싶었는데 잠깐 뒤에 CB가 CallBack의 약자라는 사실을 깨달았다
그래서 콜백함수를 호출한다는 것을 깨닫고(Call-back function: 작업을 시작하기 전에 사용자가 세팅하고 작업이 끝난 이후 호출되는 함수. 대충 그런 뜻으로 이해하면 된다.)
아, 그러면 콜백함수를 세팅하는 부분을 찾아야겠구나. 그 세팅된 콜백 함수에서 결제 이후 처리를 담당하겠구나. 라고 생각할 수 있었다.
그래서 buyProcCB의 주소로 가보니

역시 예상대로 콜백을 세팅하는 setBuyProcCB라는 함수에서 해당 주소를 참조하고 있었고 setBuyProcCB를 호출하는 놈한테 가보니(xref기능을 썼다) 세팅되는 콜백 함수를 찾았다.

위 함수가 바로 안드로이드 단에서 구매 요청 시도 이후 libchilsan.so에서 실행되는 함수이다.

위와 같이 jadx에서 OnNativeBuyResult 함수를 이런식으로 호출한다는 것을 보고 구매 성공시에는 상태 코드인 첫번째 인자가 0이 들어간다는 것을 확인했다.
위에 콜백 함수에서 param_1에 상태 코드가 들어가는 것이고 성공 시에는 0이라는 값이 들어가는 것이다.
무조건 param_1 == 0 조건 블록 안에 있는 코드가 실행이 되도록 분기 명령어를 수정해준다.
그럼 간단하게 패치할 수 있다.
이제 마지막으로 Apk Easy Tool로 사이닝 후 앱을 설치하고 구매를 해보면...!!


***안드쪽 코드는 건들지 않았기에 이 경고창은 여전히 뜬다. 하지만..***

구매가 됐다!!!!
구매한 커터칼로 내 원래 목적이었던 택배 상자를 언박싱 해보겠다.


걍 흔한 템만 준다..... 뭐 택배박스라고 해서 특별한 아이템을 선물받는건줄 알았지만 그냥 얻기 쉬운 흔한 템을 준다..
몇번 더 까봤지만 강화석, 귀환서, 물약 이런것만 준다. 좀 허무하다.
무튼 이제 게임 내 아이템 전부를 살 수 있게 되었으니 본격적으로 플레이를 좀 해봤고 감상을 남기자면 일단

위 사진에서 손가락으로 가리키고 있는 얘가 공업이랑 방업 최강 장신구인데 외관이 너무 구려서 화난다.. 바보가 뭐냐 바보가..

난 최강은 아니지만 그래도 외관이 이쁜 이 발키리 고스튬이 제일 나은 것 같다.
그리고 플레이하면서 느낀건데 황금돼지 약 5만개 정도의 가치를 가지는 헬멧,무기,갑빠 셋을 착용했는데도 불구하고 몹이 안죽는다..ㅋㅋㅋ 그정도 황금돼지면 대충 맵을 1000번정도 돌아야(한판에 약 1분정도 소요, 황금돼지 50개정도 모임) 모을 수 있는 양이다.. 심지어 레벨이 높으면 몹이 진화해서 잘 잡지 못하기에 황금돼지가 적게 모인다..
...
아 그리고 번외로 SetHeroExp 함수도 수정해서 몹 하나 잡을때마다 현재 가지고 있는 경험치가 2배가 되도록 코드를 수정했다. 한 20레벨만 넘어가도 레벨 1 올리는데 무슨 맵을 10번정도씩 돌아야하길래 답답해서 그냥 패치해버렸다. 이쯤되면 이정도 수준의 패치 작업은 껌이다.. 그리고 이렇게 답답하게 게임을 설계하다니.. 아니면 내가 그냥 이런 류의 게임에 적성이 안맞나보다.
아무튼 2~3일 정도의 간단한 리버싱 작업이었고 뭔가 허무하지만 그래도 재미를 느낄 수 있어서 좋았다.
수정된 apk 파일을 올려놓을테니 관심이 있다면 한번 플레이해보길 바란다. (참고로 나는 android 4.4.2 환경에서 테스트했고 최신버전 안드로이드에서는 앱 설치 자체가 안됨)
(발표 자료 만들고 생기부에 넣어야돼서 바쁘다보니 황금돼지 패치하는거 설명하는 부분에서 사진도 잘 안넣고 글을 대충썼지만 나중에 시간이 되면 사진도 넣고 내용도 좀 추가해봐야겠다.)
'Security > Reversing' 카테고리의 다른 글
| 밀크초코 FPS 게임에서 채팅 버그로 다른 사람 사칭이 가능한 트릭 - 기술적 분석 (1) | 2025.12.28 |
|---|---|
| 삼성 T5 포터블 SSD 자동 해제 프로그램 개발 (with SCSI protocol) (0) | 2025.11.10 |
| 추억의 게임 렙업만이살길2 리버싱 일기 - 1편 (1) | 2025.06.01 |
| DLL Injection 기법 - 프로세스에 침투하기 (0) | 2024.02.08 |
| 윈도우 이벤트 메시지 후킹 기법 (0) | 2024.02.06 |