Nic*app的native层算法破解 原文
案例:就不放了
这里抓包分析的过程不详细说了
可以看到主要有两个参数
sign和signV1
搜索关键词定位以及跳转到声明之后,最后就是一个md5,用objection看看就完事了
这是java层的sign破解,完事。
这个算法主要是在native层,这里借助了frida进行破解,最后换成cpp代码。
这里定位到这个,刚开始我也不知道这里,就瞎找,分析到这里。
最后确定到这两个方法,用objection确定下,最后native走的那个方法
可以看到最后走的是getSignRequest这个方法,并且根据上图,就可以看到so是libsalt.so。
至于为什么最后不放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'
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'
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期)