ida动态调试_IDA反编译出错与汇编代码调试套路(上)

97824dbc55bb657f3631d7f93acc3a80.png

昨天搞喜马拉雅听书的签名算法,发现:

4ef2e21f8752253a1d8484034856b8c5.png

这句话明显反编译错误了啊,我们去jni.h看看,jni.h文件里面定义了JNI(Java Native Interface)所支持的类型与接口,搜索一下:

b3f78d22ce1443b0c1ba4a322dbc063c.png

参数表对不上啊,这可怎么办呢?只能看汇编了,按一下tab键:

8bb9a7f8a809b56cb4d8699d9671d1e5.png

从这里开始就是汇编代码,再按一下问号键:

e776f4da9797620316c02c89a26b6ec4.png

这样看起来更方便一点,我们先静态分析一下这些汇编代码:

.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的操作咱们下篇再见,今天写不动了,兄弟们,冲冲冲!

觉得好看的铁铁们可以关注一哈:

48bf2b1c54a136506434294280138b72.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值