「安卓逆向」去除某银行app签名校验

「安卓逆向」去除某银行app签名校验

首先,祝大家新年快乐!新的一年红红火火!

前段时间有个朋友联系到我 ,说有家安全公司招聘(哪家公司我就不说了) 但是面试题目第一题就难着了。这我哪儿能忍,直接干!

拿到app的时候我心凉了一下 ,这银行我搞个锤子,但是逆向工程师绝不认输!

直接重新签名安装 ,果然不出意外崩溃。

现在勒让我们捋捋思路,在程序一启动就崩溃,说明校验是存放在入口点或者入口页面的初始化函数里面。先掏出我们的逆向工具 jadx反编译一波,找到AndroidManifest.xml文件里面 我们知道入口点比入口页面执行的时机要早 ,直接先从入口点的onCreate()函数入手。


直接往下跟捋捋逻辑

Java层其实没啥东西,只要你思路清晰一眼就能看出来 ,这个onCreate()函数首先调用了一些super 然后注册了一些事件 ,下面我们看到了一句代码:

Init这又在初始化什么??? 过去看看:

System.loadLibrary加载了这个so库 ,上面还有个native关键词修饰的getSignatures();函数。

这就有点敏感了,心里已经10有8 9确定了签名校验在so层 ,然后这个init又调用了一个native_init函数 传入了一个context ,既然如此就去so看看:

So文件还是挺多的 直接拖出来 ,放进ida反编译一波。

找到节区分析,逆向分析思路一定得要清晰 ,先不慌搜索注册得函数,先看一波init跟init_array ,不清楚这部操作的小贴友们不要慌 ,推荐学习一下so文件的加载流程以及ELF文件结构 (可能下篇文章会详细讲到,不过市面上也有很多百度一波就行。看不懂就留言我抽空自己写一下以我理解的流程 ,嚼碎了给你)

言归正转,接着来:

没有东西 ,可以松口气了,要是再有东西就又多了几步了。

接着找到导出函数窗口搜索一波

采用了静态注册问题不大,来到这个函数

没啥操作直接调用了_Z8init_libP7_JNIEnvP8_jobject 这个函数初始化,跟进

又调用了_Z9check_appP7_JNIEnvP8_jobject函数 ,跟进

来到这个check_app函数里面

发现这里调用了这个get_sign这个函数,我们往上看他传入了那些参数,R0寄存器是R4传入的env ,R1寄存器就是R5传入的jobject,R2寄存器就是调用上面的函数的返回值。

这里先不看,现在分析到这里我们可以通过他的函数名称确定在这里get获取这个sign签名。

紧接着进行md5 sha系列的签名运算

我们也可以看一下他的运行流程

没有混淆就是为所欲为

找到了这个get_sign获取当前签名了就好办了,直接改这个调用就行,要是要改的干净一点可以从下面的判断入手,直接改nop指令你就得注意下面的寄存器相关的使用了,稍不注意就gg。

改好以后直接运行,完美!

好了这个就讲到这里了,听说月薪小20k ,流下了我月薪1800的泪水!

总结一下:现在安卓逆向安全行业的门槛还是挺低的,你品,你细品。这个银行如果加壳(当然了银行基本不会加壳) 就费时间了,还有就是对so文件的保护不够好,关键点很好定位,基本不用动态就能分析出来 ,混淆也没有,不过混淆也没啥用,对咱逆向安全工程师来说都问题不大!