设为首页收藏本站 今天是: 2024-02-27    美好的一天,从现在开始

复仇者黑客组织

 找回密码
 立即注册

QQ登录

只需一步,快速开始

    查看: 879|回复: 2

    mtgsig1.2简单分析[狗头]

    [复制链接]

    该用户从未签到

    12

    主题

    12

    帖子

    58

    积分

    网站信息宣传员

    Rank: 7Rank: 7Rank: 7

    积分
    58
    发表于 2023-10-18 14:39:54 | 显示全部楼层 |阅读模式
    [JavaScript]  
    1. {
    2. "a1": "1.2",        # 加密版本
    3. "a2": new Date().valueOf() - serverTimeDiff,       # 加密过程中用到的时间戳. 这次服主变坏了, 时间戳需要减去一个 serverTimeDiff(见a3) !  
    4. "a3": "这是把xxx信息加密后提交给服务器, 服主校验成功后返回的一个dfpId",      # dfpId. 服务器返回的dfpId数据包里, 有一个serverTimestamp字段. serverTimeDiff = serverTimestamp - Date.now()
    5. "a4": "一个长48位的加密结果",                      #  a5, a2以及一小段jsvmp运行后, 输出a4
    6. "a5": "一个长320位的加密结果",                       # a2, a6, 以及下面的Ln, 计算后输出a5
    7. "a6": "w1.2xxxxx这一段长512xxxxxxx",        # w1.2 + 客户端环境的加密结果
    8. "a7": wx["getAccountInfoSync"]().miniProgram.appId,     # 小程序id
    9. "x0": 3,   # 源代码写死
    10. "d1": md5ToHex(j)      #  a1, a2, a3, a4, a7以及上面加密过程中出现的一些数组, 经过运算后, 输出d1
    11. }
    12. Ln = {
    13. "b1": {appId: "小程序id",  envVersion: "release", version: "微信版本号"},
    14. "b2": "一个url",
    15. "b6": "微信的openId",    # 这个玩意儿可以考虑置空
    16. "b7": Math.floor(Date.now() / 1e3),
    17. "b8": "17"    # 不重要, 1-20给个随机值就行
    18. }
    复制代码
    PS:  基于某评微信小程序的guard.js文件, 且文件经过简单的ast脱混淆.
    1. 收集的环境[JavaScript]  
    1. Ne = {
    2.                 DFP: ["app", "dfpid", "filetime", "fpv", "localid", "system", "timestamp", "ext", "sessionId"],
    3.                 system: ["accelerometer", "albumAuthorized", "BatteryInfo", "batteryLevel", "Beacons", "benchmarkLevel", "bluetoothEnabled", "brand", "brightness", "cameraAuthorized", "compass", "deviceOrientation", "devicePixelRatio", "enableDebug", "errMsg", "fontSizeSetting", "language", "LaunchOptionsSync", "locationAuthorized", "locationEnabled", "locationReducedAccuracy", "microphoneAuthorized", "model", "networkType", "notificationAlertAuthorized", "notificationAuthorized", "notificationBadgeAuthorized", "notificationSoundAuthorized", "pixelRatio", "platform", "safeArea", "screenHeight", "screenTop", "screenWidth", "SDKVersion", "statusBarHeight", "system", "version", "wifiEnabled", "WifiInfo", "windowHeight", "windowWidth"],
    4.                 BatteryInfo: ["errMsg", "isCharging", "level"],
    5.                 safeArea: ["left", "right", "top", "bottom", "width", "height"],
    6.                 WifiInfo: ["SSID", "BSSID", "autoJoined", "signalStrength", "justJoined", "secure", "frequency"]
    7.             }
    复制代码
    1.1 环境加密逻辑(a6). 主要是找到收集了哪些环境, 以及环境对应的值.
    TBC茶馆-复仇者黑客组织[JavaScript]  { "a1": "1.2",        # 加密版本 "a2": new Dat复仇者黑客组织(1)
    加密函数中只有常见的加密运算符, 没有检测环境的异常分支或其他坑. 所以逆向中遇到的加密函数直接 复制粘贴到自己的代码里就好. 譬如:
    [JavaScript]  
    1. vn = {
    2.         gzipSync: R,
    3.         compressSync: R,
    4.         strToU8: function (e, n) {
    5.                 var a = e.length;
    6.                 if (!n && "undefined" != typeof TextEncoder) return new TextEncoder().encode(e);
    7.                 for (var t = new Je(e.length + (e.length >>> 1)), c = 0, r = function (e) {
    8.                         t[c++] = e;
    9.                 }, f = 0; f < a; ++f) {
    10.                         if (c + 5 > t.length) {
    11.                                 var o = new Je(c + 8 + (a - f << 1));
    12.                                 o.set(t), t = o;
    13.                         }
    14.                         128 > (o = e.charCodeAt(f)) || n ? r(o) : 2048 > o ? (r(192 | o >>> 6), r(128 | 63 & o)) : 55295 < o && 57344 > o ? (r(240 | (o = 65536 + (1047552 & o) | 1023 & e.charCodeAt(++f)) >>> 18), r(128 | o >>> 12 & 63), r(128 | o >>> 6 & 63), r(128 | 63 & o)) : (r(224 | o >>> 12), r(128 | o >>> 6 & 63), r(128 | 63 & o));
    15.                 }
    16.                 return nn(t, 0, c);
    17.         }
    18. };
    19. function R(e, n) {
    20.         void 0 === n && (n = {});
    21.         var a = pn(),
    22.                 t = e.length;
    23.         a.p(e);
    24.         var c = (e = ln(e, n, 10 + (n.filename && n.filename.length + 1 || 0), 8)).length,
    25.                 r = n;
    26.         if (n = r.filename, e[0] = 31, e[1] = 139, e[2] = 8, e[8] = 2 > r.level ? 4 : 9 == r.level ? 2 : 0, e[9] = 3, 0 != r.mtime && gn(e, 4, Math.floor(new Date(r.mtime || Date.now()) / 1e3)), n) for (e[3] = 8, r = 0; r <= n.length; ++r) e[r + 10] = n.charCodeAt(r);
    27.         return gn(e, c - 8, a.d()), gn(e, c - 4, t), e;
    28. }
    29. gn = function (e, n, a) {
    30.                 for (; a; ++n) e[n] = a, a >>>= 8;
    31.         },
    32. function J(e) {
    33.         function n() {
    34.                 for (var e, n = ["xxxxxxxxxxxxxxxxxxxxxxxxxx", "xxxxxxxxxxxxxxxxxxxxxxxxxx"], a = [], c = 0; c < n["length"]; c++) {
    35.                         e = "";
    36.                         for (var r = n[c], f = r["length"], o = parseInt("0x" + r["substr"](0, 2)), d = 2; d < f; d += 2) {
    37.                                 var i = parseInt("0x" + r["charAt"](d) + r["charAt"](d + 1));
    38.                                 e += String["fromCharCode"](i ^ o);
    39.                         }
    40.                         a["push"](e);
    41.                 }
    42.                 return a;
    43.         }
    44.         var a = ke["codec"]["utf8String"]["toBits"](n()[0]),
    45.                 c = ke["codec"]["utf8String"]["toBits"](n()[1]);
    46.         return a = new ke["cipher"]["aes"](a), e = ke["mode"]["cbc"]["encrypt"](a, e, c), ke["codec"]["base64"]["fromBits"](e);
    47. }
    复制代码
    2. a2-a8加密前的准备工作. TBC茶馆-复仇者黑客组织[JavaScript]  { "a1": "1.2",        # 加密版本 "a2": new Dat复仇者黑客组织(2)
    2.1 a5, a4的加密逻辑(包含两段简单的jsvmp代码, 相对于mtgsig1.1的jsvmp代码, 服主很可能还在练手). TBC茶馆-复仇者黑客组织[JavaScript]  { "a1": "1.2",        # 加密版本 "a2": new Dat复仇者黑客组织(3)
    代码中调用的函数也都是简单的运算操作. 例:
    [JavaScript]  
    1. Qn = function () {
    2.         for (var n, a, c = 256, r = []; c--; r[c] = n >>> 0) for (a = 8, n = c; a--;) n = 1 & n ? n >>> 1 ^ 3988292384 : n >>> 1;
    3.         return function (n) {
    4.                 if ("string" == e(n)) {
    5.                         for (var a = 0, c = -1; a < n["length"]; ++a) c = r[255 & c ^ n["charCodeAt"](a)] ^ c >>> 8;
    6.                         return 306674911 ^ c;
    7.                 }
    8.                 for (a = 0, c = -1; a < n["length"]; ++a) c = r[255 & c ^ n[a]] ^ c >>> 8;
    9.                 return 306674911 ^ c;
    10.         };
    11. }();
    12. function Z(e) {
    13.         var n = [];
    14.         return n[0] = e >>> 24 & 255, n[1] = e >>> 16 & 255, n[2] = e >>> 8 & 255, n[3] = 255 & e, n;
    15. }
    16. function X(e) {
    17.         for (var n = [], a = 0; a < e["length"]; a += 2) {
    18.                 var c = e["charAt"](a) + e["charAt"](a + 1);
    19.                 c = parseInt(c, 16), n["push"](c);
    20.         }
    21.         return n;
    22. }
    23. function W(e) {
    24.         e = encodeURIComponent(e);
    25.         for (var n = [], a = 0; a < e["length"]; a++) {
    26.                 var c = e["charAt"](a);
    27.                 "%" === c ? (c = e["charAt"](a + 1) + e["charAt"](a + 2), c = parseInt(c, 16), n["push"](c), a += 2) : n["push"](c["charCodeAt"](0));
    28.         }
    29.         return n;
    30. }
    31. function ae(e, n) {
    32.         var a = e["length"];
    33.         n ^= a;
    34.         for (var c = 0; 4 <= a;) {
    35.                 var r = 1540483477 * (65535 & (r = 255 & e[c] | (255 & e[++c]) << 8 | (255 & e[++c]) << 16 | (255 & e[++c]) << 24)) + ((1540483477 * (r >>> 16) & 65535) << 16);
    36.                 n = 1540483477 * (65535 & n) + ((1540483477 * (n >>> 16) & 65535) << 16) ^ (r = 1540483477 * (65535 & (r ^= r >>> 24)) + ((1540483477 * (r >>> 16) & 65535) << 16)), a -= 4, ++c;
    37.         }
    38.         switch (a) {
    39.                 case 3:
    40.                         n ^= (255 & e[c + 2]) << 16;
    41.                 case 2:
    42.                         n ^= (255 & e[c + 1]) << 8;
    43.                 case 1:
    44.                         n = 1540483477 * (65535 & (n ^= 255 & e[c])) + ((1540483477 * (n >>> 16) & 65535) << 16);
    45.         }
    46.         return ((n = 1540483477 * (65535 & (n ^= n >>> 13)) + ((1540483477 * (n >>> 16) & 65535) << 16)) ^ n >>> 15) >>> 0 ^ 1540483477;
    47. }
    复制代码
    2.2 d1, 以及最终mtgsig赋值 TBC茶馆-复仇者黑客组织[JavaScript]  { "a1": "1.2",        # 加密版本 "a2": new Dat复仇者黑客组织(4)




    上一篇:【reverse】虚假控制流入门:Ubuntu20.04安装ollvm4.0踩坑记+用IDApython去除BCF
    下一篇:打通Filecxx的最后一公里,免激活免升级

    该用户从未签到

    2

    主题

    2088

    帖子

    2080

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    2080
    发表于 2023-10-18 14:40:16 | 显示全部楼层
    很不错哦
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-18 14:31
  • 0

    主题

    7

    帖子

    51

    积分

    注册会员

    Rank: 2

    积分
    51
    发表于 2024-1-18 14:44:25 | 显示全部楼层
    感谢分享哦
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭Powered by ©科大讯飞语音云
    嗨!您好:
    欢迎来到 复仇者黑客组织。
    我的名字叫小光
    很高兴能够为您服务!
    如果已经注册【立即登录】
    还没有账号请立即注册
    Loading...
    快速回复 返回顶部 返回列表