先确定是ARM还是Thumb正如我们之前推断的在 ARM 架构的逆向中T 0x1代表当前段Segment运行在 Thumb 模式。T 0x0代表运行在 ARM 模式。目标函数addBoxAtIndextext:000A1CD0;S U B R O U T I N E.text:000A1CD0 .text:000A1CD0 .text:000A1CD0;_DWORD Playground::addBoxAtIndex(Playground *__hidden this, int).text:000A1CD0 EXPORT _ZN10Playground13addBoxAtIndexEi .text:000A1CD0 _ZN10Playground13addBoxAtIndexEi;CODE XREF: Playground::addBoxRandom(void)28↓p .text:000A1CD0;DATA XREF: LOAD:00002CB4↑o .text:000A1CD0;__unwind{.text:000A1CD0 PUSH{R3-R5,LR}.text:000A1CD2 MOVS R5, R1 .text:000A1CD4 MOVS R4, R0 .text:000A1CD6 BLX arc4random .text:000A1CDA MOVS R1,#7.text:000A1CDC BLX __aeabi_uidivmod .text:000A1CE0 SUBS R2, R1,#1.text:000A1CE2 NEGS R3, R2 .text:000A1CE4 ADCS R2, R3 .text:000A1CE6 MOVS R1, R5;int .text:000A1CE8 ADDS R2,#1 ; int.text:000A1CEA MOVS R0, R4;this .text:000A1CEC MOVS R3,#1 ; bool.text:000A1CEE BL _ZN10Playground22addBoxAtIndexWithLevelEiib;Playground::addBoxAtIndexWithLevel(int,int,bool).text:000A1CF2 POP{R3-R5,PC}.text:000A1CF2;End offunctionPlayground::addBoxAtIndex(int)F5 查看伪代码我们也可以hook addBoxAtIndexWithLevel 这个函数其实通过hook得知第三个参数是每次新增一个方块的数值固定为2感兴趣的可以自己去hook下证伪那么其实我是不太懂汇编语言的 这里让cc帮我理解下基本的语法这些都是存值的 主要看参数寄存器对吧他是可以传递的比如R1 R2 R3_ZN10Playground22addBoxAtIndexWithLevelEiib 刚好呢对应他的三个入参我们知道 三个入参关键点再看看 这些关键字注意看这里ADDS R2, #1 ; intcc解释下就是 R2 R2 1把R2这个储物格里的值加1。#1 表示常量数字1# 开头就是直接写死的数字。后面的 ; int 是IDA自动加的注释说明这个值的类型是int不是汇编指令的一部分。注意看这里MOV为赋值指令MOV R2, #8 ; intcc解释下在2048的场景里如果这个R2是方块的数值改成 MOV R2, #8 就意味着不管原来要生成什么方块强制变成8也就是2的8次方 256那个方块。因为我们通过hook得知 R2值才是每次新增的那个滑块值所以我们直接改成固定值不就好了。手动修改汇编https://armconverter.com/?codemovR2,%238选择Thumb结果4FF00802复制地址A1CE8打开WinHex工具导入so文件后修改对齐左键点一下offset区域找到偏移ALTGCtrl S 保存IDAPro查下修改内容修改成功然后呢打包呗先签名 直接拖进去替换签名java -jar signapk.jar platform.x509.pem platform.pk8 .\2048.apk .\app-debug-sign2048.apk安装adb install .\app-debug-sign2048.apkPerforming Streamed InstallSuccess看看效果来❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀太溜了 这部得分分钟闯关成功啊 撒花❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀以下为CC给出的汇编手册用最简单的方式解释寄存器就是CPU里的临时储物格ARM有R0-R12等用来临时存数据寄存器约定用途R0函数第1个参数 / 返回值R1函数第2个参数R2函数第3个参数R3函数第4个参数R4-R11临时变量LR记录从哪里来的用于返回PC当前执行到哪一行SP栈指针常见指令指令意思PUSH把寄存器压入栈保存相当于先放一边POP从栈取回来相当于拿回来用MOV/MOVS赋值R0 R1ADD/ADDS加法LDR从内存读数据到寄存器相当于取值STR把寄存器写入内存相当于存值CMP比较两个值大小BEQ如果相等就跳转if gotoBNE如果不相等就跳转if ! gotoB无条件跳转gotoBL跳转并调用函数会记录返回地址BLX同BL但可以切换ARM/Thumb模式简单说LDR是取值STR是存值BL是调函数CMPB是if判断掌握这几个看大部分汇编就够了。
IDA pro 2048 直接满分
先确定是ARM还是Thumb正如我们之前推断的在 ARM 架构的逆向中T 0x1代表当前段Segment运行在 Thumb 模式。T 0x0代表运行在 ARM 模式。目标函数addBoxAtIndextext:000A1CD0;S U B R O U T I N E.text:000A1CD0 .text:000A1CD0 .text:000A1CD0;_DWORD Playground::addBoxAtIndex(Playground *__hidden this, int).text:000A1CD0 EXPORT _ZN10Playground13addBoxAtIndexEi .text:000A1CD0 _ZN10Playground13addBoxAtIndexEi;CODE XREF: Playground::addBoxRandom(void)28↓p .text:000A1CD0;DATA XREF: LOAD:00002CB4↑o .text:000A1CD0;__unwind{.text:000A1CD0 PUSH{R3-R5,LR}.text:000A1CD2 MOVS R5, R1 .text:000A1CD4 MOVS R4, R0 .text:000A1CD6 BLX arc4random .text:000A1CDA MOVS R1,#7.text:000A1CDC BLX __aeabi_uidivmod .text:000A1CE0 SUBS R2, R1,#1.text:000A1CE2 NEGS R3, R2 .text:000A1CE4 ADCS R2, R3 .text:000A1CE6 MOVS R1, R5;int .text:000A1CE8 ADDS R2,#1 ; int.text:000A1CEA MOVS R0, R4;this .text:000A1CEC MOVS R3,#1 ; bool.text:000A1CEE BL _ZN10Playground22addBoxAtIndexWithLevelEiib;Playground::addBoxAtIndexWithLevel(int,int,bool).text:000A1CF2 POP{R3-R5,PC}.text:000A1CF2;End offunctionPlayground::addBoxAtIndex(int)F5 查看伪代码我们也可以hook addBoxAtIndexWithLevel 这个函数其实通过hook得知第三个参数是每次新增一个方块的数值固定为2感兴趣的可以自己去hook下证伪那么其实我是不太懂汇编语言的 这里让cc帮我理解下基本的语法这些都是存值的 主要看参数寄存器对吧他是可以传递的比如R1 R2 R3_ZN10Playground22addBoxAtIndexWithLevelEiib 刚好呢对应他的三个入参我们知道 三个入参关键点再看看 这些关键字注意看这里ADDS R2, #1 ; intcc解释下就是 R2 R2 1把R2这个储物格里的值加1。#1 表示常量数字1# 开头就是直接写死的数字。后面的 ; int 是IDA自动加的注释说明这个值的类型是int不是汇编指令的一部分。注意看这里MOV为赋值指令MOV R2, #8 ; intcc解释下在2048的场景里如果这个R2是方块的数值改成 MOV R2, #8 就意味着不管原来要生成什么方块强制变成8也就是2的8次方 256那个方块。因为我们通过hook得知 R2值才是每次新增的那个滑块值所以我们直接改成固定值不就好了。手动修改汇编https://armconverter.com/?codemovR2,%238选择Thumb结果4FF00802复制地址A1CE8打开WinHex工具导入so文件后修改对齐左键点一下offset区域找到偏移ALTGCtrl S 保存IDAPro查下修改内容修改成功然后呢打包呗先签名 直接拖进去替换签名java -jar signapk.jar platform.x509.pem platform.pk8 .\2048.apk .\app-debug-sign2048.apk安装adb install .\app-debug-sign2048.apkPerforming Streamed InstallSuccess看看效果来❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀太溜了 这部得分分钟闯关成功啊 撒花❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀以下为CC给出的汇编手册用最简单的方式解释寄存器就是CPU里的临时储物格ARM有R0-R12等用来临时存数据寄存器约定用途R0函数第1个参数 / 返回值R1函数第2个参数R2函数第3个参数R3函数第4个参数R4-R11临时变量LR记录从哪里来的用于返回PC当前执行到哪一行SP栈指针常见指令指令意思PUSH把寄存器压入栈保存相当于先放一边POP从栈取回来相当于拿回来用MOV/MOVS赋值R0 R1ADD/ADDS加法LDR从内存读数据到寄存器相当于取值STR把寄存器写入内存相当于存值CMP比较两个值大小BEQ如果相等就跳转if gotoBNE如果不相等就跳转if ! gotoB无条件跳转gotoBL跳转并调用函数会记录返回地址BLX同BL但可以切换ARM/Thumb模式简单说LDR是取值STR是存值BL是调函数CMPB是if判断掌握这几个看大部分汇编就够了。