yoin528 发表于 2024-3-26 11:07

求助某安js逆向存在反debugger和混淆策略分析

最近有个需求想抓取某安的一些公开数据,但该网站有较强的反爬策略,下面详细描述下该网站的一些技术点,希望各位大佬给出一些指点
过程如下:
1、该网站请求首页后会加载十几个js,这些js向浏览器写入cookie
2、后续的请求都要带着js写入的cookie放在请求头中向后台请求数据,如果检查不对则提示参数错误。
分析过程:
1、检查该网站发现大量js都是混淆过的,无法通过document.cookie搜索到,于是使用js对写cookie进行hook操作并进行debugger,hook代码如下:

var v = "";
Object.defineProperty(document, "cookie", {
    set: function(val) {
      // if(val.indexOf("sajssdk_2015_cookie_access_test") == -1) {
      //   debugger;
      // }
      if(val.indexOf("bnc-uuid") !== -1) {
            debugger;
      }
      if(val.indexOf("deviceId") !== -1) {
            debugger;
      }
      if(val.indexOf("se_gd") !== -1) {
            debugger;
      }
      if(val.indexOf("thx_guid") !== -1) {
            debugger;
      }
      if(val.indexOf("device-info") !== -1) {
            debugger;
      }
      v = val;
      return v;
    },
    get() {
      return v;
    }
})
2、通过对cookie的hook操作后,找到写cookie的代码位置,但代码存在大量的js混淆,查看了下应该是ob混淆,部署代码如下:
function x(W, X, Y, Z) {
                  var a0 = f['vtYVa'](f(f(W + f + f, f(l, X)) + f + f(l, Y ? Y : '') + b('0x1ef', 'J^06') + Z, b('0xa7', '39fF')), new n()());
                  var a1 = new q();
                  a1] = a0;
                  g['_tmp'] = a1;
                }
                try {
                  var y = new n()['getTime']();
                  var z = c(0x4);
                  var A = z;
                  var B = z;
                  var C = z;
                  var D = z;
                  var E = f['EjXxV'](c, 0x1);
                  var F = f['EjXxV'](c, 0x2);
                  var G = '20231227';
                  var H = '';
                  var I = new n()['getTime']() - y;
                  function W(a1) {
                        var a2 = {
                            'WycGn': function(a8, a9) {
                              return v['WGXHb'](a8, a9);
                            }
                        };
                        function a3(a8) {
                            a8 = a2['WycGn'](a8, '');
                            if (a8['length'] >= 0xd) {
                              return a8['substring'](0x0, 0xd);
                            } else {
                              while (a8['length'] != 0xd) {
                                    a8 = '0' + a8;
                              }
                            }
                            return a8;
                        }
                        var a4 = a3(new n()['getTime']());
                        var a5 = v['LlNoU'](a1 + ':' + C['grs'](0x13), a4);
                        var a6 = 0x1;
                        var a7 = v['wqcyX'](v['MwWnU'](A, a5 + C['sph'](a5, 0x4)), a6);
                        return a7;
                  }
                  function X(a1, a2, a3) {
                        C['p_c'](a1, a2, a3);
                  }
                  function Y() {
                        return C['g_c']('se_gsd');
                  }
                  var J = '';
                  var K = [];
                  function Z(a1) {
                        if (!a1) {
                            return;
                        }
                        if (typeof a1 == 'string') {
                            K['push'](a1);
                        } else {
                            K = K['concat'](a1);
                        }
                        if (t) {
                            return ![];
                        }
                        var a2 = t;
                        t = function() {
                            if (arguments > 0x1) {
                              this = arguments;
                            }
                            a2(this, arguments);
                        }
                        ;
                        var a3 = t')];
                        t = function() {
                            try {
                              var a4 = this;
                              for (var a5 = 0x0; a5 < K; a5++) {
                                    if (v(a4(K), -0x1)) {
                                        this(b('0x1ea', '4eNd'), J);
                                        this(v, v(W, 'rd'));
                                        var a6 = '';
                                        try {
                                          a6 = v(E, H);
                                        } catch (a7) {
                                          a6 = b('0x6c', 'zjpA');
                                        }
                                        this(b('0x152', 'NjVu'), a6);
                                        break;
                                    }
                              }
                            } catch (a8) {
                              x(w(), b('0x225', '1ZL7') + g, C(a8), G);
                            }
                            a3(this, arguments);
                        }
                        ;
                        tR')] = !![];
                  }
                  function a0(a1) {
                        if (a1 && a1) {
                            try {
                              var a2 = a1('')()('');
                              a2 = C['sr'](a2, f(u, a2 / 0x5));
                              var a3 = a2(0x0, 0x1);
                              var a4 = a2(0x1, 0xd);
                              if (a3 == '1') {
                                    H = a4;
                              } else {
                                    H = '';
                              }
                              if (a2 > 0xd) {
                                    var a5 = a2(0xd);
                                    f(X, f, a5, f(f(f(0x64, 0x16d), 0x18) * 0x3c, 0x3c) * 0x3e8);
                              }
                            } catch (a6) {
                              fR')](x, f(w), f + g, C(a6), G);
                            }
                        }
                  }
                  J = f(W, 'pd');
                  if (g && g && gR')]) {
                        f(Z, g);
                  }
                  var L = C['g_c'](f);
                  if (!L) {
                        L = f(W, 'sd');
                        X(b('0x1d', 'ouDj'), L);
                  }
                  var M = C(f);
                  if (!M || f(f(M, 0x4), 0x0)) {
                        M = f['EjXxV'](W, 'gd');
                        f(X, 'se_gd', M, f(f(0x64 * 0x16d * 0x18 * 0x3c, 0x3c), 0x3e8));
                  }
                  var N = Y();
                  var O = f(new n()(), y);
                  var P = f(F);
                  var Q = new n()R')]() - y;
                  var R = {};
                  R = J;
                  R = L;
                  R = M;
                  R = N;
                  R')] = C(b('0x30', 'Id4I'));
                  R = C(b('0x15f', 'g^n3'));
                  R['ev'] = P;
                  R = f(I, '');
                  R = O + '';
                  R = f(Q, '');
                  var S = f(f(w), f);
                  var T = A(JSON(R));
                  var U = {
                        'onSuccess': function(a1) {
                            f(a0, a1);
                        },
                        'onError': function() {}
                  };
                  f(D, S, {
                        'c': T,
                        'sv': G,
                        't': new n()()
                  }, U);
                  return Z;
                } catch (a1) {
                  f(x, f(w), g, C(a1), G);
                  var V = function() {};
                  return V;
                }
            }));
