![4b580ae694cda6dcceae1429269d037e.png](https://i-blog.csdnimg.cn/blog_migrate/5b923acf76f540b5d010d4671e71ff4e.jpeg)
当app进行反编译后修改,再回编译,若出现闪退的情况时,则有可能是由于程序本身已存在签名验证,才会出现闪退,今天分享如何解决因签名验证而出现的闪退现象。
1阅读签名验证源码
1.打开文件
![d6bd0667bd05bd3e93c0f1b0df1cd31c.png](https://i-blog.csdnimg.cn/blog_migrate/b81c074c2e3ee3c366e4dc070f8d8e27.jpeg)
2.分析Java层,在调用init这个方法里面,是进行按钮以及其他控件的初始化
![ac7d796c20f9e57d17d05e9ac0402590.png](https://i-blog.csdnimg.cn/blog_migrate/bb99b1749f49f86b9d889cc91b49e9c8.jpeg)
3.接下来是一个注册函数,判断用户名和密码是否相等,从而弹出不同的提示
![3f90725ade2dd576c9b68e3f80a6837c.png](https://i-blog.csdnimg.cn/blog_migrate/1a8eda23929cb4b01af02c0ce893e8b1.jpeg)
4.LoginActivity类继承了BaseActivity,先分析BaseActivity这个类
![6636e95b5e8bb7c428f30652b149b4a8.png](https://i-blog.csdnimg.cn/blog_migrate/08ee118ffa1d56266aebf177affa4077.jpeg)
5.分析onCreate方法里面的getSignature方法,该方法需要传入参数包名,根据包名获取签名信息,做出判断
![3a95487f991c1dc938897106214c8308.png](https://i-blog.csdnimg.cn/blog_migrate/47ba0b4fcf8a892421545664cb583f45.jpeg)
6.完成上述操作后,开始获取签名信息
![da1c33c557ac5ca772f8c5ae46dd9487.png](https://i-blog.csdnimg.cn/blog_migrate/483ebedacfa741c04b480f0b38674477.jpeg)
7.接着分析getSignature方法,首先,获取一个包管理
![d69fd3268453e3169fa309700cd2f251.png](https://i-blog.csdnimg.cn/blog_migrate/7e56bfa0b9a056408bed29951537c431.jpeg)
8.获取包管理后,将包名以及其他两个参数传进来
![0305571432456619480eb22fd4b7ff94.png](https://i-blog.csdnimg.cn/blog_migrate/0d82e3cefef3e3debf0994ef9833b5f7.jpeg)
9.接下来,获取当前签名信息的途径,就是获取包管理等的操作
![4068755cf517d7cd8429cbdf14f4bda5.png](https://i-blog.csdnimg.cn/blog_migrate/76e88fa70a14e961cc8302efb2deddfe.jpeg)
10.通过字符串定位,移动到这个类
![6ec8eaedc0d82a2a87b144c9002f69a1.png](https://i-blog.csdnimg.cn/blog_migrate/a1cd3da86a2fd1a157222402ddc203f2.jpeg)
11.找到类后,开始获取签名
![20f738a471110029b3e8ca4a30a8e2c6.png](https://i-blog.csdnimg.cn/blog_migrate/d8b6c1aceeb3f33ebd35b5bb26647627.jpeg)
12.获取签名时,会发现下面还有一个isOwnapp方法,进行一个是否相等的判断
![2d4395dd8efb5bd4bc6b764bcfe23a53.png](https://i-blog.csdnimg.cn/blog_migrate/624cda17d07cab248f6fe8cdd554260d.jpeg)
13.判断过后,来到这个类
![2a28dea966cda0025beb5d7e83783eb4.png](https://i-blog.csdnimg.cn/blog_migrate/3ca4b17eb7f97ec56c49247795179b41.jpeg)
14.调用isOwnApp方法,对返回值进行判断,条件满足就killProcess,杀死进程
![8c89871b606fe484583bf8e9a63bdfa0.png](https://i-blog.csdnimg.cn/blog_migrate/0bda6359d7ca21824fdb5454fc9806e0.jpeg)
2实战分析及过掉签名校验
以霸哥磁力为例。
1.安装程序霸哥磁力,直接拖进雷电模拟器,打开程序
![b0262bcd8af86af4426dbdee7c62bf6b.png](https://i-blog.csdnimg.cn/blog_migrate/b23011f2ebdd28b70c1065735055d9ba.jpeg)
2.打开androidkiller,对程序进行重新签名,工具位置
![5a3190b90b8faf3922cd92ff2c73395e.png](https://i-blog.csdnimg.cn/blog_migrate/9349982b1ae914621e881095fe7d84eb.jpeg)
3.重新签名过后,再次拖入,点击执行
![4798c0fad872a664840c0ba6107fb359.png](https://i-blog.csdnimg.cn/blog_migrate/53806cff2ab9e436d913f87fe7ab0f7c.jpeg)
4.将原有程序卸载,安装签名后的程序
![fcd102eecf4fa6517395b79a125d53e2.png](https://i-blog.csdnimg.cn/blog_migrate/bcd599fc01292ccb1e962d33a22c520c.jpeg)
5.安装完成,运行程序,提示:很抱歉,“霸哥磁力搜索”已停止运行
![6f5bed87ac4fc35e07330c3050d532b1.png](https://i-blog.csdnimg.cn/blog_migrate/87f596767907d7958f30aa0dbfd5469f.jpeg)
6.这里继续分析,首先将原版程序拖到androidkiller中进行反编译
![1ea143e01b22a7d1675e7be763eb17fc.png](https://i-blog.csdnimg.cn/blog_migrate/0f9f2d0dd948b1ba0ca86237d54dd887.jpeg)
7.反编译完成后,判断程序崩溃在打开程序时,说明检测签名校验的逻辑会在这种执行时间比较早的地方,先从启动界面开始查看
![c86724536f1a479913267460617b4981.png](https://i-blog.csdnimg.cn/blog_migrate/bdb90061e246f92f99cef56792cde3e9.jpeg)
8.找到Oncreate方法,直接从Oncreate方法开始分析,然后点击咖啡图标,查看Java代码
![bd6c07fd2f1398b0e297dec52262bf7a.png](https://i-blog.csdnimg.cn/blog_migrate/0920311f68533d9f2c0aae432e46fd8b.jpeg)
9.找到Oncreate方法和onclick方法
![8a875e5e631243c52a3a56e9972f6ba0.png](https://i-blog.csdnimg.cn/blog_migrate/09ae16d3b3e1d6ffa75597043f089538.jpeg)
10.一开始调用了函数:qian
![1f9c2e6600fd98b7fb5fad75a29315d6.png](https://i-blog.csdnimg.cn/blog_migrate/a00d98fc9e8b6d7435dcd7be1abfce72.jpeg)
11.点击该函数,获取包名管理,再进行签名,然后hash
![9c13714af05283f66f10df4327b54b75.png](https://i-blog.csdnimg.cn/blog_migrate/29cbbd917368b043f81386dba9b78a1a.jpeg)
12.如果这里不等于,会出现一个弹窗。继续分析,发现这里只是进行简单的判断就返回了,所以并不会杀死程序
![29f566c42afee8f1e2c13a0c112f07b6.png](https://i-blog.csdnimg.cn/blog_migrate/2a28f965d1be7cea252e28ff532dc601.jpeg)
13.继续查看onclick函数,发现在它下面还存在一个方法,是将bug函数返回值给eee,判断是否相等,然后弹窗
![842a7c8937006a3eaf7cc770788fe0ba.png](https://i-blog.csdnimg.cn/blog_migrate/dec768839e4ffece78e4c69f5df97f0b.jpeg)
14.分析这个bug,在oncCreate里面,只有一个qian方法,然后是点击该方法,最后是bug,继续点击进来,发现是native,上面是so库的加载
![d0d6c901b3417649f3ef4ae48302819b.png](https://i-blog.csdnimg.cn/blog_migrate/9d5d8342817fb92e1cd2e684f4932420.png)
15.解压文件,将so文件拖入IDA,发现没有JNI_onload,只有以Java_开头的一个文件
![df57e919277b7162d6c6c9888ec1b6f1.png](https://i-blog.csdnimg.cn/blog_migrate/70c67690ef4ed425924b01e3d904b8b5.jpeg)
16.双击进入,简单分析。先压栈,然后move传参,然后调用getSignHashCode
![0ab457c91c0765bc4ce68e61549aacb9.png](https://i-blog.csdnimg.cn/blog_migrate/814f4f2f2844d37c4d9a15f0958f875d.jpeg)
17.点击进入,发现签名三兄弟
![b2d9f090c7a74fd9239241d7c7274bec.png](https://i-blog.csdnimg.cn/blog_migrate/d62cbf9c15b0b41210956fc9dc366c49.jpeg)
18.继续往下分析sinatureHashcode,从字符串中可以看出来,这些一块一块函数的调用,按快捷键F5,查看伪代码,查看具体参数
![559109b52e88dc0493a01bf2cef83734.png](https://i-blog.csdnimg.cn/blog_migrate/e2da9191e2204f6be9c4d4c99c1ff437.jpeg)
19.回到上一层,只传了一个R0,那么这里就是env
![5ccc0d6acb49946ead0a953b70114007.png](https://i-blog.csdnimg.cn/blog_migrate/3506f49816756149117a1c93ec4d87a9.jpeg)
20.第二个参数没有被static修饰,那就是obj
![db5b07629654d20b4d06dad35f3ce392.png](https://i-blog.csdnimg.cn/blog_migrate/aa4b20dc84c6c26fd8a18b6833bfe5fd.jpeg)
21.将参数类型分别修改为JNIEnv *a1,jobject a2
![6d92ba3afeee3ba611633b62f2c795e6.png](https://i-blog.csdnimg.cn/blog_migrate/3329ab53f5f7e8be6c4729a9b98d9acd.jpeg)
22.隐藏类型
![deea976eb9bb13fe0e0987cf6fdf83e4.png](https://i-blog.csdnimg.cn/blog_migrate/c93614534c78f70eb4350bee57658b77.jpeg)
23.调用各种方法,若返回值与下图不相符,则直接exit退出
![fbe2cf77635e5afaeb9e311865f197f8.png](https://i-blog.csdnimg.cn/blog_migrate/7aa7eb045a58131f10cb5061469d0c7e.jpeg)
通过一个案例,从java到so层,先分析动态注册和静态分册,再找到逻辑代码,找有签名三兄弟的函数,找到后分析这个函数的引用,进而可以采取手段过掉签名验证。上面的apk和安卓逆向工具包有需要的可以加v:13140310004获取,自己也可以尝试动手分析一下,掌握原理,遇上别的apk也能过掉签名