序言
黑宝宝apk(在附件.rar中),他的签名验证是写在so里面的。拿到这个apk直接反编译重打包后安装到手机上,刚一运行程序就退出。那么我们就绕过在so中的签名验证吧~
用apktool解包apk后用IDA打开libJniTest.so
下面介绍两个窗口:
(1)Exports窗口是导出表(so中能让外部调用的函数)(2)Imports窗口是导入表(so调用到外面的函数)
通过分析java层知道程序调用了一个native层函数check, Exports窗口能列举出so中被外部调用的所有函数,所以打开导出表窗口.搜索check, so中的函数都是java包名类名方法名格式的,所以这里check函数就被找到了.
双击进去查看check方法,并按键盘f5将汇编转换成C语言,点击函数第一个参数int 右键Convert to struct* ,在弹出的框中选择_JNIEnv,点ok后,可以看到有一些函数已经显示出来了。
代码可读性很差,此时需要导入jni.h文件。点File->Load file->Parse C header file 找到jni.h(附件中)所在位置 ,点打开,此时显示Compilation successful 导入成功。
按tab或者点击回到汇编视图,然后按空格键转化为图形视图。通过图形视图可以对apk的整个逻辑一览无余,快捷键ctrl+鼠标滑轮可以缩小方法视图。
通过图形视图很清晰的可以看出,如果签名正确程序通过jnz指令跳到左视图程序继续执行,否则跳到右视图退出程序。
repe cmpsb指令解析https://blog.csdn.net/fulinus/article/details/8277442
JNZ,全称jump if not zero,汇编语言中的条件转移指令。结果不为零(或不相等)则转移。
JZ,相等则转移。
通过上面的分析,是把JNZ改成JZ,让程序在签名错误的情况下还能继续执行。鼠标选中JNZ按住空格键返回到汇编视图,修改so就是改16进制。
鼠标点住JNZ那行命令 View->Open subviews->Hex dump打开16进制编辑 ,0F85是JNZ的机器码,0F84是JZ的机器码,右键edit,右键apply。然后点击插件,应用patch。
改完后,回到图形视图。
下面就是用户名和密码的验证跳过了,同样的方法,jnz和jz互相改。
保存so,然后重打包,用AndroidKiller给apk进行签名,安装到手机上,程序正常运行。成功爆破签名验证。并且任意用户名和密码都可以登录成功。
参考链接
https://www.52pojie.cn/thread-732955-1-1.html
https://blog.csdn.net/fulinus/article/details/8277442
原文始发于微信公众号(华云安):车联网安全系列安卓漏挖之IDA爆破so中签名验证和登录验证
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论