2、本来想根据hook的位置对写入的cookie扣js代码返回回来用于后续请求时请求头cookie,但发现有十几个js文件在写cookie,且每个js都有几万行混淆代码,想要扣或还原比较困难。
3、分析最重要的登陆操作时,对于device-info的写入cookie操作时,发现在进入debugger的瞬间页面就进行了删除debugger操作并刷新页面,然后所有请求返回状态码为403的操作,应该是检测到我在debugger,后面所有请求都是403拒绝。


求助的问题如下:
1、使用python模拟请求时,反爬策略中请求首页时会同时下载十几个js进行cookie写入操作(有可能有些js没有作用只是混淆视听),每个js都进行了混淆,最大的js文件格式化后有九万行这么大(比较难还原),有什么办法找到主要能用的参数。
2、使用写cookie的hook操作debugger时,该网站使用了什么技术检测到我在debugger,又是怎么直接删除debugger使用无法打断点的,如何避免?

黄色土豆 发表于 2024-3-26 11:46

你的意思是,想看如何生成 cookie 的吗

yoin528 发表于 2024-3-26 11:49

黄色土豆 发表于 2024-3-26 11:46
你的意思是,想看如何生成 cookie 的吗

不是,我已经hook到了,在hook里面打上了debugger,前几个cookie的生成通过hook已经找到了,但还有一个cookie是device-info的写入我使用判断打印debugger时,那个网站好像能检测到我在debugger,不知道用了什么技术直接把我这个debugger断点删掉了,导致我无法debugger断点在那,之后就一直在刷新,后面就403不再让我访问了

黄色土豆 发表于 2024-3-26 11:51

yoin528 发表于 2024-3-26 11:49
不是,我已经hook到了,在hook里面打上了debugger,前几个cookie的生成通过hook已经找到了,但还有一个co ...

看看 403 的截图

yoin528 发表于 2024-3-26 11:54

这个图片我说明了下

黄色土豆 发表于 2024-3-26 11:55

网站发一下,我试试

yoin528 发表于 2024-3-26 12:02

黄色土豆 发表于 2024-3-26 11:55
网站发一下,我试试

可以发网址吗?
https://accounts.binance.com/

yoin528 发表于 2024-3-26 12:04

我想要的就是这个请求头计算device-info的试,还有其它cookie的方式,看看哪个大佬能帮下

黄色土豆 发表于 2024-3-26 14:29

yoin528 发表于 2024-3-26 12:04
我想要的就是这个请求头计算device-info的试,还有其它cookie的方式,看看哪个大佬能帮下

简单看了一下,发现这个 device-info 的值是不变的,如果考虑使用的话,可以复制过来直接用。

yoin528 发表于 2024-3-26 15:08

黄色土豆 发表于 2024-3-26 14:29
简单看了一下,发现这个 device-info 的值是不变的,如果考虑使用的话,可以复制过来直接用。

我把cookie和这个属性放进去了,但是请求得到的是400,参数非法,估计还有其它什么东西计算有误
页: [1] 2
查看完整版本: 求助某安js逆向存在反debugger和混淆策略分析