前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

ipa游戏反编译 - moonvan - 博客园 少尉 嗯。 ipa游戏反编译 看不懂的请飘过,不要继续。这不是给新手看的,也代表你不需要解决程序的修改问题。这些技巧不只用于游戏的修改。下載 Windows 工具Windows : winscp http://winscp.net/eng/download.phpPuTTY http://putty.very.rulez.org/latest/x86/putty.exeMac / Linux :用內置的 Terminal 便可没 wifi 用 iPhone Tunnel Suite 3.0http://bbs.weiphone.com/read-htm-tid-597149.html苹果电脑用 iPhoneSSHhttp://bbs.weiphone.com/read-htm-tid-720564.htmliPhone/iPod Touch 在 cydia 內安裝 deb 包安装这些 deb 包最方便的方法是在 Cydia 内搜索及直接安装,这里提供的下载包及依赖包的链接下载点是方便手工安装时用OpenSSH (openssh) 及 OpenSSL(openssl) (与iPhone/iPod Touch 终端操作)http://apt.saurik.com/debs/openssh_5.2p1-8_iphoneos-arm.debhttp://apt.saurik.com/debs/openssl_0.9.8k-9_iphoneos-arm.debunzip 及 zip (解压缩及压缩打包工具)http://apt.saurik.com/debs/unzip_5.52-5_iphoneos-arm.debhttp://apt.saurik.com/debs/zip_2.32-5_iphoneos-arm.debvbindiff (iPhone 上的十六进制查看差异及修改器)http://apt.saurik.com/debs/vbindiff_3.0b1-3_iphoneos-arm.debLink Identity Editor (ldid) 及 Darwin CC Tools (odcctools)(修改后用 ldid 签名, odcctools 包括 otool, linker , assembler汇编)http://apt.saurik.com/debs/ldid_610-5_iphoneos-arm.debhttp://apt.saurik.com/debs/odcctools_286-8_iphoneos-arm.debhttp://apt.saurik.com/debs/uuid_1.6.0-2_iphoneos-arm.debDiff Utilities (diffutils) (文本差异工具 diff)http://apt.saurik.com/debs/diffutils_2.8.1-6_iphoneos-arm.debless (文本查看工具)http://apt.saurik.com/debs/less_418-3_iphoneos-arm.debVi IMproved (vim) 或 nano (文本编辑工具)http://apt.saurik.com/debs/vim_7.1-3_iphoneos-arm.debhttp://apt.saurik.com/debs/ncurses_5.7-9_iphoneos-arm.deb或http://apt.saurik.com/debs/nano_2.0.7-5_iphoneos-arm.debhttp://apt.saurik.com/debs/ncurses_5.7-9_iphoneos-arm.debGNU Debugger (gdb) (程序调试工具) iOS 4.3.x 更新http://apt.saurik.com/debs/gdb_1518-11_iphoneos-arm.debhttp://apt.saurik.com/debs/ncurses_5.7-9_iphoneos-arm.debhttp://apt.saurik.com/debs/readline_6.0-7_iphoneos-arm.debhttp://apt.saurik.com/debs/sqlite3_3.5.9-12_iphoneos-arm.debhttp://apt.saurik.com/debs/sqlite3-lib_3.5.9-2_iphoneos-arm.debhttp://apt.saurik.com/debs/sqlite3-dylib_3.5.9-1_iphoneos-arm.debGNU Debugger (gdb) (程序调试工具)http://apt.saurik.com/debs/gdb_962-5_iphoneos-arm.debhttp://apt.saurik.com/debs/ncurses_5.7-9_iphoneos-arm.debhttp://apt.saurik.com/debs/readline_6.0-7_iphoneos-arm.debhttp://apt.saurik.com/debs/sqlite3_3.5.9-12_iphoneos-arm.debhttp://apt.saurik.com/debs/sqlite3-lib_3.5.9-1_iphoneos-arm.debhttp://apt.saurik.com/debs/sqlite3-dylib_3.5.9-1_iphoneos-arm.debadv-cmds (ps 工具)http://apt.saurik.com/debs/adv-cmds_119-5_iphoneos-arm.debgrep (grep 文本搜索工具)http://apt.saurik.com/debs/grep_2.5.4-3_iphoneos-arm.debARM 参考书籍http://bbs.weiphone.com/read-htm-tid-363306.htmlARM指令集及使用方法ARM System Developer's Guide (主要是看第三章 Chapter 3)ARM Assembly Language Programming修改及用 gdb 调试游戏流程(1) 安装及试玩游戏,每个游戏的修改方法都不同,没有玩过这游戏,怎样知道要修改什么呢?这教程用了 Final Fantasy 2 作例子(2) 用 iTunes 安装 Final Fantasy 2 破解版本 (未破解的不能反汇编)(3) 用putty / ssh 连接iPhone / iPod Touch,假设你的iPhone / iPod Touch 的IP地址是192.168.1.104Connection type: 选 SSHPort 选 22按 Open PuTTY 连接 192.168.1.104 后Login 打 rootPassword(假设你没有更改密码) 打 alpineMac / Linux Terminal 内打ssh root@192.168.1.104(4) 进入游戏路径目录内(先决条件是已用 PuTTy / Terminal 连接iPhone / iPod Touch)打复制代码cd /var/mobile/Applications/*/FinalFantasy2.app(5) 到上一层路径目录建立 cheat 临时工作路径目录及游戏程式临时修改档打复制代码cd ..mkdir -p cheatcd cheatcp -p ../FinalFantasy2.app/FinalFantasy2 FinalFantasy2.original(6) 反汇编原游戏程式复制代码otool -tv FinalFantasy2.original > FinalFantasy2.original.txt(7) 查看反汇编代码分析并找出要修改的地方(每个游戏的修改地方都不同, 这点最难)要修改游戏,你会有以下的困难或问题:(i) 没有高阶源代码,只有反汇编代码 反汇编代码分析是困难的但绝对不是不可能作分析,你可以找到些不错的ARM Assembly的参考书 在上面亦已提供了一些很好的 ARM 指令参考 常见的是以下这些基本的指令及其执行条件码:MOV 或 MVN 寄存器数值的传送操作ADD 或 SUB 加减的算术操作CMP 或 CMN 比较操作AND、ORR、EOR 逻辑操作B、BL、BNE、BGE 分支/跳转指令MUL 乘法操作 或 LSL 是 二进制左移,左移一位,即十进制乘2倍LDR 或 STR 加载及存储数据每个指令都可加上执行条件码根据上一个运算、逻辑或比较指令的结果决定是否执行指令执行条件码 (Condition Codes):&#9312; CS 及 CC(Carry)进位条件码,CS=进位,否则=CC(不进位).&#9313; EQ 及 NE (Equal 或 Zero)相等或零条件码,EQ=运算结果为相等或零时,否则=NE(不相等).&#9314; VS 及 VC(Overflow)溢出条件码。 VS=溢出,否则=VC(不溢出)。&#9315; PL 及 MI 条件码。 PL(Plus/Positive)=结果为正,MI(Minus/Negative)=结果为负。&#9316; GT 及 LT 条件码。 GT(Greater Than)=大于(PL+VC+NE / MI+VS+NE),LT(Less Than)=小于(MI+VC / PL+VS)。&#9317; GE 及 LE 条件码。 GE(Greater Than or Equal)=大或等于(PL+VC / MI+VS),LE(Less Than or Equal)=小或等于(MI+VC / PL+VS / EQ)。&#9318; HI 及 LO 条件码。 HI(Higher Than)=无符号数(unsigned)高于(CS+NE),LO(Lower Than)=无符号数(unsigned)低于(CC)。&#9319; HS 及 LS 条件码。 HS(Higher or Same)=无符号数(unsigned)高于或相等(CS/EQ),LS(Lower or Same)=无符号数(unsigned)低于或相等(CC/EQ)。&#9320; AL 及 NV 条件码。 条件码默认为AL(Always)=无条件执行,NV(Never)是AL的相反=不执行。例子及其注解意思复制代码CMP R0, R1 @寄存器数值 R0 及 R1 的比较MOVGT R2, R0 @如果结果 R0 >(大于) R1,则执行MOV R2, R0即 R2=R0MOVLE R2, R1 @如果结果 R0 <=(小或等于) R1,则执行MOV R2, R1即 R2=R1复制代码LDR R1, [R0] @意思是 R1 = *R0,从R0指向的地址处的数据载入到寄存器 R1STR R1, [R0] @意思是 *R0 = R1,把寄存器 R1内的数据写到 R0 内指向的地址处ARM 指令集及使用方法(ii) 看不懂游戏程式流程,没法分析 有很多人都喜欢用 IDA Pro Advanced 去做分析, 无疑这软件是个非常好的静态分析工具,它有图形视图显示代码流程作搜索及深层分析。除了可分析反汇编代码外,亦可反汇编一些 otool 不能处理的工作。 但 IDA Pro Advanced 在iPhone 的程式只适合做静态的分析。你可以在这里下载 IDA Pro Advanced 5.2 及其参考书,建议你使用功能及视图比较强大的 Windows 版本。 http://bbs.weiphone.com/read-htm-tid-363306.html 只看代码是不能作分析,要配合动态调试去了解程式的细节在实际运行时发生的数据及变化。在第15步就有用 gdb 作动态调试的例子去设置断点、继续、跟踪及分析代码。gdb 的参考书可在上面的链接下载。(iii) 找不到游戏的数据例如金钱,经验值,装备,等级暂存在那?引用方法一:在 gdb 设置断点分析ARM CPU 有个特性便是一些加减计算要传送到CPU寄存器(register) 进行,因此你会经常看到这些要找的数据会先从内存用LDR 指令载入到寄存器, 经过一些计算(加或减)后及防溢位判断后便用STR 指令存储这寄存器回内存地址。另外由于这些程式大多是用 Objective C 或 C++ 语言写成,这些程序员会用一些描述性的函数名,例如带有 Money, Price, Gold, Exp, Item, Life, Level 字段等。利用这两点便可以将程序锁定在某些函数上,再利用 gdb 调试工具暂停在某些点一步一步地单步执行及查看一些寄存器,印证是否与你要找的数据是否有关。 在FinalFantasy2 的这实例中, 是用这方法找到修改点 用 less 工具去找寻 Money putty / Terminal 打复制代码less FinalFantasy2.original.txt 在 less 工具內打复制代码/Money 去开始找寻(按 N 键去继续找寻),便会找到这段代码像是要存储金钱数据(SetMoney),0007b218是进入这段代码的开始地址复制代码__ZN14cFF2GlobalWork19sysGAMEPrm_SetMoneyEj:0007b218 e59f300c ldr r3, [pc, #12] ; 0x7b22c0007b21c e580120c str r1, [r0, #524]0007b220 e1510003 cmp r1, r30007b224 8580320c strhi r3, [r0, #524]0007b228 e12fff1e bx lr 首先在iPhone或iPod Touch 开始Final Fantasy 2 直至游戏已 Resume及进入游戏。 &#9312; 在PuTTY / Terminal 找FinalFantasy2 的运行中的进程编号(process id) PuTTY / Terminal 打复制代码ps ax 得到复制代码1115 ?? Ss 1:30.86 /var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/FinalFantasy2.app/FinalFantasy2 找到FinalFantasy2 游戏现时运行中的进程编号是 1115 &#9313; 用gdb 进入调试运行中的进程编号1115 PuTTY / Terminal 打复制代码gdb -p 1115 此时游戏会暂停,音乐也暂停 &#9314; 用gdb 设定断点breakpoint在十六进制地址0x7b218 PuTTY / Terminal 打复制代码break *0x7b218 &#9315; 继续 continue 游戏 PuTTY / Terminal 打复制代码c &#9316; 将Final Fantasy 2 游戏进入战斗,战胜后游戏会在十六进制地址0x7b218处停止 &#9317; 暂停后,离开这分支__ZN14cFF2GlobalWork19sysGAMEPrm_SetMoneyEj PuTTY / Terminal 打复制代码finish &#9318; 反汇编现时地址上面的代码复制代码disassem $pc-28 $pc 得到复制代码0x0003baac <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG 180>: bl 0x78e30 <_ZN14cFF2GlobalWork8InstanceEv>0x0003bab0 <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG 184>: mov r4, r00x0003bab4 <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG 188>: bl 0x78e30 <_ZN14cFF2GlobalWork8InstanceEv>0x0003bab8 <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG 192>: bl 0x7b230 <_ZN14cFF2GlobalWork19sysGAMEPrm_GetMoneyEv>0x0003babc <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG 196>: add r1, r0, r50x0003bac0 <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG 200>: mov r0, r40x0003bac4 <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG 204>: bl 0x7b218 <_ZN14cFF2GlobalWork19sysGAMEPrm_SetMoneyEj> 这时会发现在_ZN14cFF2GlobalWork19sysGAMEPrm_GetMoneyEv及_ZN14cFF2GlobalWork19sysGAMEPrm_SetMoneyEj中间0x0003babc 地址的代码add r1, r0, r5 是最可疑的 &#9319; 取消断点1及设定新断点breakpoint在十六进制地址0x0003babc 及重新继续continue 游戏 PuTTY / Terminal 打复制代码disable 1break *0x3babcc 在iPhone或iPod Touch查看现时游戏的金钱例如是4888,将Final Fantasy 2 游戏进入战斗,战胜后游戏会新断点2地址0x3babc处停止 &#9320; 当游戏在新断点2暂停时查看寄存器就发现 r0 是当时的金钱余额及 r5 是战胜后得到的金钱 PuTTY / Terminal 打复制代码i r $r0 $r1 $r5 $pc &#9321; 假设已找到应修改的地址是 0003babc,便可继续下面第(8)步引用方法二:在 gdb 搜索内存数据值及设置观察点(watchpoint) 游戏的数据都会暂存在堆(heap)内存, 于游戏退出前储存在 iPhone 或 iPod Touch的闪存记忆体内, 一些经验值或金钱的数字是比较独特,在内存重复出现的机会不多,这些唯一的数字便可用这方法去进行搜索。 这里用了 Zenonia 2 v1.0 作例子,下面的游戏截图便看到用一个独特的经验值数字 672 去开始这方法 &#9312; 在 PuTTY / Terminal 用 ps ax 的指令找到 ZENONIA2 游戏现时运行中的进程编号是 1123 &#9313; 使用 gdb 进入运行中的进程编号 1123 PuTTY / Terminal 打复制代码gdb -p 1123 此时游戏会暂停,音乐也暂停 &#9314; 用 gdb 输入这些指令包括,内存开始地址(0x800000)、结束地址(0x880000)及要搜索的数字672如下: PuTTY / Terminal 打复制代码set $x=0x800000while(*++$x!=672 && $x<0x880000)end &#9315; 输入 end 之后等候数十秒 ....,待gdb去搜索这段内存地址 &#9316; gdb 搜索完毕后 PuTTY / Terminal 打复制代码p/x $x 得到复制代码$1 = 0x85e28c这代表 gdb 已找到在 0x85e28c 的内存地址的存储数字是 672 PuTTY / Terminal 打复制代码x/dw 0x85e28c 得到确认 0x85e28c 的内存地址的存储数字是 672复制代码0x85e28c: 672 &#9317; 用 gdb 继续搜索 PuTTY / Terminal 打 (或按方向键 &#8593; 4次,然后回车,免重复输入)复制代码while(*++$x!=672 && $x<0x880000)end 再等十多秒,gdb 搜索完毕后 PuTTY / Terminal 打复制代码p/x $x 得到复制代码$2 = 0x880000这代表 gdb 已到结束的地址 0x880000,都没有找到。这也表示数字 672 是唯一出现在 0x85e28c 要找的内存范围内。 &#9318; 用 gdb 更改内存地址 0x85e28c 的存储数字为 1000 PuTTY / Terminal 打复制代码set {int}0x85e28c=1000 PuTTY / Terminal 打复制代码x/dw 0x85e28c 得到确认已成功更改数字复制代码0x85e28c: 1000 &#9319; 继续 continue 游戏 PuTTY / Terminal 打复制代码c &#9320; 在回到游戏里退出 STATUS 画面再进入 STATUS,画面内数据重刷后,确认已成功更改经验值数字为1000 留意:由于游戏数据在堆(heap)内存的地址不是固定的,所以每次运行的进程都要再搜索新的内存地址。另外,搜索的内存地址范围也会改变,如果在 0x800000 至 0x880000 范围内找不到的话,就要往后试 0x880000 至 0x900000 新的范围。 另外:用相同搜索方法也可以找到金钱数字在这次运行进程是在内存地址 0x874c04 &#9321; 找到经验值地址后便可设置观察点(watchpoint)于内存地址 0x85e28c 设置观察点的目的是当内存地址值被读或被写时,会显示数据及暂停程序 PuTTY / Terminal 打复制代码watch *0x85e28c 及继续游戏 PuTTY / Terminal 打复制代码c留意:游戏在观察点(watchpoint) 生效下运行是非常的慢,有些游戏是不能正常运作,有时候手机也要重启,所以下面的步骤是不一定可以进行的 &#9322; 将游戏进入战斗打怪后程序便会暂停在 0x9f508 地址,gdb 会显示复制代码Hardware watchpoint 1: *8774284Old value = 1000New value = 10860x0009f508 in CMvPlayer::CheckLevelUp () PuTTY / Terminal 打复制代码x/14i $pc-16 得到复制代码0x9f4f8 <_ZN9CMvPlayer12CheckLevelUpEj+60>: b.n 0x9f508 <_ZN9CMvPlayer12CheckLevelUpEj+76>0x9f4fa <_ZN9CMvPlayer12CheckLevelUpEj+62>: adds r0, r4, #00x9f4fc <_ZN9CMvPlayer12CheckLevelUpEj+64>: movs r1, #10x9f4fe <_ZN9CMvPlayer12CheckLevelUpEj+66>: movs r2, #00x9f500 <_ZN9CMvPlayer12CheckLevelUpEj+68>: subs r5, r5, r30x9f502 <_ZN9CMvPlayer12CheckLevelUpEj+70>: bl 0x9f338 <_ZN9CMvPlayer9OnLevelUpEii>0x9f506 <_ZN9CMvPlayer12CheckLevelUpEj+74>: movs r3, #10x9f508 <_ZN9CMvPlayer12CheckLevelUpEj+76>: str r5, [r4, r6]0x9f50a <_ZN9CMvPlayer12CheckLevelUpEj+78>: cmp r3, #00x9f50c <_ZN9CMvPlayer12CheckLevelUpEj+80>: beq.n 0x9f516 <_ZN9CMvPlayer12CheckLevelUpEj+90>0x9f50e <_ZN9CMvPlayer12CheckLevelUpEj+82>: cmp r5, #00x9f510 <_ZN9CMvPlayer12CheckLevelUpEj+84>: beq.n 0x9f516 <_ZN9CMvPlayer12CheckLevelUpEj+90>0x9f512 <_ZN9CMvPlayer12CheckLevelUpEj+86>: movs r5, #00x9f514 <_ZN9CMvPlayer12CheckLevelUpEj+88>: b.n 0x9f4c6 <_ZN9CMvPlayer12CheckLevelUpEj+10> PuTTY / Terminal 打复制代码i r $r5 $r4 $r6 $pcp/x $r4+$r6 得到复制代码r5 0x43E 1086r4 0x85DC00 8772608r6 0x68c 1676pc 0x9f508 652552$5 = 0x85e28c 这时确认了 0x9f508 地址这句代码 str r5, [r4, r6] 的意思是,r4 + r6 = 0x85e28c ,把寄存器 r5 内的数字(1086) 写到 0x85e28c 的地址  程序因要写进这0x85e28c 的地址,所以暂停了,这就是观察点(watchpoint) 的强大功能。 PuTTY / Terminal 打复制代码bt 得到复制代码#0 0x0009f508 in CMvPlayer::CheckLevelUp ()#1 0x0009ff2e in CMvPlayer::DoUpdate ()#2 0x00094744 in CMvObject::Update ()#3 0x000969cc in CMvObjectMgr::Update ()#4 0x000662e6 in CMvGameState::UpdateGame () 这时就可根据上面得到的信息在这段代码的前后范围进行跟踪、设置断点及进一步的分析有新的方法时,再继续更新 ............(iv) 不知道修改点在那及改为什么?修改程序是不能插入程序代码,主要原因是移位后的程序是不能运行的。一般的做法是找到要修改的位置在原档案位置修改代码改为你需要的指令。 修改点一定要经过分析代码后再不断地用动态分析确定后,在适当的地方重覆试验及调试验证修改后的结果 。一些RPG游戏的特性,例如是金钱或经验值是会在战斗后重算及更新,一般都是要找到及修改更新数据前的指令。金钱的修改点也可以修改在买卖装备时的指令。连续升级的修改主要是看该游戏是怎样升级,例如 Inotia 2是根据经验值去升级,只要找到判断经验值的指令代码地址,修改其判断的指令便可。对于游戏来说,一般的指令修改例子如下:&#9312; 修改寄存器的增加数字例如 Final Fantasy II 增加战胜后所得金钱 地址 0003babc add r1, r0, r5 改为 add r1, r0, r5, lsl #5 &#9313; 修改寄存器减少的数字为零例如 Inotia 2 v 1.1.0 不扣技能点 地址 00021b9c sub r3, #1 改为 sub r3, #0 地址 00037b46 sub r1, #1 改为 sub r1, #0 &#9314; 修改比较的寄存器例如 花儿朵朵开-v1.0 不死作弊版 (这里 r2 寄存器是花朵已绽放的数量) 地址 00004ee8 cmp r2, r3 改为 cmp r2, #1 ; 0x1 &#9315; 修改arm 32 位为两个arm thumb 16 位代码例如 Inotia 2 v 1.1.0 roll点全18 地址 0005c404 bl 0x9914 改为 mov r0, #9 mov r0, #9 地址 0005c404, 0005c40e, 0005c41c, 0005c426 bl 0x9914 改为 mov r0, #9 mov r0, #9 &#9316; 要删除代码便要用 nop (no operation) 取代 thumb 16 bits nop 是 46c0 arm 32 bits nop 是 e1a00000(8) 在FinalFantasy2 的这实例中,假设已找到应修改的地址是 0003babc,代码是 e0801005复制代码0003bab8 eb00fddc bl 0x7b2300003babc e0801005 add r1, r0, r5 @意思是 r1 = r0 +r5 ; r0 是当时的金钱余额; r5 是战胜后得到的金钱0003bac0 e1a00004 mov r0, r40003bac4 eb00fdd3 bl 0x7b218 @分支到函数名 __ZN14cFF2GlobalWork19sysGAMEPrm_SetMoneyEj 去更新金錢余额(9) 修改目标 : 将所得金钱乘大32倍0003babc的应修改目标代码是复制代码add r1, r0, r5, lsl#5 @意思是 r1 = r0 +( r5 二进制左移五位,即十进制乘大32倍)(10) 找新ARM指令代码add r1, r0, r5 的ARM指令代码是 e0801005修改目标是要找到 add r1, r0, r5, lsl#5 的ARM指令代码 ?用 vim 或 nano 建立 armtest.s 如下复制代码 .file "armtest.s" .globl _main .code 32_main: add r1, r0, r5 add r1, r0, r5, lsl #5留意: 一些程式反汇编后是ARM Thumb, ARM Thumb 是16 bits 而ARM 是32 bits. ARM 32 bits 及 ARM Thumb 的分别请找上面 ARM Assembler 的参考(ARM Thumb 的可用指令是比 ARM 32 bits 少)。 如果要找 ARM Thumb 代码要将上面的.code 32改为.code 16 及加上 .thumb_func _main 如下复制代码 .code 16 .thumb_func _main汇编 arm 打复制代码as armtest.s -o armtest.o ; otool -tv armtest.o便看到复制代码(__TEXT,__text) section_main:00000000 e0801005 add r1, r0, r500000004 e0801285 add r1, r0, r5, lsl #5及得到add r1, r0, r5, lsl #5 目标ARM指令代码为 e0801285(11) 建立修改程式第一版FinalFantasy2.v1及用十六进制修改器修改代码打复制代码cp -p FinalFantasy2.original FinalFantasy2.v1 vbindiff FinalFantasy2.v1进入vibindiff 后按G及输入地址3AABC跳到要修改的位置如下 留意: 在第8步时找到的位置是0003Babc,但修改程式的位置要减去十六进制0x1000得到3Aabc(0x3babc 减 0x1000 等于 0x3aabc)按E键开始修改,将05 10 80 E0改为85 12 80 E0然后按Esc键及Y键确认修改最后按Q键离开 vbindiff 修改器如下 留意: 修改器显示的05 10 80 E0与反汇编的代码e0801005的位置顺序是倒的(12) 反汇编修改程式第一版 v1 及比较原版本 original打复制代码otool -tv FinalFantasy2.v1 > FinalFantasy2.v1.txtdiff FinalFantasy2.original.txt FinalFantasy2.v1.txt也可以用 otool -otV得到 复制代码< FinalFantasy2.original:---> FinalFantasy2.v1:59597c59597< 0003babc e0801005 add r1, r0, r5---> 0003babc e0801285 add r1, r0, r5, lsl #5(13) 对修改程式第一版重新签名打复制代码ldid -s FinalFantasy2.v1(14) 将签名后的程式放回程式路径进行测试首先备份原程式(留意:要用mv移动不要用cp)打复制代码mv ../FinalFantasy2.app/FinalFantasy2 ../FinalFantasy2.app/FinalFantasy2.bak安装修改后的程式及更新权限打复制代码cp -p FinalFantasy2.v1 ../FinalFantasy2.app/FinalFantasy2chown mobile:mobile ../FinalFantasy2.app/FinalFantasy2chmod 0755 ../FinalFantasy2.app/FinalFantasy2(15) 用 gdb 调试游戏调试是用 gdb,在这里的目的是设置断点使游戏暂停,查看CPU的寄存器,印证修改是否成功。由于游戏占用很多内存,在游戏运行时调试再加ssh 连接很多时候都会崩溃。所以用 iPod Touch 3代 或 iPhone 3GS 做这项工作会有优势。首先在iPhone或iPod Touch 开始Final Fantasy 2 直至游戏已Resume及进入游戏。在iPhone或iPod Touch查看现时游戏的金钱例如是 7223&#9312; 在putty / Terminal 找 FinalFantasy2 的运行中的进程编号 (process id)PuTTY / Terminal 打复制代码ps ax得到复制代码1115 ?? Ss 1:30.86 /var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/FinalFantasy2.app/FinalFantasy2找到 FinalFantasy2 游戏现时运行中的进程编号是 1115&#9313; 用 gdb 进入调试运行中的进程编号 1115PuTTY / Terminal 打复制代码gdb -p 1115此时游戏会暂停,音乐也暂停&#9314; 用 gdb 设定断点breakpoint在十六进制地址 0x3babc (即在第8步时找到的位置0003babc)PuTTY / Terminal 打复制代码break *0x3babc&#9315; 继续 continue 游戏PuTTY / Terminal 打复制代码c&#9316; 将Final Fantasy 2 游戏进入战斗,战胜后游戏会在十六进制地址 0x3babc处停止&#9317; 暂停后,查看 CPU 寄存器 register (info register 指令)PuTTY / Terminal 打复制代码i r $r0 $r1 $r5 $pc得到复制代码r0 0x1c37 7223r1 0x25 37r5 0x25 37pc 0x3babc 244412印证了 r0=7223 是现时的金钱游戏暂停在 pc=0x3babc&#9318; 查看下一步将要运行的反汇编指令PuTTY / Terminal 打复制代码x/i $pc得到 add r1, r0, r5, lsl #5,印证成功修改指令复制代码0x3babc <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG+196>: add r1, r0, r5, lsl #5&#9319; 运行下一步 stepi 指令PuTTY / Terminal 打复制代码si查看 CPU 寄存器 register (info register 指令)PuTTY / Terminal 打复制代码i r $r0 $r1 $r5 $pc得到复制代码r0 0x1c37 7223r1 0x20d7 8407r5 0x25 37pc 0x3bac0 244416此时印证了 r1 = r0 +( r5 x 32) = 7223 + (27 x 32) = 8407查看下一步将要运行的反汇编指令putty / Terminal 打复制代码x/i $pc得到复制代码0x3bac0 <_ZN10FF2cBattle12SENRIHIN_CHKEP12thBATMonsterP6X86REG+200>: mov r0, r4&#9320; 继续 continue 游戏PuTTY / Terminal 打复制代码c&#9321; Final Fantasy 2 游戏显示战胜后得到37的金钱,但实际金钱余额是 8407,印证修改游戏已成功。&#9322; 离开 gdb按下Ctrl+C 组合键停止执行进程PuTTY / Terminal 打复制代码quit及按 y 键确认离开 gdb留意:在上面第&#9317;步暂停时,你可以输入指令去更改CPU 寄存器 register例如打set $r5=1000去试试增加金钱数目(16) 假设已调试完成,便可将修改后的程式打包发布进入游戏路径目录内,打复制代码cd /var/mobile/Applications/*/FinalFantasy2.app到上一层路径目录复制代码cd ..建立 IPA 所要的路径及档案及删除不需要的备份档案复制代码rm -fr Payloadmkdir -p Payloadcp -pr FinalFantasy2.app Payload/rm -fr Payload/FinalFantasy2.app/FinalFantasy2*.bak打包 ipa 为 FinalFantasy2_v1.ipod4g.ipa复制代码zip -r FinalFantasy2_v1.ipod4g.ipa Payload iTunesArtwork找现时的路径复制代码pwd得到 复制代码/var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX用 winscp 或Terminal 的 scp 指令传送这档作发布复制代码/var/mobile/Applications/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/FinalFantasy2_v1.ipod4g.ipaXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 是随机路径(17) 其他有用的技巧&#9312; 由于修改游戏的程式代码是很少量, 相对重覆调试及动态分析工作比较多,此教程便介绍了用iPhone 的工具直接做修改及反汇编。这样对于少量修改程式代码及重覆在iPhone调试是比较要传回PC做修改是更有效率的。&#9313; 调试的工具 gdb 是比较难用,但有些方法是可提高使用 gdb 的效率。例如:在 gdb 建立宏 macro define在 iphone 建立这档案(~/.gdbinit) 内容为复制代码define ascii_charset $_c=*(unsigned char *)($arg0)if ( $_c < 0x20 || $_c > 0x7E )printf "."elseprintf "%c", $_cendenddocument ascii_charPrint the ASCII value of arg0 or '.' if value is unprintableenddefine hex_quadprintf "%02X %02X %02X %02X %02X %02X %02X %02X", \*(unsigned char*)($arg0), *(unsigned char*)($arg0 + 1), \*(unsigned char*)($arg0 + 2), *(unsigned char*)($arg0 + 3), \*(unsigned char*)($arg0 + 4), *(unsigned char*)($arg0 + 5), \*(unsigned char*)($arg0 + 6), *(unsigned char*)($arg0 + 7)enddocument hex_quadPrint eight hexadecimal bytes starting at arg0enddefine hexdumpprintf "%08X : ", $arg0hex_quad $arg0printf " - "hex_quad ($arg0+8)printf " "ascii_char ($arg0)ascii_char ($arg0+1)ascii_char ($arg0+2)ascii_char ($arg0+3)ascii_char ($arg0+4)ascii_char ($arg0+5)ascii_char ($arg0+6)ascii_char ($arg0+7)ascii_char ($arg0+8)ascii_char ($arg0+9)ascii_char ($arg0+0xA)ascii_char ($arg0+0xB)ascii_char ($arg0+0xC)ascii_char ($arg0+0xD)ascii_char ($arg0+0xE)ascii_char ($arg0+0xF)printf "\n"enddocument hexdumpDisplay a 16-byte hex/ASCII dump of arg0enddefine hexdump1hexdump $arg0x/8h $arg0printf "\n"disassem $arg0 $arg0+16printf "\n"enddocument hexdump1Display a 16-byte hex/ASCII dump and disassembly of arg0end在用 gdb 调试时打复制代码hexdump1 $pc便可列出$pc位置后十六位的内容及反汇编的代码&#9314; 在断点设定一些要自动运行的指令下面的意思是建立断点1及在断点1停止时运行查看一些暂存器(i r $r0 $r1 $r5 $pc)及反汇编下四个指令代码(x/4i $pc)复制代码break *0x3babccommands 1i r $r0 $r1 $r5 $pcx/4i $pcend&#9315; 在 gdb 断点暂停时,是可改变内存及指令FinalFantasy2 的例子,0x0003babc地址的指令是打复制代码x/i 0x0003babc得到代码是复制代码add r1, r0, r5打复制代码x/xw 0x0003babc得到代码数值是复制代码0xe0801005改变指令代码数值打复制代码set {int}0x0003babc = 0xe0801285检查改变后的指令打复制代码x/i 0x0003babc得到改变后的指令代码是复制代码add r1, r0, r5, lsl #5这样就不用离开 gdb 即时看到修改代码后的效果&#9316; gdb 执行到程序中其他地址的命令 例子: stepi 单步执行一个机器指令(命令步入函数) nexti 单步执行一个机器指令(命令步过函数) nexti 2 继续执行机器指令的数目为 2 个指令 finish 继续执行至当前函数结束后,停止于其调用点 until *0x7b224 继续执行至特定地址*0x7b224 jump *0x3baac 跳转至特定地址*0x3baac 执行&#9317; gdb 调试记录的命令 例子: set logging file ./log1.txt 设定记录档 set logging on 开始记录 set logging off 停止记录&#9318; 学习别人修改程序的方法 看别人修改程序是最好的学习方法,只要你有原版本及修改后的版本,就可以知道修改的地址及方法例如: 下载花儿朵朵开-v1.0.rar 原版本 下载花儿朵朵开-v1.0.rar 不死作弊修改版 解压后将两个 ipa 文件,用 winscp 传到iPhone 路径 /var/root/flower 内在 PuTTY / Terminal 连接iPhone / iPod Touch后 打 复制代码cd /var/root/flower解压原游戏版本程序 在 PuTTY / Terminal 打 复制代码unzip *-v1.0.ipamv Payload/FlowerChainCN.app/FlowerChainCN FlowerChainCN.original删除不需要的的路径及档案 在 PuTTY / Terminal 打 复制代码rm -fr Payload/ iTunesArtwork *.ipa解压不死作弊修改版程序 在 PuTTY / Terminal 打 复制代码unzip *-v1.0.ipod4g.ipamv Payload/FlowerChainCN.app/FlowerChainCN FlowerChainCN.patched删除不需要的的路径及档案 在 PuTTY / Terminal 打 复制代码rm -fr Payload/ iTunesArtwork *.ipa反汇编原游戏程式及保存反汇编文本文件为 FlowerChainCN.original.txt 在 PuTTY / Terminal 打 复制代码otool -tv FlowerChainCN.original > FlowerChainCN.original.txt反汇编不死作弊修改版程式及保存反汇编文本文件为 FlowerChainCN.patched.txt在 PuTTY / Terminal 打 复制代码otool -tv FlowerChainCN.patched > FlowerChainCN.patched.txt比较两个版本及找出差异 在 PuTTY / Terminal 打 复制代码diff FlowerChainCN.original.txt FlowerChainCN.patched.txt得到 复制代码< FlowerChainCN.original:---> FlowerChainCN.patched:3060c3060< 00004ee8 e1520003 cmp r2, r3---> 00004ee8 e3520001 cmp r2, #1 ; 0x1原版本列在左边及把差异列在右边并输出差异文本保存为 FlowerChainCN.diff.txt在 PuTTY / Terminal 打 复制代码diff -y --left-column FlowerChainCN.original.txt FlowerChainCN.patched.txt > FlowerChainCN.diff.txt用 less 工具打开差异文本 FlowerChainCN.diff.txt在 PuTTY / Terminal 打 复制代码less FlowerChainCN.diff.txt在 less 工具内搜寻差异分隔字符 |在 less 工具内打 复制代码/\|得到下面差异的显示去做进一步分析复制代码00004ee8 e1520003 cmp r2, r3 | 00004ee8 e3520001 cmp r2, #1 ; 0x1在 PuTTY / Terminal 打这句也可看到原版本上下的代码复制代码grep -C5 '|' FlowerChainCN.diff.txt或复制代码grep -C5 00004ee8 FlowerChainCN.original.txt&#9319; 最后送上我自购破解的一个很实用的iPhone小工具 - 64位计算器这小工具除了可以做64位的计算外,还可以输入文字及显示Unicode的代码64 Bit Calculator 64_Bit_Calc-v1.2.ipod4g.ipa (788 K) 下载次数:233 64 Bit Calculator (iPad) 64_Bit_Calc_iPad-v1.2.ipa (1521 K) 下载次数:116 关于 FinalFantasy2 1.0.4 版本 ldid 签名时出现错误信息 Segmentation fault初代 iPhone 使用ARMv6 指令集, 直到3GS, iPad, IPhone 4设备苹果开始采用了 ARMv7 指令集如果你打指令复制代码otool -f FinalFantasy2就会看到复制代码architecture 0 cputype 12 cpusubtype 6architecture 1 cputype 12 cpusubtype 9你可以把 FinalFantasy2 切开为 FinalFantasy2V6复制代码lipo -thin armv6 FinalFantasy2 -output FinalFantasy2V6chmod +x FinalFantasy2V6chown mobile:mobile FinalFantasy2V6及切开为 FinalFantasy2V7复制代码cp -p FinalFantasy2 FinalFantasy2tmpecho -ne "\x09" | dd bs=1 seek=15 conv=notrunc status=noxfer of=FinalFantasy2tmpecho -ne "\x06" | dd bs=1 seek=35 conv=notrunc status=noxfer of=FinalFantasy2tmplipo -thin armv6 FinalFantasy2tmp -output FinalFantasy2V7rm FinalFantasy2tmpchmod +x FinalFantasy2V7chown mobile:mobile FinalFantasy2V7但 iPhone 的 otool 不支持反汇编 ARMv7 指令集, 你要用新版本的 IDA Pro 反汇编在 iPhone 你只可以反汇编 FinalFantasy2V6, 修改及用 ldid 去签名FinalFantasy2V6 签名后便可替代原版本使用, 游戏来说ARMv6 指令集也可以, 只不过在新的设备上使用时不是最优化.其他教程【ipod4g出品】用 Mac 修改 iPhone 游戏作弊版教程【ipod4g出品】用 cygwin 修改 iPhone 游戏作弊版教程最终幻想 I 及 II 及其他游戏作弊版下载【ipod4g出品】『金钱作弊版』Final Fantasy l v1.0.0 最终幻想 l 网盘下载 【ipod4g出品】『32倍金钱作弊版』Final Fantasy II 最终幻想 II 补丁下载 【ipod4g出品】『不死作弊版』花儿朵朵开-v1.0【ipod4g出品】『200级作弊版』HYBRID: Eternal Whisper 永恒的低语 v1.2 网盘下载【ipod4g出品】『作弊版补丁』【艾诺迪亚 罗恩流浪者 v1.1.0】【ipod4g出品】『Zenonia 2 v1.0 更新金钱作弊版』RAY 网盘/本地下载 2.2.1固件可用【ipod4g出品】『模拟人生 3 v1.2.10 』金钱作弊版补丁【ipod4g出品】『模拟人生 3 世界冒险 1.0.0 金钱作弊版补丁』本地下载【ipod4g出品】『Doodle Jump 涂鸦跳跃 v1.17 作弊版』本地下载【ipod4g出品】『垂钓之王 Fishing Kings 1.0.0』金钱作弊版补丁我从来都不用91助手,不要问我关于91助手的问题.. posted on 2011-10-14 23:05 moonvan 阅读(...) 评论(...) 编辑 收藏 刷新评论刷新页面返回顶部 博客园首页博问新闻闪存程序员招聘知识库 导航 博客园 首页 新随笔 联系 订阅 管理 统计 随笔 - 317 文章 - 7 评论 - 64 引用 - 1 公告 Powered by: 博客园 Copyright &copy; moonvan