前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Nic*app的native层算法破解

Nic*app的native层算法破解

作者头像
吾爱小白
发布于 2020-09-28 00:50:37
发布于 2020-09-28 00:50:37
96800
代码可运行
举报
文章被收录于专栏:小白技术社小白技术社
运行总次数:0
代码可运行

Nic*app的native层算法破解

抓包分析

这里抓包分析的过程不详细说了 可以看到主要有两个参数 sign和signV1

反编译

1、 sign破解

搜索关键词定位以及跳转到声明之后,最后就是一个md5,用objection看看就完事了

这是java层的sign破解,完事。

2、*-sign-v1破解

这个算法主要是在native层,这里借助了frida进行破解,最后换成cpp代码。这里定位到这个,刚开始我也不知道这里,就瞎找,分析到这里。

最后确定到这两个方法,用objection确定下,最后native走的那个方法

可以看到最后走的是getSignRequest这个方法,并且根据上图,就可以看到so是libsalt.so。

2.1 分析so
  • 导入jni头文件,这里没有jni_onload,就是静态注册的。在Java_com_*_main_helpers_utils_*SignUtils_getSignRequest找到一个加密的函数,追下去看看。
  • 看到这么多函数,根据名字就猜测一下了,md5操作,看看是不是导出函数。

果然是导出函数,直接frida就去Hook一下导出函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Interceptor.attach(Module.findExportByName("libsalt.so", "*_md5"), {
    onEnter: function (args) {
        console.log("*_md5 onEnter", Memory.readCString(args[0]))
    },
    onLeave: function (retvalue) {
        console.log("*_md5 onLeave", Memory.readCString(retvalue))
    }
})

Hook之后得到这么多

