您的位置首页  散文精选

快来看sha1校验工具(sha1校验怎么做)

​将APK重命名为zip文件,然后可以看到有个META-INF的文件夹,里面有三个文件,分别名为MANIFEST.MF、CERT.SF和CERT.RSA,这些就是使用signapk.jar生成的签名文件。

快来看sha1校验工具(sha1校验怎么做)

 

0x01 Android签名机制将APK重命名为zip文件,然后可以看到有个META-INF的文件夹,里面有三个文件,分别名为MANIFEST.MF、CERT.SF和CERT.RSA,这些就是使用signapk.jar生成的签名文件。

1、 MANIFEST.MF文件:程序遍历update.apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个生成SHA1的数字签名信息,再用Base64进行编码具体代码见这个方法:#!java。

privatestatic Manifest addDigestsToManifest(JarFile jar)关键代码是#!javafor (JarEntry entry: byName.values()) {

String name = entry.getName();if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&

!name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) && (stripPattern == null ||!stripPattern.matcher(name).matches())){

InputStream data = jar.getInputStream(entry);while ((num = data.read(buffer)) > 0) { md.update(buffer,

0, num); } Attributes attr = null;if (input != null) attr = input.getAttributes(name); attr = attr !=

null ? new Attributes(attr) : new Attributes(); attr.putValue("SHA1-Digest", base64.encode(md.digest()));

output.getEntries().put(name, attr); }}之后将生成的签名写入MANIFEST.MF文件关键代码如下:#!javaManifest manifest = addDigestsToManifest(inputJar);。

je = new JarEntry(JarFile.MANIFEST_NAME);je.setTime(timestamp);outputJar.putNextEntry(je);manifest.write(outputJar);

2、 生成CERT.SF文件:对前一步生成的Manifest,使用SHA1-RSA算法,用私钥进行签名关键代码如下:#!javaSignature signature = Signature.getInstance(。

"SHA1withRSA");signature.initSign(privateKey);je = new JarEntry(CERT_SF_NAME);je.setTime(timestamp);outputJar.putNextEntry(je);

writeSignatureFile(manifest,new SignatureOutputStream(outputJar, signature));3、 生成CERT.RSA文件:生成MANIFEST.MF没有使用密钥信息,生成CERT.SF文件使用了私钥文件。

那么我们可以很容易猜测到,CERT.RSA文件的生成肯定和公钥相关CERT.RSA文件中保存了公钥、所采用的加密算法等信息核心代码如下:#!javaje = new JarEntry(CERT_RSA_NAME);

je.setTime(timestamp);outputJar.putNextEntry(je);writeSignatureBlock(signature, publicKey, outputJar);

在程序中获取APK的签名时,通过signature方法进行获取,如下:#!javapackageInfo = manager.getPackageInfo(pkgname,PackageManager.GET_SIGNATURES);

signatures = packageInfo.signatures;for (Signature signature : signatures) { builder.append(signature.toCharsString());

}signature = builder.toString();所以一般的程序就是在代码中通过判断signature的值,来判断APK是否被重新打包过0x02 签名绕过方式在讲签名绕过的方式前,需要先明确DEX校验和签名校验:。

1.将apk以压缩包的形式打开删除原签名后,再签名,安装能够正常打开,但是用IDE(即apk改之理,会自动反编译dex)工具二次打包,却出现非正常情况的,如:闪退/弹出非正版提示框可以确定是dex文件的校验。

2、将apk以压缩包的形式打开删除原签名再签名,安装之后打开异常的,则基本可以断定是签名检验如果在断网的情况下同样是会出现异常,则是本地的签名检验;如果首先出现的是提示网络没有连接,则是服务器端的签名校验.。

2.1.Java层校验获取签名信息和验证的方法都写在android的java层。实例如下:1、使用APKIDE反编译APK,不做任何操作,然后直接回编译,安装后运行,提示如下:

2、在APKIDE中搜索signatures(或者搜索错误提示),定位到签名验证的代码处。

3、此处就是获取签名的,然后找程序判断签名的地方,进行修改,如下图,if-nez是进行判断的地方,将ne修改为eq。即if-eqz v2, :cond_0。则程序就可以绕过本地的签名交易。

2.2.NDK校验将关键代码放到so中,在底层获取签名信息并验证因为获取和验证的方法都封闭在更安全的so库里面,能够起到一定意义上的保护作用实例如下:1、使用APKIDE反编译APK,不做任何操作,然后直接回编译,安装后运行,程序直接退出,无任何提示。

2、在APKIDE中搜索signatures(或者搜索错误提示),定位到签名验证的代码处。

3、使⽤用JD-GUI打开AppActivity,可以看到,此处是获取包名,然后进⾏行MD5计算。

4.在程序中搜索getSignature,发现并没有调⽤用此函数的地⽅方,猜测在so⽂文件中,搜索loadLibrary。

5.在代码中可以查找,可以找到调⽤用的是libcocos2dcpp.so6.使⽤用IDA打开libcocos2dcpp.so,然后搜索getSiganture,找到调⽤用此函数的地方。

从代码中可以看到,此函数调⽤用了org.cocos2dx.cpp.AppActivity.getSignature

7、查看F5代码,发现此函数是判断签名的函数,然后我们双击此函数的调⽤者,部分代码如下。

8、从上图可以看出,只需要修改BEQ loc_11F754,让其不跳转到jjni——>error,就可以绕过签名校验查看HEX,使⽤010editor跳到0011F73E,修改D0为D1成功绕过签名校验。

2.3.服务器验证在android的java层获取签名信息,上传服务器在服务端进行签名然后返回验证结果。如下图,网络验证时,如果网络没连接,一般都会提示错误。

既然是网络验证,肯定要把验证信息发送到服务端,然后进行验证,先看个简单的实例,下次会有个难度大的1、手机配置好抓包,然后抓包第一种图是正常的APK的时候的数据包,第二个图是反编译的APK的数据包,通过对比,发现cookie中的public_key不一样,那么我们替换一下,发现可以正常使用APK的功能了。

2、将正确的public_key添加到APK中。打开反编译的代码,搜索signatures,定位到签名的代码。

可以看到,代码将signatures的值传递到V4中,然后传递到Utils->mPublicKey函数中,于是我们将正确的public_key传给V4。

然后重新打包,重新安装就可以了0x03.总结java层的校验很容易就可以破解掉,在so层实现校验相对来说分析会更难点,而网络验证,如果仅仅是字符串的比较,那么也很容易破解掉往期精彩登陆页面的检测及渗透渗透实战篇(一)

渗透测试信息收集的方法常见Web中间件漏洞利用及修复方法内网渗透 | 流量转发场景测试Waf从入门到Bypass实战渗透-看我如何拿下学校的大屏幕技术篇:bulldog水平垂直越权+命令执行+提权渗透工具实战技巧大合集 | 先收藏点赞再转发一气呵成

感兴趣的可以点个关注!!!

关注「安全先师」把握前沿安全脉搏

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186