昨天搞喜马拉雅听书的签名算法,发现:
这句话明显反编译错误了啊,我们去jni.h看看,jni.h文件里面定义了JNI(Java Native Interface)所支持的类型与接口,搜索一下:
参数表对不上啊,这可怎么办呢?只能看汇编了,按一下tab键:
从这里开始就是汇编代码,再按一下问号键:
这样看起来更方便一点,我们先静态分析一下这些汇编代码:
.text:00001314 MOVS R0, #0x320.text:00001318 LDR R1, [R5].text:0000131A LDR R4, [R1,R0].text:0000131C MOV R0, SP.text:0000131E STR R6, [R0,#0x58+var_58].text:00001320 MOVS R2, #0.text:00001322 MOVS R0, R5.text:00001324 LDR R1, [SP,#0x58+var_20].text:00001326 STR R2, [SP,#0x58+var_50].text:00001328 LDR R3, [SP,#0x58+var_28].text:0000132A BLX R4
我基本上把汇编忘得差不多了,所以有时候还要看Arm的手册来研究代码,手册下载地址(手册很重要,在搜索引擎搜很多东西都搜不到的):
https://developer.arm.com/docs/den0024/latest/preface
对照手册翻译汇编,第一句是把0x320放进R0寄存器,第二行LDR就是把R5的数据放进R1中,第三行再把地址位R1+R0的数据读入寄存器R4,第四行再把SP(堆栈寄存器)的地址给R0,也就是说目前R0里存的是栈的地址,第五行的STR指令,就是把R6的内容写入到[R0+0x58+var_58]这个地址内,接下来第六行简单了,就是把R2寄存器设成0,第七行就是把R5放进R0,第八行有点东西的,又是LDR,就是把[SP+#0x58+var_20]放进R1,第九行STR,就是把R2的内容写进[SP+#0x58+var_50]这里,第十行简单,又是LDR,就是把[SP+#0x58+var_28]放进R3,最后一行BLX,BLX指令=BL+BX,啥意思呢,BL就是带链接的跳转,首先将当前指令的下一条指令地址保存在LR寄存器,然后跳转。BX就是带状态切换的跳转,最低位为1时,切换到Thumb指令执行,为0时,解释为ARM指令执行。
终于看完了汇编代码,但是感觉更糊涂了,看完了更晕了,到底是啥意思啊?问题不大,咱们再用IDA动态调试一下SO就好了!调SO的操作咱们下篇再见,今天写不动了,兄弟们,冲冲冲!
觉得好看的铁铁们可以关注一哈: