這篇文章主要介紹如何用joern進行更靈活地分析原始碼,適用於joern 1.x版本joern提供了一種基於scala的查詢語言。這種方式的好處是自動繼承了所有宿主語言的特性。所以我們可以實用scala程式設計方式去編寫joern的指令碼。這篇文章將介紹joern查詢語言的基礎概念,並舉例子介紹。
ps:在查詢之前,我們需要使用importcpg
或者loadcpg
來匯入joern-parse
生成的**屬性圖。
importcpg("../output/testcode.bin.zip")
用cpg.all
來查詢**屬性圖中的所有節點:
cpg.all
$ res2: nodesteps[storednode] = io.shiftleft.semanticcpg.language.nodesteps@2d2ffced
用cpg.all
輸出的結果不是乙個列表,而是乙個nodesteps[storenode]
的型別,我們可以把這個認為是乙個表示式,只在求值的時候生成所有節點。這種方法的好處是我們可以組合表示式,而不需要去計算他。然後我們可以在費力評估之前,進行合法性檢查和查詢優化,提高效率。
要評估這個表示式,我們可以強行將其轉化為列表:
cpg.all.tolist.size
這個查詢會返回圖中所有節點的數目,由於tolist
是乙個常用操作,作者用.l
來替代tolist
,就比如下面這樣
cpg.all.l.size
然後每個節點都有乙個標籤,標籤指的是由節點表示的程式構造的型別。要想大致瀏覽一下圖里的label,可以使用下面的查詢:
在這個查詢中,表示式cpg.all.label
呼叫了toset
的方法。然後這個scala集合再被轉換成列表並排序。ps:tolist
和sorted
都是scala自帶的api介面。
術語step
是繼承了圖遍歷語言gremlin,step
表示在圖中走了一步,經常結合函式來組成乙個遍歷。我們可以認為遍歷是表達節點結合的表示式。
對於每個節點標籤,相應的型別由查詢語言定義,比如節點的方法對應的標籤是method
。對於每個節點,都定義了乙個starter
來代表所有帶這個標籤的節點。比如:
cpg.method
另外,可以通過輸入cpg.
然後按tab鍵來獲得乙個完整的starter列表。
建議最好採用特定型別的starter來查詢,如果用通用的cpg.all
不能確定哪種型別的節點被處理了。使用特定的starter比如.method
可以使用scala的型別系統來在查詢之前進行自動補全並檢測非法的查詢。
對於每個節點,都儲存了乙個id。這個id是乙個很長的整數來唯一地表示節點。我們不必用joern的指令碼去提取節點的id,但是當節點傳遞給外部工具的時候,尤其是這些外部工具要進行後續的查詢時,這個id可能會派上用場。下面這個查詢返回所有檔案節點的id:
cpg.file.id.l
在接收到這個結果之前,外部工具可能會呼叫第乙個檔案節點進行後續的查詢。如果這樣的話,我們可以使用下面的查詢:
需要注意的是,由cpg.id(16)
返回的節點型別在編譯時是未知的,因此,cpg.id(16)
的型別是list[nothing]
。實際上,外部工具通常是知道節點的型別(通過之前的查詢得知),比如我們這個例子,id16
是乙個檔案型別的節點。所以,乙個顯式的轉換可以把我們帶回到型別化的世界:
cpg.id(16).asinstanceof[nodesteps[nodes.file]].name.l
最後,cpg.id
同樣接收乙個節點序列,比如:
查詢可以分為以下三個步驟:
下面舉乙個例子來簡單說明。首先看看下面這個查詢:
cpg.parameter.evaltype(".*char.*")
.method.name(".*parse.*")
.map(x => (x.name, x.start.caller.id.l))
執行結果如下:
這裡可以在最後加上.l
,就會顯示列表,或者加上.tojson |> $outfile
就會變成轉換成json檔案輸出到outfile
檔案中去。
Joern的安裝與使用
一.前言 最近在研究c c 原始碼的漏洞挖掘,需要用到joern工具將原始碼轉換為圖來分析,於是開始尋找關於joern的安裝教程。首先是按照別人的部落格安裝,發現大部分依賴庫都是遠古版本,根本安裝不了,於是找官方教程,找到了乙個官方文件 準確來說應該是舊的官方文件,文件底部顯示2014年 安裝的版本...
mysql高階查詢in MySQL高階查詢(一)
in 子查詢 巢狀查詢 重點是思路 為什麼要用in?in 在數值上相當於 但是它可以查詢到更多的符合條件的結果,等於號只可以查詢乙個結果 question 有兩種方法 第一種 使用子查詢替換表連線 使用 inner join 將表與表之間聯動,再將實現條件依次寫出來 第二種 採用子查詢 在where...
mysql 高階 查詢 MYSQL中的高階查詢
1.1.子查詢 1.1.1.在房屋型別中,如何找出比雙人間貴的所有房屋型別?找到雙人間的 根據第一步找到的 作為查詢條件去查滿足條件的房屋型別,利用where字句 子查詢是乙個巢狀在 select insert update 或 delete 語句或其他子查詢中的查詢 子查詢在where語句中的一般...