什么是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 avar b = a + 2; // read object console// read variable bconsole.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