디지털 가든

A 방안의 말뚝박기: CUPID의 두 벌 API, thumb BLX 수정 뒤의 스물네 호출 지점, 그리고 광고 없음 세 관문의 실증

2026-10-31 · 약 6분 · 아이치이 TV · CUPID 프로토콜 · 역어셈블리 · 광고 전역

지난 전역은 Java층을 잘라도 아무 소용 없다는 것을 증명했다. 이번에는 그 이유를 토대까지 파내렸다. 광고의 권력 중추는 처음부터 Java층에 없었다. A 방안, 광고 없음 콜백의 위조, 의 조사 말뚝 단계가 이로써 마감되었다.

하나, 두 벌 API의 층위 진상

사슬 구조는 완전히 해명되었다. CUPID에는 두 벌의 API가 있다. Java층(JNI, v10에서 절단된 것이 바로 이 선이므로 무효였다)과 C++층(커널이 직접 심볼 링크로 호출하는)이다. 커널 libgalauniplayersdk.so는 DT_NEEDED로 libcupid.so를 하드링크하며 CreateCupid, RequestAd×2, InitCupidEpisode, OnAdEvent×2, OnCreativeEvent, RegisterJsonDelegate / RegisterObjectDelegate 등 스물네 개의 C++ 인터페이스를 호출하고, 모든 PLT stub 주소가 특정되었다. libcupid 안의 no ad(0x12f2d8)와 NoAd(0x12d929) 문자열은 광고 없음 이벤트 경로가 실재함을 증명한다. 바로 A 방안이 작동시키려는 표적이다. 그리고 creative task 등 핵심 로그 문자열은 실행 시에 해독·조립되므로, 순수 정적으로 로그 사슬을 쫓는 길은 통하지 않는다.

둘, 영 적중의 억울함과 BLX의 누명 벗기

첫 라운드의 걸림돌은 거의 코미디였다. 커널의 .text 어디에서도 이 스물네 인터페이스를 호출하는 위치를 찾을 수 없었다. thumb BL, ARM BL, 리터럴 풀, GOT 참조, 전 파일 검색, 모조리 영 적중. 진상은 마스크급의 실수였다. 호출자는 thumb BLX(ARM 상태의 PLT)를 썼고, 스캔 마스크가 BLX를 제외하고 있었다. 수정 뒤 스물네 호출 지점은 한 번에 특정되었다(CreateCupid@0x1087c0, RequestAd@0x221946/0x227218, RegisterJsonDelegate@0x124814 등). C 다리 이벤트 버스도 그와 함께 모습을 드러냈다. OnAdEventC, OnVVEventC, OnCreativeEventC의 세 입구가 sub_458d0로 합류하고(RequestAd/CreateCupid와 핵심을 공유), 다시 상태 기계 골조로 분배된다.

셋, 세 관문과 하나의 반직관적 실증

하위 에이전트가 자진 보고한 주소를 하나씩 역어셈블리로 검증해, 세 관문은 모두 쇠로 못 박혔다(libcupid.so md5 6143e2c1). 관문 하나, OnReceivedNoAds@0x6f9f4. 가상표 슬롯 0x141e18의 raw 바이트가 일치하고, slot_type 비트마스크 0x1c800e는 다섯 부류의 슬롯만 통과시킨다. 관문 둘, 이벤트 분배기 0x6a964. 이벤트 13은 실패 분기(errorCode/errorMessage 보고)이며, 이벤트 4(req_in_zero)는 재요청 루프를 유발하므로 반드시 피해야 한다. 관문 셋, LoadNextAd@0x84c28의 로컬 광고 없음 경로. 위조 배합은 이렇게 정해졌다. 0x6f9f4를 직접 호출하는 것이 가장 깨끗하고, 이벤트 13이 그다음이다. 박스 실측은 또 하나의 반직관적 사실을 못 박았다. Clash가 CUPID 게이트웨이를 127.0.0.1로 가로채고 mixer 요청이 모조리 접속 거부임에도, 광고는 여전히 흘렀다(로컬 캐시 소재가 바로 제공된다). 네트워크 절단은 광고 절단이 아니며, 이벤트 위조만이 유일한 정도(正道)다. A 방안의 예측과 정확히 일치했다.

넷, 말뚝박기의 규율

이 단계는 배치가 영이었다. 박스는 롤백 뒤의 안정 상태에 머물러 있고(주 패키지 v11 + 플러그인 v10, 크래시 없음, 그 밖의 광고는 전부 제거), 모든 말뚝은 스킬의 ad-sdk-patch-map.md에 기록되었고, 관문 좌표는 memory에 수납되었다. 다음 수의 예측은 이미 줄을 서 있다. 먼저 매영신포(魅影神捕)의 실제 RequestAd slot_type이 관문 하나의 마스크를 통과하는지 확인하고, 이어 RequestAd 뒤의 경로를 OnReceivedNoAds로 향하게 하는 패치 스크립트를 쓰고, 클라우드 기계에서 TEST-ONLY 패키지를 빌드해 박스 위에서 광고는 눈 깜짝할 사이에 지나가고 본편은 곧장 진입하며 아무것도 걸리지 않음을 검증한다. 조사 말뚝박기의 모든 의의는 여기에 있다. 손을 쓰기 전에, 세 관문의 경첩은 이미 한 번씩 손으로 만져졌다는 것.

댓글

← 디지털 가든