【ipod4g出品】用 iPhone 修改及調試遊戲作弊版教程
【ipod4g出品】用 cygwin 修改 iPhone 遊戲作弊版教程
寫這教程主要是因爲
① iPhone 的 otool 及 as 工具不能處理 ARMv7 指令集
② 現在大部份的 iPhone 遊戲程序都是兼容 ARMv6 及 ARMv7 的通用程序 (Universal Binary)
初代 iPhone 使用 ARMv6 CPU 指令集, 直到3GS, iPad, IPhone 4設備蘋果開始採用了 ARMv7 CPU 指令集,
修改遊戲現在是必須要處理 ARMv7 指令集及處理兼容程序的簽名
這教程, 以 Inotia 3:Children of Carnia 艾迪諾亞3:卡尼亞的孩子們 爲例子作修改
Inotia 3 v1.0.1
(1) Mac 的編譯工具是 iOS SDK, 可在 developer.apple.com 下載
安裝 iOS SDK 後會在 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/
(2) 檢查 Inotia3 是否兼容程序
打指令
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -f Inotia3
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -h Inotia3
就會看到是兼容 ARMv6 及 ARMv7 的通用程序
- architecture 0
- cputype 12
- cpusubtype 6
- architecture 1
- cputype 12
- cpusubtype 9
引用/usr/include/mach/machine.h
#define CPU_TYPE_ARM ((cpu_type_t) 12)
#define CPU_SUBTYPE_ARM_V6 ((cpu_subtype_t) 6)
#define CPU_SUBTYPE_ARM_V7 ((cpu_subtype_t) 9)
(3) 要修改,首先要把 Inotia3 切開 (用 iPhone 的 lipo 也可以, 請看此帖)
把 Inotia3 切開爲 Inotia3.v6
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/lipo -thin armv6 Inotia3 -output Inotia3.v6
把 Inotia3 切開爲 Inotia3.v7
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/lipo -thin armv7 Inotia3 -output Inotia3.v7
(4) 反彙編 Inotia3.v6 及 Inotia3.v7
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -otV Inotia3.v6 > Inotia3.v6.txt
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -otV Inotia3.v7 > Inotia3.v7.txt
Inotia3.v6.txt.zip (4599 K) 下載次數:125
Inotia3.v7.txt.zip (4622 K) 下載次數:29
發現 Inotia3.v6.txt 是 32 bits 的指令及 Inotia3.v7.txt 是 32 bits 及 16 bits 的 thumb-2 混合指令
反彙編 ARMv7 也可用 IDA Pro Advanced v5.5
下載 : http://bbs.weiphone.com/read-htm-tid-363306.html
(5) 假設要先修改 Inotia3.v6
- 0003ccc0 e1a00005 mov r0, r5
由
mov r0, r5
修改爲
mov r0, r4
要找到ARM指令代碼, 用 vim 或 nano 建立 armv6test.s 如下
- .file "armv6test.s"
- .code 32
- _main:
- mov r0, r5
- mov r0, r4
彙編 arm 打
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/as -arch armv6 armv6test.s -o armv6test.o
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -tv armv6test.o
便看到
- armv6test.o:
- (__TEXT,__text) section
- _main:
- 00000000 e1a00005 mov r0, r5
- 00000004 e1a00004 mov r0, r4
(6) 假設要修改 Inotia3.v7
- 0002b022 4630 mov r0, r6
由
mov r0, r6
修改爲
mov r0, r4
要找到ARM指令代碼, 用 vim 或 nano 建立 armv7test.s 如下
- .file "armv7test.s"
- .thumb_func
- .code 16
- _main:
- mov r0, r6
- mov r0, r4
彙編 arm 打
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/as -arch armv7 armv7test.s -o armv7test.o
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -tv armv7test.o
便看到
- armv7test.o:
- (__TEXT,__text) section
- _main:
- 00000000 4630 mov r0, r6
- 00000002 4620 mov r0, r4
(7) 用 vbindiff 修改 Inotia3.v6 及 Inotia3.v7, 或 Mac 其他的 HexEdit / Hex Friend 也可以(用 iPhone 的 vbindiff 也可以)
留意: 修改程式的地址位置要減去十六進制0x1000, 例如 3CCC0 減去 1000 得到 3BCC0
修改 Inotia3.v6 地址 3BCC0 爲 04
修改 Inotia3.v7 地址 2A022 爲 20
vbindiff 可在這裏下載 http://www.cjmweb.net/vbindiff/
下載後, 編譯方法
- tar xzvf vbindiff-3.0_beta4.tar.gz
- cd vbindiff-3.0_beta4
- ./configure
- make && make install
(8) 修改後用 Mac ldid 簽名 (用 iPhone 的 ldid 也可以)
- export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate; ldid -s Inotia3.v6
- export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate; ldid -s Inotia3.v7
Mac 的 ldid 可在這裏下載
http://bbs.weiphone.com/read-htm-tid-429111.html
(9) 合併 Inotia3.v6 及 Inotia3.v7 爲兼容 ARMv6 及 ARMv7 的通用程序 (用 iPhone 的 lipo 也可以)
- /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/lipo -create Inotia3.v6 Inotia3.v7 -output Inotia3.patched
(10) 上傳 iPhone / iPad 真機作測試,可試試這個修改後的作弊版本,Inotia 3 賣東西有很多錢