了解Jalangi2

什么是Jalangi

Jalangi是前端和后端JavaScript的动态分析框架。它允许您监视JavaScript程序的每个操作,并编写自己的程序分析代码。

技术细节

Jalangi Firefox扩展拦截并转换网页和外部文件中的每一行JavaScript代码。代码转换增加了一些钩子,允许您监视执行执行的几乎每个操作(例如,变量读/写,一元/二进制操作,函数/方法调用等)。简单地覆盖暴露的API允许您执行自己的动态分析。您的动态分析代码将与目标程序的执行并行执行。

广泛的影响力和应用

JavaScript是一种松散类型的语言,通常是错误修剪。基于此框架,您可以快速构建一个分析模块来检查各种正确性错误和性能错误,进行各种程序分析(例如调试,性能分析,监控动态行为,运行时调用图等)

Jalangi转换

Jalangi Firefox扩展程序拦截并转换浏览器加载的每一行JavaScript代码,以显示挂钩以方便程序分析。

下面的数字显示原始代码段和转换的代码段。函数J $ .W和J $ .R是回调函数(钩子),用于通知变量的读写操作,回调函数的参数包括变量名和值。类似回调函数。这些回调函数调用特殊设计的虚拟函数,这些函数将作为API公开,以方便用户定义的动态分析。覆盖这些API函数将允许分析代码沿原始执行执行

Jalangi Firefox扩展

与服务器端JavaScript(Node.js)不同,在Web浏览器中,可以随时以各种方式添加JavaScript语句(如左图所示),我们相信网页中的每一行JavaScript代码都被拦截和转换。此外,我们的扩展也适用于使用HTML5 Webworker的网页,这是前端JavaScript的多线程API。

Jalangi2工作流程:

下图显示了四位在线编辑人员之间的关系。

目标代码(target code)是要转换和分析的源代码(即网站源代码)。 (修改此文件以查看Jalangi如何转换不同的程序结构。)

变换代码(transformed code)是Jalangi转换的目标代码。它增加了钩子(例如,用于变量读取的J$.R),它调用了在analysis.js中定义的函数。 (您不能修改此代码,因为转换是Jalangi的工作。)

analysis.js是Jalangi运行时框架代码,它实现了转换代码中调用的这些钩子。这些钩子保留目标代码的语义,并调用第三方插件中定义的第三方回调函数。 (您可以修改此文件,但是我们建议您在第三方插件中进行修改。)

第三方插件(third-party Plugin)是由第三方程序分析开发人员编写的文件(即您!!),覆盖这些预定义的API可以让您截获这些执行事件并进行程序分析。 (修改此文件以创建任何所需的程序分析模块。)

一个例子:

原始代码:

/* Target code to be transformed and analysed */
/* Do not put code here that will not terminate :) */

var a = 1;

// read variable a
var b = a + 2; 

// read object console
// read variable b
console.log(b); 

jalangi2转义后代码:

/* Code transformed by Jalangi */ 
var a = J$.W(8, 'a', J$.T(0, 1, 22, false), a, false, true);
var b = J$.W(32, 'b', J$.B(0, '+', J$.R(16, 'a', a, false, true), J$.T(24, 2, 22, false)), b, false, true);
J$.M(56, J$.I(typeof console === 'undefined' ? console = J$.R(40, 'console', undefined, true, true) : console = J$.R(40, 'console', console, true, true)), 'log', false)(J$.R(48, 'b', b, false, true));
// JALANGI DO NOT INSTRUMENT

详细jalangi2 API可以参考我的另一篇博客:jalangi2 API

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go语言Goroutine与Channel内存模型

Go语言内存模型规定了在一个goroutine中一个变量的读取的情况下,确保能够观察到在其他另外goroutine中写入同样变量的值。也就是说,如果在多个gor...

4444
来自专栏深度学习与计算机视觉

Python 新建文件夹与复制文件夹内所有内容

在指定路径下新建一个文件夹: import os def newfile(path): path=path.strip() path=path....

2196
来自专栏编程

Ansible 2 Api 源码分析及实现

Ansible 2 API ansible 2 API发生了很大的变化。 通过对ansible 2.4.2 的源代码(Python 环境为2.7.5)进行分析来...

55210
来自专栏DannyHoo的专栏

APNS推送原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/de...

2613
来自专栏IT可乐

Linux系列教程(二十二)——Linux的bash变量

  上篇博客我们介绍了bash的一些基本功能,这是我们平时操作最频繁的。本篇博客我们介绍bash的变量,为后面编写shell脚本做铺垫。 1、什么是变量   变...

21310
来自专栏企鹅号快讯

Python模块

Python模块 可以将代码量较大的程序分割成多个有组织的、彼此独立但又能相互交互的代码片段,这些自我包含的有组织的代码段就是模块 模块在物理形式上表现为以.p...

2357
来自专栏Hongten

php开发_多关键字,高亮显示

================================================================

1151
来自专栏Python小屋

Python多线程编程中daemon属性的作用

在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一: 如果某个子线程的daem...

3405
来自专栏Golang语言社区

Go语言Goroutine与Channel内存模型

Go语言内存模型规定了在一个goroutine中一个变量的读取的情况下,确保能够观察到在其他另外goroutine中写入同样变量的值。也就是说,如果在多个gor...

3506
来自专栏Golang语言社区

Go语言Goroutine与Channel内存模型

Go语言内存模型规定了在一个goroutine中一个变量的读取的情况下,确保能够观察到在其他另外goroutine中写入同样变量的值。也就是说,如果在多个gor...

35310

扫码关注云+社区

领取腾讯云代金券