前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 IDA 破解某app的签名校验

使用 IDA 破解某app的签名校验

作者头像
用户2930595
发布2018-08-23 10:09:33
1.5K0
发布2018-08-23 10:09:33
举报

最近在分析某app的网络通信逻辑,其中的加密解密都在so中完成,且有签名校验,抠取so到写的demo中运行会crash。

好吧,使用IDA打开so,发现了签名校验逻辑:

checkApp(env, context) 

其中使用jni获取签名进行校验。

我把目标放到了这个函数上,通过上下文发现,只要让其返回固定的值就可以了。

为了观察SP的值变化,先把SP的值显示出来: Options -> General -> Disassembly -> Display disassembly line parts(右上角) -> Stack pointer(勾上)

现在看看破解前的汇编代码:

构建栈帧

从图中可以看出,栈深度因为一些push操作在增大。

销毁栈帧

对应的销毁是上述的逆向操作。

为了让这个函数直接返回固定的值,我决定将0x00007D46开始的指令替换为销毁栈帧的指令。

在IDA的Hex View-1中进行二进制的修改后,在进入f5页面,结果是:

checkApp(int a1, int a2,int a3,int a4,int a5)
{
  return a5;
}

ok,原来的校验逻辑没有了,但返回值不是固定的值。 将movs R0,R5 改成: movs R0,#0即可。

如何知道movs R0,#0是多少呢?

我对于二进制不熟悉,但是可以在现有的代码中找找,于是找到一处movs R2,#0的代码,试试将二进制的值适当调整一下,成功获取到movs R0,#0的二进制值。

  后来发现了一个不错的网站,可以做这个转化:http://armconverter.com/

修改后再使用IDA进入f5页面,结果是:

checkApp(int a1, int a2)
{
 return 0;
}

ok,得到要的结果了,将so放入自己的demo中,成功执行,不再crash。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.05.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档