TMAP 점수 25점 – Qwen / GPS Spoofing

1. TMAP 점수 테스트 실행 배경

. 지인들과 저녁 식사를 하는데 TMAP 이야기가 나왔습니다.
. 대부분 80~90점대인데, 한명만 60점대.
. 어떻게 60점대가? 물었더니 브레이크를 자주 밟아서 그런거 같다는 답변
. 그래서 궁금해졌습니다. 과연 TMAP은 어떤 요소를 볼까?

이런 상황

2. TMAP의 점수 영향 요건

. 운전 습관과 운전 환경이 영향을 줍니다.
. 습관 – 과속 / 급가속 / 급감속
. 환경 – 야간 운전.
. https://www.tmapmobility.com/story/drivetip/detail/37

3. Android에서 FakeGPS 구현

. Android는 Mock GPS 기능이 있습니다. (가상 좌표를 셋팅하는 기능)
. 그러나 TMAP은 Mock GPS를 감지하는 기능이 있습니다.
. 그래서 Android에서 FakeGPS라는 Daemon을 만들어서 기존 GPS 드라이버를 대체하고,
외부에서 GPS 좌표를 넣어줄 수 있게 했습니다.
. Python으로 Client를 만들어서, 두 좌표를 받으면 두 지점의 길을 라우팅해서 주기적으로 해당 좌표를 GPS 신호처럼 (NMEA) 보내줍니다.
. 두 지점의 라우팅을 할 때, 과속/급감속/급가속을 중간중간 넣어서 좌표 위치를 보정했습니다.
. 라우팅의 편의를 위해서 고속도로로 제한했습니다.
. SELINUX Rule 설정이 제일 귀찮았습니다. ;; 이건 한번에 딱 끝내기가 어렵네요..

