android so 签名校验,安卓逆向-调用第三方so文件过签名效验

在逆向过程中经常会遇到各种加密,如果在java层还好说,大部分都是在so层,而且自定义的算法较多,加壳,混淆,这时候我们就可以尝试调用它们app的so文件,其中常见的手段就是签名验证,首先打开jadx-gui分析出java层加密调用so层方法

615cff5683bb?from=timeline

顺着找上去发现调用so文件

615cff5683bb?from=timeline

直接找到加载so文件的地方

615cff5683bb?from=timeline

将so文件copy到我们demo中开启一个http服务,直接调用下encyptString方法

615cff5683bb?from=timeline

615cff5683bb?from=timeline

615cff5683bb?from=timeline

发现并没有返回真正的加密结果,一定so层做逻辑效验了,我们找到这个so文件,使用ida打开,找到导出的函数

615cff5683bb?from=timeline

发现采用的方式是动态注册(静态注册是以java_包名_类名_方法名开头的,否则就是动态注册)动态注册会加载JNI_OnLoad 函数,我们进入这个函数

615cff5683bb?from=timeline

可视效果太差了,我们导入jni.h头文件(百度搜下载即可,简单的说就是java和c的翻译官),右键选择JNIEnv

615cff5683bb?from=timeline

发现代码瞬间清晰了很多

615cff5683bb?from=timeline

找到RegisterNative第3个参数0ff_7004就是我们导出的函数地址,我们进入这个函数,找到java层导出的函数地址sub_3DC4,因为so采用的是Thumb指令,所以要+1

615cff5683bb?from=timeline

跟进去,查看下思维导图

615cff5683bb?from=timeline

可以看代码执行的逻辑很简单无非就是一个判断,我们F5转换成伪C代码

615cff5683bb?from=timeline

发现ERROR_9304好眼熟啊

615cff5683bb?from=timeline

这正是我们demo返回的错误信息,由此可得出,if里面肯定就是正常逻辑了,else里面就是返回错误的逻辑,我们继续跟进sub_15C0

615cff5683bb?from=timeline

可以看到通过反射拿到当前app的签名和正确的签名做比较,如果不确实是否有签名验证,就直接打开字符串窗口Shift+F12,搜索"signatures",如果有就毋庸置疑了,我们并不关心他是怎样的逻辑,我们关心的只是他的返回值,直接找到返回值v4

615cff5683bb?from=timeline

615cff5683bb?from=timeline

可以看出如果v4等于0的时候那么肯定就是错误的逻辑,我们只需要让v4变量的初始化值为1或者直接修改返回值为1,这里我们采用第二种方式,回到汇编处

615cff5683bb?from=timeline

CMP R0,#0  这句话就是比较R0寄存器(sub_15C0的返回值)的值如果为0则跳转到BEQ对应的函数地址,我们直接将R0寄存器值改为1,其汇编就是CMP R0,#1,找到对应的16进制3DD8

615cff5683bb?from=timeline

使用010编辑器打开当前so文件,Ctrl+G跳转到该函数地址处,将00直接改成01,之后保存修改

615cff5683bb?from=timeline

再次打开so文件查看修改后的结果。

615cff5683bb?from=timeline

将修改后的so文件放到demo中请求,得到结果如下:

615cff5683bb?from=timeline

615cff5683bb?from=timeline

成功获取到结果

615cff5683bb?from=timeline

文章仅供学习交流,禁止一切商务用途。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值