本帖最后由 peterdocter 于 2015-2-4 11:03 编辑
.text:00000C40 EXPORT Java_com_ggndktest1_JniGg_VipLevel
.text:00000C40 Java_com_ggndktest1_JniGg_VipLevel
.text:00000C40 08 B5 PUSH {R3,LR}
.text:00000C42 02 2A CMP R2, #2
.text:00000C44 0C D0 BEQ loc_C60 ---->(1)
.text:00000C46 03 2A CMP R2, #3
.text:00000C48 04 D0 BEQ loc_C54 ---->(2)
.text:00000C4A 01 2A CMP R2, #1
.text:00000C4C 05 D1 BNE loc_C5A ---->(3)
.text:00000C4E 08 49 LDR R1, =(aGoldVip - 0xC54)
.text:00000C50 79 44 ADD R1, PC ; "Gold Vip"
.text:00000C52 07 E0 B loc_C64
.text:00000C54 ; ---------------------------------------------------------------------------
.text:00000C54
.text:00000C54 loc_C54 ; CODE XREF: Java_com_ggndktest1_JniGg_VipLevel+8j
.text:00000C54 07 49 LDR R1, =(aCopperVip - 0xC5A)
.text:00000C56 79 44 ADD R1, PC ; "Copper Vip"
.text:00000C58 04 E0 B loc_C64
.text:00000C5A ; ---------------------------------------------------------------------------
.text:00000C5A
.text:00000C5A loc_C5A ; CODE XREF: Java_com_ggndktest1_JniGg_VipLevel+Cj
.text:00000C5A 07 49 LDR R1, =(aNormalUser - 0xC60)
.text:00000C5C 79 44 ADD R1, PC ; "Normal User"
.text:00000C5E 01 E0 B loc_C64
.text:00000C60 ; ---------------------------------------------------------------------------
.text:00000C60
.text:00000C60 loc_C60 ; CODE XREF: Java_com_ggndktest1_JniGg_VipLevel+4j
.text:00000C60 06 49 LDR R1, =(aSilveryVip - 0xC66)
.text:00000C62 79 44 ADD R1, PC ; "Silvery Vip"
.text:00000C64
.text:00000C64 loc_C64 ; CODE XREF: Java_com_ggndktest1_JniGg_VipLevel+12j
.text:00000C64 ; Java_com_ggndktest1_JniGg_VipLevel+18j ...
.text:00000C64 02 68 LDR R2, [R0]
.text:00000C66 A7 23 9B 00 MOVS R3, #0x29C
.text:00000C6A D3 58 LDR R3, [R2,R3]
.text:00000C6C 98 47 BLX R3
.text:00000C6E 08 BD POP {R3,PC}
.text:00000C6E ; End of function Java_com_ggndktest1_JniGg_VipLevel
之前都在整理手册,很久没有操作过刀了。。。
从上面分析得到三个跳转,都不是目标地方。。。
一般方法都是nop掉。。。
想一下为什么不直接飞到想要到达的目标了。。。
不是有一个装B指令吗?:lol
由于太久没有玩,都不知道是否有理解错。。。
现在也不知道以前实战装B记录那里去,就重写一份随便来踢一下谷子的馆。。。;P
BEQ 或 BNE
这里修改成反指令是可以但是如果在一个正常app中就有这样的问题,你会发现注册户反而失败。。。:D
B Thumb指令修改:
This differs from the Thumb instruction, because the offset in the ARM instruction is shifted left by 2 before
being added to the PC, whereas the offset in the Thumb instruction is shifted left by 1. Also, the PC values
read by the ARM and Thumb instructions are different.
PC = PC + (SignExtend(signed_immed_11) << 1)
B 指令
B(2)
B <target_address>
111 0 0
补码:
1110 0000
0xE0
偏移量=(目标地址-当前地址-4) >>1
offset=(C4E-C44-4)/2
offset=6/2
offset=0x3
B offset
E0 03
机器码(最后高低对调)
03 E0
效果已经实现了
.text:00000C44 03 E0 B loc_C4E
指令类别区别:
同样以B指令来说明吧。。。
thumb:
.text:00000C58 04 E0 B loc_C64
Arm32:
.text:00000CD4 56 00 00 EA B loc_E34
本人比较喜欢让ida pro直接显示机器码出来,一看就知道当前是什么类别的指令。。。
定制ida pro
ida.cfg
OPCODE_BYTES = 6 // don't display instruction/data bytes
反汇编文本模式显示
GRAPH_OPCODE_BYTES = 6 // don't display instruction/data bytes
反汇编流程模式显示
如果不想显示就赋值为0
Allen大神给力补充
((((taregtAddr-fromAddr)-4)>>1)AND (7FF)) + E000
-4是 ARM流水线的问题
AND (7FF))为什么要and 7FF呢
这个就得问高通为什么这么规定了 记住就行了
这个公式屡试不爽 相当于葵花宝典了 你们赚到了
自己再补充一下:
不懂自己脑补
arm >>2
thumb >>1
|