flowchart TB
    A["두 좌표 입력
(Start / End)"] --> B["경로 보간
(Route Interpolation)"]

    B --> C["급감속/가속 적용
Speed Algorithm"]

    C --> D["NMEA 생성
(GPRMC / GPGGA)"]

    D -->|Telnet| E["FakeGPS 데몬\n전송 처리"]

    E --> F["GPS HAL
Injection"]

    F --> G["Location
Framework"]

    G --> H["TMAP
Navigation"]

type hal_gnss_fakegps, domain;
type hal_gnss_fakegps_exec, exec_type, file_type, vendor_file_type;
init_daemon_domain(hal_gnss_fakegps)
allow hal_gnss_fakegps mediaserver_exec:file { read open getattr execute };
allow hal_gnss_fakegps hwservicemanager:binder call;
type fakegps_helper, domain;
type fakegps_helper_exec, exec_type, vendor_file_type, file_type;                                                                                                      init_daemon_domain(fakegps_helper)                                                                                        net_domain(fakegps_helper)
allow fakegps_helper self:unix_dgram_socket { create write connect sendto getopt setopt };
allow fakegps_helper socket_device:sock_file { write read open };
allow fakegps_helper hal_gnss_default:unix_dgram_socket sendto;
service vendor.gnss-1-0-default /vendor/bin/hw/android.hardware.gnss@1.0-service.default
    class hal
    user gps
    group gps system inet
    socket fakegps dgram 0666 gps gps
    restart

4. 1차 테스트 결과

. 과속은 잘 되는데, 급감속/가속은 인식이 안되었습니다.
. 급감속은 여러 보정을 해서, 여유를 두었다는 이야기가 보였습니다.
. 그래서 linear 하게 속도를 급가속/감속을 하면 안되나 싶어서, 2차 곡선으로도 속도 변화량을 변경했지만 다 실패했습니다.

5. 2차 테스트

. TMAP의 설명은 급가속/감속은 여러 여유를 두었다는 설명이 있었습니다.
. 그만큼 인식이 되기 위해서는 이런 여유 – IF condition 안에 들어가게 gps 정보를 만들어야 했습니다.
. 아무리 해도 안되어서, TMAP Smali 코드를 보았지만, 정확한 위치를 찾기가 어려웠습니다.
. 여기서 VSCode Agent 사용 -QWEN coder 의 힘을 빌었습니다. 실제로는 multi-turn으로 했고, 그 프롬프트를 정리하면 아래와 같습니다. .
. 그러면 Smali를 분석해서, “짠”하고 조건을 알려 주면 좋은데. 사실 시간도 꽤 걸리고 몇몇 보정을 해줘야 합니다.
. 그래도 Smali를 눈/손으로 하려면 복잡한데 빠르게 잘 해줍니다.

분석을 시작하기 전에, 먼저 PowerShell에서 APK를 디컴파일해 주세요.

다음 명령을 그대로 실행하면 디컴파일 결과가 생성됩니다:

& java -jar "C:\Users\flywi\.apklab\apktool_2.12.1.jar" d -f `
    -o "C:\tmp\tmap\apk_out" `
    "C:\tmp\tmap\tmap.apk"

디컴파일이 완료되면 C:\tmp\tmap\apk_out 아래에 smali 파일들이 생성되는데,  
이제부터 진행하는 모든 검색(find), 문자열 탐색, 패턴 조회 역시  
PowerShell 명령을 사용해 주세요.

예를 들어, 아래와 같은 방식으로 검색할  있습니다:

# 속도/변화 관련 키워드 검색
Get-ChildItem -Recurse "C:\tmp\tmap\apk_out" -Filter *.smali |
    Select-String -Pattern "speed", "location", "change", "delta", "sudden"

# 비교/연산 패턴 검색
Get-ChildItem -Recurse "C:\tmp\tmap\apk_out" |
    Select-String -Pattern "if", "cmp", "sub", "acceler", "deceler", "sudden"

이런 식으로 PowerShell 검색 기능을 적극 활용해  
의심되는 함수들을 넓게 스캔하면서 분석을 진행해 주세요.

──────────────────────────────────────────
[분석 목표]
──────────────────────────────────────────
제가 알고 있는 정보는 아주 제한적입니다.  
정확한 함수명을 모르고, 다음  가지 사실만 알고 있습니다:

1) 속도 비교는 대략 3 간격(또는 그에 해당하는 이전 데이터) 기준으로 이루어진다.  
2) 속도 변화량이  30km/h 이상이면 급가속 또는 급감속으로 본다.

  단서를 기반으로,
APK 전체(smali/java)에서속도 변화량을 계산하거나 비교하는 모든 코드  
후보(candidate) 찾아 주세요.

──────────────────────────────────────────
[최종 결론 요청]
──────────────────────────────────────────
후보 함수들을 모두 비교한 ,

실제 급가속/급감속을 판단하는 핵심 함수는 무엇인지  
 함수를 선택한 구체적인 근거  
 함수가 전체적으로 어떤 방식으로 동작하는지 요약

  가지를 최종 결론으로 정리해 주세요.

6. 조건 확인 후 코드 수정 – 재테스트

주행 중에는 각 20회씩 급감속/가속을 했습니다. 그 결과 TMAP의 점수는 20점대로 하락. ㅎ
과속의 경우는 점수에 대한 영향은 작습니다. 아무리 과속을 해도 일정 점수 미만으로 낮아지지는 않습니다.
급가속의 경우도 영향은 있지만, 큰 영향은 없습니다.
그러나 급감속!!은 매우 영향이 큽니다. 아래와 같이 동일 횟수 수행 시 가속 대비 4~8배의 영향이 있습니다.
이렇게 엉망으로 운전했는데도 하위에 아직도 1%가 더 있다는 것에 매우 놀라움을.. 어떻게 하면 더 낮은 점수가 있을 수 있지?

7. 결론

실험을 통해 확인한 TMAP 점수 영향 요소
1. 급감속 – 최대 영향. 동일 횟수 기준 급가속 대비 4~8배 감점
2. 급가속 – 중간 영향. 감점은 있으나 제한적
3. 과속 – 영향은 있으나, 절대적이지는 않음.

인위적으로 만든 점수보다 더 낮은 점수의 1%가 존재한다는 점은 매우 흥미롭고 놀랍습니다.

TMAP이 보는 진짜 ‘안전 운전’

TMAP의 알고리즘을 보면, ‘급브레이크’를 밟지 않는 것입니다.
앞차와의 안전거리 확보, 예측운전 이것이 방어 운전을 잘 한다는 것이고 즉 안전운전의 핵심입니다.

이 글의 한계

이 글을 GPS 기반 점수를 기술적으로 이해하려고 한, 실험적 탐구 입니다.
실제 도로에서 재현은 매우 위험합니다.
APK 디컴파일은 개인적 목적으로 되었고, FAKE GPS를 통해 점수를 올리는 활동은 약관 위반입니다.

참고:
제101조의4(프로그램코드역분석) ① 정당한 권한에 의하여 프로그램을 이용하는 자 또는 그의 허락을 받은 자는 호환에 필요한 정보를 쉽게 얻을 수 없고 그 획득이 불가피한 경우에는 해당 프로그램의 호환에 필요한 부분에 한정하여 프로그램의 저작재산권자의 허락을 받지 아니하고 프로그램코드역분석을 할 수 있다. <개정 2023. 8. 8.>

② 제1항에 따른 프로그램코드역분석을 통하여 얻은 정보는 다음 각 호의 어느 하나에 해당하는 경우에는 이를 이용할 수 없다.

프로그램코드역분석의 대상이 되는 프로그램과 표현이 실질적으로 유사한 프로그램을 개발·제작·판매하거나 그 밖에 프로그램의 저작권을 침해하는 행위에 이용하는 경우

호환 목적 외의 다른 목적을 위하여 이용하거나 제3자에게 제공하는 경우