Posts
[RE-APP]某为快逆向
pre
逆向一个记账本
todo
文件
/data/data/com.huawei.fastapp/app_resource/fastappEgine/com.xx.fruit
提取拿到轻应用的网页资源。 应用程序在这里。下来看抓包
抓包
注入证书,然后开启抓包软件。发现无法抓包。
找到不能抓包原因
在目录下找到cbg_root.cert
证书,
InputStream open = context.getAssets().open(str);
X509Certificate x509Certificate = (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate(open);
if (open != null) {
open.close();
}
return x509Certificate;
生成了证书,然后日志看到它固定证书.
C:\Users\Kian>adb logcat |findstr CertVerifier
03-08 15:02:35.446 18560 18657 I a : [hmssafetydetect-feature CertVerifierUtil.java:1] Start verify cert chain using root ca: CN=Huawei CBG Root CA,OU=Huawei CBG,O=Huawei,C=CN
03-08 15:02:35.447 18560 18657 I a : [hmssafetydetect-feature CertVerifierUtil.java:3] verify cert CN=sysintegrity.platform.hicloud.com,OU=Huawei CBG Cloud Security Signer,O=Huawei,C=CN
03-08 15:02:35.448 18560 18657 I a : [hmssafetydetect-feature CertVerifierUtil.java:4] using CN=Huawei CBG Application Integration CA,OU=Huawei CBG,O=Huawei,C=CN
来自于类:Lcom/huawei/fastapp/ca8;
猜测
这里猜测,它和服务器使用这套证书,不用这套证书是无法通信的, 同事给建议是转发全部流量然后用mitmproxy抓包,但是觉得是不可行的,理论说不通.
跟踪了一下 发现它传递到 native中去了。太深了。我觉得这个四路有问题。
换一种思路找它的通信方式。直接拿到app的代码。
代码在上边的文件夹中,我们找到关键的代码:
c.fetch({
url: s,
responseType: "text",
method: "POST",
header: {
"Content-Type": "application/json"
},
其中c的定义:
, c = $app_require$("@app-module/system.fetch")
好好好,就找system.fetch
经过在apk中寻找,
找到了fetchModule.class
然后根据其创建okhttp3client的过程,找到其证书管理器的类的关键三个方法:
getAcceptedIssuers
checkServerTrusted
checkClientTrusted
知道这三个方法就知道大概的流程了。
直接bypass
iz.checkClientTrusted.implementation = function (obj1,ibj2) {
console.log(' -->checkClientTrusted Bypassing');
};
iz.checkServerTrusted.implementation = function (obj1,ibj2) {
console.log(' -->checkServerTrusted Bypassing');
};
iz.getAcceptedIssuers.implementation = function () {
console.log(' -->getAcceptedIssuers Bypassing');
return [];
};
然后安装证书
@echo off
adb shell su -c "mkdir -m 700 /data/local/tmp/ca-copy"
adb shell su -c "cp /system/etc/security/cacerts/* /data/local/tmp/ca-copy/"
adb shell su -c "mount -t tmpfs tmpfs /system/etc/security/cacerts"
adb shell su -c "mv /data/local/tmp/ca-copy/* /system/etc/security/cacerts/"
adb push c8750f0d.0 /data/local/tmp/c8750f0d.0
adb shell su -c "cp /data/local/tmp/c8750f0d.0 /system/etc/security/cacerts/"
adb shell su -c "chown root:root /system/etc/security/cacerts/*"
adb shell su -c "chmod 644 /system/etc/security/cacerts/*"
adb shell su -c "chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*"
adb shell su -c "rm -r /data/local/tmp/ca-copy"
echo " cert into system ok!"
打开转发报工具。即可正常抓取包。
算法突破
就是调试JS
调试js就很easy:
直接copy js 到一个html
<script>
function w(e, t) {
var r = (65535 & e) + (65535 & t);
return (e >> 16) + (t >> 16) + (r >> 16) << 16 | 65535 & r;
}
function b(e, t, r, n, a, i) {
return w((s = w(w(t, e), w(n, i))) << (o = a) | s >>> 32 - o, r);
var s, o;
}
function A(e, t, r, n, a, i, s) {
return b(t & r | ~t & n, e, t, a, i, s);
}
function k(e, t, r, n, a, i, s) {
return b(t & n | r & ~n, e, t, a, i, s);
}
function S(e, t, r, n, a, i, s) {
return b(t ^ r ^ n, e, t, a, i, s);
}
function C(e, t, r, n, a, i, s) {
return b(r ^ (t | ~n), e, t, a, i, s);
}
function _(e, t) {
debugger;
var r,
n = "noncestr=" + e + "×tamp=" + String(t) + "&key=205B31FA4F96D31D84DF380BA559A603";
return (r = n, function (e) {
var t,
r,
n = "0123456789abcdef",
a = "";
for (r = 0; r < e.length; r += 1) t = e.charCodeAt(r), a += n.charAt(t >>> 4 & 15) + n.charAt(15 & t);
return a;
}(function (e) {
return function (e) {
return function (e) {
var t,
r = "";
for (t = 0; t < 32 * e.length; t += 8) r += String.fromCharCode(e[t >> 5] >>> t % 32 & 255);
return r;
}(function (e, t) {
e[t >> 5] |= 128 << t % 32, e[14 + (t + 64 >>> 9 << 4)] = t;
var r,
n,
a,
i,
s,
o = 1732584193,
c = -271733879,
u = -1732584194,
l = 271733878;
for (r = 0; r < e.length; r += 16) n = o, a = c, i = u, s = l, o = A(o, c, u, l, e[r], 7, -680876936),
l = A(l, o, c, u, e[r + 1], 12, -389564586),
u = A(u, l, o, c, e[r + 2], 17, 606105819),
c = A(c, u, l, o, e[r + 3], 22, -1044525330),
o = A(o, c, u, l, e[r + 4], 7, -176418897),
l = A(l, o, c, u, e[r + 5], 12, 1200080426),
u = A(u, l, o, c, e[r + 6], 17, -1473231341),
c = A(c, u, l, o, e[r + 7], 22, -45705983),
o = A(o, c, u, l, e[r + 8], 7, 1770035416),
l = A(l, o, c, u, e[r + 9], 12, -1958414417),
u = A(u, l, o, c, e[r + 10], 17, -42063),
c = A(c, u, l, o, e[r + 11], 22, -1990404162),
o = A(o, c, u, l, e[r + 12], 7, 1804603682),
l = A(l, o, c, u, e[r + 13], 12, -40341101),
u = A(u, l, o, c, e[r + 14], 17, -1502002290),
o = k(o, c = A(c, u, l, o, e[r + 15], 22, 1236535329), u, l, e[r + 1], 5, -165796510),
l = k(l, o, c, u, e[r + 6], 9, -1069501632),
u = k(u, l, o, c, e[r + 11], 14, 643717713),
c = k(c, u, l, o, e[r], 20, -373897302),
o = k(o, c, u, l, e[r + 5], 5, -701558691),
l = k(l, o, c, u, e[r + 10], 9, 38016083),
u = k(u, l, o, c, e[r + 15], 14, -660478335),
c = k(c, u, l, o, e[r + 4], 20, -405537848),
o = k(o, c, u, l, e[r + 9], 5, 568446438),
l = k(l, o, c, u, e[r + 14], 9, -1019803690),
u = k(u, l, o, c, e[r + 3], 14, -187363961),
c = k(c, u, l, o, e[r + 8], 20, 1163531501),
o = k(o, c, u, l, e[r + 13], 5, -1444681467), l = k(l, o, c, u, e[r + 2], 9, -51403784),
u = k(u, l, o, c, e[r + 7], 14, 1735328473),
o = S(o, c = k(c, u, l, o, e[r + 12], 20, -1926607734), u, l, e[r + 5], 4, -378558),
l = S(l, o, c, u, e[r + 8], 11, -2022574463),
u = S(u, l, o, c, e[r + 11], 16, 1839030562),
c = S(c, u, l, o, e[r + 14], 23, -35309556),
o = S(o, c, u, l, e[r + 1], 4, -1530992060),
l = S(l, o, c, u, e[r + 4], 11, 1272893353),
u = S(u, l, o, c, e[r + 7], 16, -155497632),
c = S(c, u, l, o, e[r + 10], 23, -1094730640),
o = S(o, c, u, l, e[r + 13], 4, 681279174),
l = S(l, o, c, u, e[r], 11, -358537222),
u = S(u, l, o, c, e[r + 3], 16, -722521979),
c = S(c, u, l, o, e[r + 6], 23, 76029189),
o = S(o, c, u, l, e[r + 9], 4, -640364487),
l = S(l, o, c, u, e[r + 12], 11, -421815835), u = S(u, l, o, c, e[r + 15], 16, 530742520),
o = C(o, c = S(c, u, l, o, e[r + 2], 23, -995338651), u, l, e[r], 6, -198630844),
l = C(l, o, c, u, e[r + 7], 10, 1126891415), u = C(u, l, o, c, e[r + 14], 15, -1416354905),
c = C(c, u, l, o, e[r + 5], 21, -57434055), o = C(o, c, u, l, e[r + 12], 6, 1700485571),
l = C(l, o, c, u, e[r + 3], 10, -1894986606), u = C(u, l, o, c, e[r + 10], 15, -1051523),
c = C(c, u, l, o, e[r + 1], 21, -2054922799), o = C(o, c, u, l, e[r + 8], 6, 1873313359),
l = C(l, o, c, u, e[r + 15], 10, -30611744), u = C(u, l, o, c, e[r + 6], 15, -1560198380),
c = C(c, u, l, o, e[r + 13], 21, 1309151649), o = C(o, c, u, l, e[r + 4], 6, -145523070),
l = C(l, o, c, u, e[r + 11], 10, -1120210379), u = C(u, l, o, c, e[r + 2], 15, 718787259),
c = C(c, u, l, o, e[r + 9], 21, -343485551), o = w(o, n), c = w(c, a), u = w(u, i), l = w(l, s);
return [o, c, u, l];
}(function (e) {
var t,
r = [];
console.log(e.length);
for (r[(e.length >> 2) - 1] = undefined, t = 0; t < r.length; t += 1) r[t] = 0;
for (t = 0; t < 8 * e.length; t += 8) r[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
console.log(r);
return r;
}(e), 8 * e.length));
}(unescape(encodeURIComponent(e)));
}(r))).toUpperCase();
}
</script>
浏览器打开,直接调用调试就可以了。 注意debugger位置;
复现
直接配合AI和python直接写出来。
总结
按图索骥!