­

Js逆向必备技能之-动态hook找入口

  • 2020 年 2 月 25 日
  • 筆記

今天我们来讲一下 hook找入口方法,动态调试动态hook。

先介绍一下 Object.defineProperty    Object.defineProperty(obj, prop, descriptor)  obj:必需。目标对象  prop:必需。需定义或修改的属性的名字  descriptor:必需。目标属性所拥有的特性    此方法可以重写js对象方法属性。

首先我们写个基本的hook:

Object.defineProperty(document, 'cookie', {          get: function() {              debugger;              return "";          },          set: function(value) {              debugger;              return value;          },  });

这样的话我们就可以hook cookie的读写,只要接下来的代码读写cookie就会断点断下来。让他的混淆代码无所遁形 ,我们来演示一下

我们在控制台执行hook代码之后,他读取cookie被hook劫持到我们的函数里面了,这样我们就能从右边的调用堆栈去看看他操作cookie的地方。轻松分析

这里我们拿某个网站举例测试,因为他很多反爬混淆比较典型

随便划一下,他有个提交 我们看一下提交的内容

他这个post没有任何字段只有一串加密后的字符串,这样我们就不能搜关键字了,这里谷歌浏览器给我们提供了一个功能,查看调用堆栈

这里我们可以看到从点击到提交所有调用过程,我们点第一跳到他的代码段再点左下角格式化

一般人看到一脸懵逼,我们先下断点,再滑动一下手工去解一下看看

我们可以看到f是XMLHttpReque对象,f[_0xd5fe("0x548", "iunZ")]是send发送数据,具体逻辑就是post发送window._tt_log_val 字段到服务器

很明显这个字段就是加密后的字符串,我老方法搜一下这个._tt_log_val ,这里我用的是qq浏览器

没有任何的地方,是不是感觉无从下手,他这里我们暂时猜测是动态生成的字段名称动态设置的,我们可以利用hook来找入口,既然他可以写这个字段 我们可以hook这个字段,只要他提交这个肯定要生成赋值,我们在他赋值之前hook。

Object.defineProperty(window, '_tt_log_val', {          get: function() {              debugger;              return "";          },          set: function(value) {              debugger;              return value;          },      });

然后我们滑动的时候他提示这个 属性重定义,不管怎么触发的 他肯定在操作这个字段,我们看他的位置

我们下个断点看看他怎么操作的

可以看到他用了一点小聪明,Object.defineProperty他利用这个对象进行的赋值操作,我们找一下具体哪里。

字符串拼接,中间是取加密后的算法,剩下的就是看他这个方法怎么计算的,无论是抠算法还是其他方式,我们就很轻松分析他。至于扣代码我们程序调用,由于篇幅关系,后面单独讲怎么扣代码为我们所用。