基于Python的JS逆向和AST抽象语法树

一、关于js逆向的一些知识点总结

  1. javascript-数据类型中,null,undefinded都表示没有东西
  2. 普通函数,匿名函数,构造函数,一般常见的是匿名函数
  3. 函数可以当成字符串看待,可以看成参数传到别的函数里
  4. 变量名提升:如果使用赋值语句定义函数,则没有办法使用变量提升,因为变量名只能提升到声明这一步,没有办法提升到赋值那一步
  5. 函数的作用域在定义函数的区域,而不在调用函数的区域
  6. arguments-对象,包含了函数运行时的所有参数,通过索引传递多个参数
  7. 立即调用的函数表达式,将函数放在一个圆括号里直接调用,如果开头是function的话,会被认为是定义函数,不调用。所以不要让function开头,就可以实现马上调用的功能
  8. eval可以把字符串当成命令来执行
  9. 本质上,数组属于一种特殊的对象,可以将其看做是下标有固定规律的字典
  10. 首字母大写的函数可以看做是构造函数,但本质上和首字母小写的没有啥本质上的区别
  11. 原型:构造函数创建的过程中系统自动创建出来的和构造函数相关联的一个空的对象
  12. constructor是原型对象的属性,指向构造函数
  13. __proto__:通过这个可以经过子类修改父类即原型链上的值
  14. prototype:可以构造原型对象,可以指向原型对象

二、浏览器插件注入——

  1. indexOf:判断某一个键在不在对象里,如果在就停在这里,如果没有就继续走下去,最后获取的值存储在变量里
  2. cookie在一个网页里可能有很多个cookie。
  3. typeof:检测数据类型
  4. 打断点,从栈里找cookie的出路,上一步是设置cookie的动作
  5. 这里只是找了一个起点,剩下的东西还需要自己处理
  6. run_at:触发时机

三、AST抽象语法树

作用: 主要作用是为了防止js混淆的,一定程度上还原混淆,让代码的可读性提高。而在使用的过程中,我们就不可避免的用到了这个在线解析网站。AST explorerAn online AST explorer.https://astexplorer.net/为什么要用AST抽象语法树?

首先,我们在很多网站的源代码中,不可避免的会遇到类似于var a = "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054";这样的代码,很少有人能看得懂,但是将其加载到AST中就会变得好看一些。

经过替换,一长串的字符变成了"hello,AST" 

 换一种编码试一试——

 

可以看到,上面就是一个个的节点,这也是我们再熟悉不过的JSON结构的数据,上图中红色下划线处就是它的path类型,说穿了就是路径。

那么,这两者有什么不一样的地方?

光是从上下级就可以看到,VariableDeclaration 是  VariableDeclarator 的祖先节点。

在这里将代码修改一下,再次观察:

这样就明白了。原来 一个 VariableDeclarator 只对应一个变量的定义 。

当前路径所对应的源代码,使用的是toString这个方法,在我解混淆的时候会经常的用到,是比较重要的,示例代码如下:

const visitor = {

   VariableDeclaration(path)

   {

     console.log(path.toString());

   },

}

若是要判断path是什么type,使用path.isXXX 这个方法,比如我们需要判断路径是否为 StringLiteral 类型:

if(path.isStringLiteral())

 {

 //do something;

}

若想要获取path的上一级路径,你可以像这样来获取:


let parent = path.parentPath;

获取path的子路径,你可以是使用 get方法,比如定义了如下变量:

var a = 123;

当前访问的是  VariableDeclarator ,其结构如下:

现在需要访问 id 这个路径,你可以这么操作:

path.get('id');

 删除path,使用remove方法,当你觉得你访问的路径已经完成了改完成的事,对代码已经没什么作用了,可以将其删除,

path.remove()

 替换path,单路径可以使用replaceWith方法,多路径则使用replaceWithMultiple方法,比如你想将 1 + 2 替换成 3,你可以像下面这样的代码进行替换:

方法一:
path.replaceWith({type:"NumericLiteral",value:3});
方法二:
const type = require("@babel/types")
path.replaceWith(type.NumericLiteral(3));

注意,这里的3是个人口算出来的,在实际操作过程中,是需要获取 "+" 两边的值并计算其结果的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值