
재서명된 ipa를 위한 메모리 수정 도구로, 탈옥 없이 iPhone 및 Apple Silicon Mac에서 실행되는 iOS 앱을 지원합니다.
Ipa-medit은 탈옥 없이 재서명된 ipa를 위한 메모리 검색 및 패치 도구입니다. iPhone 및 Apple Silicon Mac에서 실행되는 iOS 앱을 지원합니다. 모바일 게임 보안 테스트를 위해 만들어졌습니다. 많은 모바일 게임에 탈옥 탐지 기능이 있지만, ipa-medit은 탈옥이 필요하지 않으므로 탈옥 탐지를 우회하지 않고도 메모리 수정이 가능합니다.
메모리 수정은 게임에서 치트를 하는 가장 쉬운 방법이며, 보안 테스트에서 확인해야 할 항목 중 하나입니다. GameGem 및 iGameGuardian처럼 간편하게 사용할 수 있는 치트 도구도 있습니다. 하지만 탈옥되지 않은 기기와 CUI, Apple Silicon Mac에서 사용할 수 있는 도구는 없었습니다. 그래서 보안 테스트 도구로 만들었습니다. Android 버전은 sterrasec/apk-medit입니다.
$ brew install --HEAD libplist
$ brew install --HEAD usbmuxd
$ brew install --HEAD libimobiledevice
$ brew install --HEAD ideviceinstaller
바이너리는 GitHub Releases에서 다운로드하여 $PATH에 넣으십시오.
make 명령어를 사용하여 빌드할 수 있습니다. 빌드하려면 Go 컴파일러가 필요합니다. Apple Silicon Mac에서 실행되는 iOS 앱을 대상으로 하는 경우 서명이 필요하지만, script/codesign.sh가 실행되어 자동으로 서명됩니다.
$ git clone [email protected]:sterrasec/ipa-medit.git
$ cd ipa-medit
$ make build
대상 .ipa 파일은 컴퓨터에 설치된 인증서로 서명되어 있어야 합니다. 타사 애플리케이션에서 메모리를 수정하려면 ipautil과 같은 도구를 사용하여 재서명하십시오.
$ ipautil decode tap1000000.ipa # unzip
$ ipautil build Payload # re-sign and generate .ipa file
실행하려면 .ipa 파일에 포함된 실행 파일 경로를 -bin으로, 번들 ID를 -id로 지정해야 합니다.
$ unzip tap1000000.ipa
$ ipa-medit -bin="./Payload/tap1000000.app/tap1000000" -id="jp.hoge.tap1000000"
실행하려면 프로세스 이름을 -name으로 또는 pid를 -pid로 지정해야 합니다. iOS 앱의 프로세스 이름과 pid는 활동 모니터에서 확인할 수 있습니다.
$ ipa-medit -name <process name>
대화형 프롬프트에서 사용 가능한 명령어는 다음과 같습니다.
메모리에서 지정된 정수를 검색합니다.
> find 999986
Success to halt process
Scanning: 0x00000001025e4000-0x00000001025e8000
Scanning: 0x00000001025f4000-0x00000001025fc000
Scanning: 0x0000000102604000-0x0000000102608000
....
Scanning: 0x000000016eb34000-0x000000016ebbc000
Scanning: 0x000000016ebc0000-0x000000016ebe8000
Scanning: 0x000000016ebec000-0x000000016ec74000
Scanning: 0x000000016ec78000-0x000000016ed00000
Found: 1!!
Address: 0x10a2feea0
기본적으로 iPhone에서 실행되는 iOS 앱을 대상으로 할 때는 LLDB API가 느리기 때문에 정수만 검색됩니다. Apple Silicon Mac에서 실행되는 iOS 앱을 대상으로 할 때는 문자열도 검색됩니다.
string, word, dword, qword와 같은 데이터 유형을 지정할 수도 있습니다.
> find dword 999994
Search Double Word...
Target Value: 999994([58 66 15 0])
Found: 1!!
Address: 0x11378aea0
이전 검색 결과와 일치하는 현재 검색 결과를 필터링합니다.
> filter 999842
Success to halt process
Found: 1!!
Address: 0x1087beea0
검색으로 찾은 주소에 지정된 값을 씁니다.
> patch 10
Successfully patched!
대상 프로세스에 연결합니다.
> attach
Success to halt process
연결된 프로세스에서 분리합니다.
> detach
Success to continue process
대상 프로세스에 대한 정보를 가져옵니다. iPhone에서 실행되는 iOS 앱을 대상으로 하는 경우에만 작동합니다.
> ps
SBProcess: pid = 926, state = running, threads = 37, executable = tap1000000
State: Running
thread #1: tid = 0x545ee, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, queue = 'com.apple.main-thread'
thread #3: tid = 0x54619, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #4: tid = 0x5461a, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #5: tid = 0x5461b, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #6: tid = 0x5461c, 0x00000001bd67a184 libsystem_kernel.dylib`__workq_kernreturn + 8
thread #7: tid = 0x5461d, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'com.apple.uikit.eventfetch-thread'
thread #8: tid = 0x5461e, 0x00000001bd6791ac libsystem_kernel.dylib`__psynch_cvwait + 8, name = 'GC Finalizer'
thread #9: tid = 0x5461f, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 0'
thread #10: tid = 0x54620, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 1'
thread #11: tid = 0x54621, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Job.Worker 2'
...
thread #35: tid = 0x54659, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'AURemoteIO::IOThread'
thread #36: tid = 0x54662, 0x00000001bd679814 libsystem_kernel.dylib`__semwait_signal + 8
thread #37: tid = 0x54663, 0x00000001bd6552d0 libsystem_kernel.dylib`mach_msg_trap + 8, name = 'com.apple.CoreMotion.MotionThread'
thread #38: tid = 0x54664, 0x00000001bd65530c libsystem_kernel.dylib`semaphore_wait_trap + 8, name = 'Loading.PreloadManager'
medit을 종료하려면 exit 명령어 또는 Ctrl-D를 사용하십시오.
> exit
Bye!
/private/var/containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/hoge.app: error: failed to get reply to handshake packet 오류가 발생하고 iOS 기기 및 lldb와 통신이 제대로 되지 않는 경우, Xcode를 실행하고 앱을 빌드하면 작동합니다.
Could not connect to lockdownd. 오류가 발생하고 iOS 기기 및 ideviceinstaller와 통신이 제대로 되지 않는 경우, Xcode를 실행하고 앱을 빌드하면 작동합니다. 이 방법으로 해결되지 않으면 Requirements 섹션의 명령어 예제를 사용하여 ideviceinstaller와 libimobiledevice를 최신 버전으로 업데이트하십시오.
이는 brew install 시 --HEAD 옵션을 추가하여 libimobiledevice와 ideviceinstaller의 최신 버전(버전 미지정 코드)을 설치하면 해결됩니다.
MIT 라이선스