其实a4698cf0eea7a9b92a0194618079aba9是did2a0194618079aba9a4698cf0eea7a9b9中间进行切割,然后交换位置。5nhrec75lf3drenb09a349366a5b7eda4ee99d7a104fb38b8a5f746c1c9c99c0b458e1ed510845e5 是随机字符串+md5(a4698cf0eea7a9b92a0194618079aba9)+8a5f746c1c9c99c0b458e1ed510845e5的结果8a5f746c1c9c99c0b458e1ed510845e5是固定值,随机字符串是java层算法。python这一部分的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   did = '2a0194618079aba9a4698cf0eea7a9b9'
    rstr = 'yqkdfs6y4d2ci8wm'  # 随机字did[:符串
    new_did = did[len(did) // 2:] + len(did) // 2]
    did_md5 = get_md5(new_did)
    sss = rstr + did_md5 + '8a5f746c1c9c99c0b458e1ed510845e5'
    dest = get_md5(sss)

cpp实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    string did = "2a0194618079aba9a4698cf0eea7a9b9";
    string ranstr = "28npqz4cpmw6ifpc";
    string new_did = getStringSubs(did);
    string did_md5 = getMd5(new_did);
    string sss = ranstr + did_md5 + "8a5f746c1c9c99c0b458e1ed510845e5";
    string dest = getStringSubs(getMd5(sss));

上边的dest是新字符串拼接需要的

这里有一个json的操作,其实刚开始我也不知道干了什么,最后我用frida-trac 就轻松解决了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frida-trace -FU -i "strlen"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array[i] = buffer[2 * i] & 0xF0 | buffer[2 * i + 1] & 0xF;

这个是对字符串进行了高低位的操作,也就是这个app的signV3唯一个非标准算法。拿到高低位操作之后的字符串之后,拼接了之前的dest(我自己写的那个),然后进行sha1操作。sha1之后取了第8位到最后的字符串,然后又中间进行切割,然后交换位置,最后生成的就是signV3的结果。cpp最后实现的算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string getMd5(const string &message) {
    return MD5(message).toStr();
}
string getSha1(const string &message) {
    SHA1 checksum;
    checksum.update(message);
    const string hash = checksum.final();
    return hash;
}
string getStringSubs(const string &message) {
    string string1 = message.substr(0, message.length() / 2);
    string string2 = message.substr(message.length() / 2);
    return string2 + string1;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void SignV3() {
    string did = "2a0194618079aba9a4698cf0eea7a9b9";
    string ranstr = "28npqz4cpmw6ifpc";
    string new_did = getStringSubs(did);
    string did_md5 = getMd5(new_did);
    string sss = ranstr + did_md5 + "8a5f746c1c9c99c0b458e1ed510845e5";
    string dest = getStringSubs(getMd5(sss));
    string arr = "aid=fbef33334c2388ccee5757dc2dbb0b45&comments_sort=asc&isnewsession=false&mark_read_sid=361595316249559936&mcc=&mnc=&nextkey=×tamp=1592463682&ua=Mozilla/5.0 (Linux; Android 8.1.0; AOSP on msm8996 Build/OPM4.171019.021.D1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36";
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    const char *buffer = "aid=fbef33334c2388ccee5757dc2dbb0b45&comments_sort=asc&isnewsession=false&mark_read_sid=361595316249559936&mcc=&mnc=&nextkey=×tamp=1592463682&ua=Mozilla/5.0 (Linux; Android 8.1.0; AOSP on msm8996 Build/OPM4.171019.021.D1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36";
    int i = 0;
//这里的算法可以看看ida的图 自己实现呐
   string new_sss = arr.substr(0, i) + dest;
    string sha1Res = getSha1(new_sss).substr(8);
    string sign_v3 = getStringSubs(sha1Res);
    cout << "_sign_v3=" << sign_v3;
}
int main() {
    SignV3();
    return 0;
}

算法检验

至于为什么最后不放python算法,实在是因为,还原成python之后,高低位操作的时候,部分数据不对了。就只有cpp了

更多推荐

修改xposed特征并刷机

破解某交(y)友(p)app的VIP&&半自动im机器人

编译xposed、刷机并送书

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白技术社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MD算法C++程序设计和实现
MD5,即Message-Digest Algorithm 5 (信息-摘要算法5),是广泛使用的Hash 算法,用于确保信息传输的完整性和一致性。 MD5 使用little-endian(小端模式),输入任意不定长度信息,以 512-bit 进行分组,生成四个32-bit 数据,最后联合输出固定 128-bit 的信息摘要。 其基本过程为:填充、分块、缓冲区初始化、循环压缩、得出结果。 基本流程图如下:
梦飞
2022/06/23
2830
MD算法C++程序设计和实现
013:实战爬取三个翻译网站掌握Ajax表单提交
本篇内容由易到难,涉及到ajax-form表单数据提交及md5解密 一共有三个翻译网络。我们要实现的是找到翻译的接口,打造我们自己的翻译软件。首先是
李玺
2021/11/22
5200
013:实战爬取三个翻译网站掌握Ajax表单提交
哈希算法的python实现与应用
In this program, you are required to invoke the md5 and sha256 algorithms that are implemented in hashlib build-in library. Your program does the following:
timerring
2022/07/20
3550
哈希算法的python实现与应用
md5算法原理一窥(其一)
    首先,需要了解的事,md5并不是传说中的加密算法,只是一种散列算法。其加密的算法并不是我们说所的那样固定不变,只是一种映射的关系。 所以解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,然后在所谓的解密的时候,都是通过这个映射表来查找其所 对应的原始明文。而绝对没有一种算法,可以通过输出加密后的散列值算出原始明文。 下面是我国山大的以为教授探究到的md5,传说可以完美破解md5.
Gxjun
2018/03/26
9260
JAVA中的加密算法之单向加密
作者:幽鸿   Apr 16, 2016 12:15:24 AM
幽鸿
2020/04/02
1.5K0
浅谈md5加密[通俗易懂]
我是最近在写一个H5 的项目时接触到的这个算法,这个算法极大的引起了我的好奇心,是登陆界面,要求是将用户输入的密码使用md5加密之后,再传回服务器,当时我十分不理解原因是什么.
全栈程序员站长
2022/09/14
1.5K0
Java高并发秒杀API(二)之Service层
一些初学者容易出现的错误,就是喜欢在DAO层进行逻辑的编写,其实DAO就是数据访问的缩写,它只进行数据的访问操作。
雨临Lewis
2022/01/11
5630
C# 实现微信自定义分享
在实际的应用中,我们可能不是简单的将该网页的链接直接分享出去,而是生成符合实际需要的URL,微信称其为自定义分享。意思即,在用户点击“转发给朋友”按钮之前,进行URL等内容的更新 ,经过调整后,再把链接发送给要分享的朋友。微信给出的关键方法是:updateAppMessageShareData。
初九之潜龙勿用
2024/06/20
1780
C# 实现微信自定义分享
(二)Java高并发秒杀API之Service层
首先在编写Service层代码前,我们应该首先要知道这一层到底时干什么的,这里摘取来自ITEYE一位博主的原话
Java团长
2018/12/25
8890
java开发_MD5_加密算法
先看看代码再说: 1 package com.b510.note; 2 3 import java.math.BigInteger; 4 import java.security.MessageDigest; 5 import java.security.NoSuchAlgorithmException; 6 7 /** 8 * MD5加密 9 * 10 * @author Hongten 11 * 12 */ 13 public class MD5 { 14 15
Hongten
2018/09/13
6410
【C++】基础:加密算法介绍与部分实现
加密就是通过密码算法对数据进行转化,使之成为没有正确密钥任何人都无法读懂的报文。而这些以无法读懂的形式出现的数据一般被称为密文。为了读懂报文,密文必须重新转变为它的最初形式——明文,而含有以数学方式转换报文的双重密码就是密钥。
DevFrank
2024/07/24
8780
【C++】基础:加密算法介绍与部分实现
蓝帽杯 2022 web/misc writeup
jar包附件下载:https://share.weiyun.com/v3yXxl87
ek1ng
2022/08/10
4.1K0
蓝帽杯 2022 web/misc writeup
HASH函数烧脑大作战
本期讲解一下hash函数,由于之前在比赛中做到了一题hash有关的题目,引发了此次的深(烧)度(脑)研究,本来想讲讲原理,但是太难,看得很痛苦,所以此次通过结合CTF题来看看HASH的一些利用,一切从简开始讲述,小编是如何入坑的。
漏斗社区
2018/10/23
1.4K0
HASH函数烧脑大作战
(优化版)工学云自动打卡签到脚本
前言 基于Python实现工学云自动签到打卡文章做的脚本优化 业务逻辑代码 创建文件名为sign.py并拷入以下代码保存 import requests import hashlib import json import time import smtplib from email.mime.text import MIMEText class gxy_sign: # 初始化 def __init__(self,user_account_info,sign_info,email_in
用户8988577
2022/12/27
2.5K1
某站App签名算法解析(一)
都9020年了,这种规模用户的App应该是不会裸奔在java层了,我们就直接一点,在so里面搜索 sign=
奋飞安全
2021/05/29
1K0
某站App签名算法解析(一)
面向对象(三十四)-加密与解密
如图 你是没有办法进行解密的,但是有一些爱好者就利用存储空间,记录这种计算后的结果,导致MD5加密也可以进行破解。目前破解率在70%-80%。所以也不是绝对的安全。
孙寅
2020/06/02
4130
面向对象(三十四)-加密与解密
【APP 逆向百例】淘某热点 APP 逆向分析
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
K哥爬虫
2025/03/24
720
【APP 逆向百例】淘某热点 APP 逆向分析
Oracle的MD5函数介绍
快速解决领导问题是第一位的,搜了一下,Oracle 11g,创建自定义函数,可以得到对应的MD5,
bisal
2021/01/04
3.2K0
Oracle的MD5函数介绍
酷狗app signature
所用环境:夜神模拟器7.0.0.6 ,系统版本安卓5,酷狗版本10.6.5 (模拟器推荐版本)
李玺
2021/11/22
8420
酷狗app signature
Oracle的MD5函数介绍
快速解决领导问题是第一位的,搜了一下,Oracle 11g,创建自定义函数,可以得到对应的MD5,
bisal
2021/09/06
7100
Oracle的MD5函数介绍
相关推荐
MD算法C++程序设计和实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文