首页
社区
课程
招聘
[原创]Nic*app的native层算法破解
发表于: 2020-9-27 22:40 9643

[原创]Nic*app的native层算法破解

2020-9-27 22:40
9643

Nic*app的native层算法破解 原文

案例:就不放了

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

搜索关键词定位以及跳转到声明之后,最后就是一个md5,用objection看看就完事了
file
file
file
file
这是java层的sign破解,完事。

这个算法主要是在native层,这里借助了frida进行破解,最后换成cpp代码。
这里定位到这个,刚开始我也不知道这里,就瞎找,分析到这里。
file
最后确定到这两个方法,用objection确定下,最后native走的那个方法
file
可以看到最后走的是getSignRequest这个方法,并且根据上图,就可以看到so是libsalt.so。
file

file
至于为什么最后不放python算法,实在是因为,还原成python之后,高低位操作的时候,部分数据不对了。。就只有cpp了
此文章仅用于学习交流,请勿商业用途和传播。
Nic*app的native层算法破解 原文

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))
  }
})
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))
  }
})
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)
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)
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 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));
frida-trace -FU -i "strlen"
frida-trace -FU -i "strlen"
array[i] = buffer[2 * i] & 0xF0 | buffer[2 * i + 1] & 0xF;
array[i] = buffer[2 * i] & 0xF0 | buffer[2 * i + 1] & 0xF;
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;
}
string getMd5(const string &message) {
  return MD5(message).toStr();
}
string getSha1(const string &message) {
  SHA1 checksum;
  checksum.update(message);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 6918
活跃值: (9134)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
2
我猜,这种情况,你可以用 ctypes 库解决。 
2020-9-28 01:24
0
雪    币: 162
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
LC
3
楼主方便给下联系方式吗? Q578878142
2020-9-28 18:30
0
雪    币: 6212
活跃值: (6447)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
无名侠 我猜,这种情况,你可以用 ctypes 库解决。
谢谢大佬指点
2020-9-28 21:02
0
雪    币: 2709
活跃值: (1632)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
数据  他是走的  TCP 协议 ?
2020-9-29 08:55
0
雪    币: 2709
活跃值: (1632)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
python  base64 解决不了 后来 用java 才解决的
2020-9-29 08:55
0
雪    币: 1454
活跃值: (267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2020-9-29 09:59
0
雪    币: 6212
活跃值: (6447)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
Vn小帆 数据 他是走的 TCP 协议 ?
我看是http   base64没懂??
2020-9-29 19:40
0
雪    币: 358
活跃值: (854)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
大佬能分析一下 MJTQ(墨迹)的签名算法么
2020-9-30 09:51
0
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
tianhaoday 大佬能分析一下 MJTQ(墨迹)的签名算法么
https://www.die.lu/core/index.php/2020/09/15/332/
2020-10-2 18:21
0
游客
登录 | 注册 方可回帖
返回
//