夢晨 發(fā)自 凹非寺

量子位 報道 | 公眾號

有的人能把代碼寫成推理小說。

需要一個臨時變量的時候就叫temp,需要多個就叫var1,var2。

甚至用拼音縮寫當(dāng)函數(shù)名,比如查詢訂單就叫cxdd。

要想看懂這樣的代碼,得聯(lián)系上下文反復(fù)推敲,還原每個部分的真實(shí)作用。

這個過程叫做反混淆()。

麻煩,著實(shí)麻煩。就沒有省事兒點(diǎn)的辦法嗎?

讓AI來啊!

最近,就出了這樣一個語言模型DOBF,專治代碼混淆。

像下圖這種,所有不影響運(yùn)行的變量名、函數(shù)名、類名,都被替換成無意義的符號,AI都能作出猜測并嘗試還原。

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

來看看和正確答案的對比,雖然不是完全一樣,但AI的改法也大大提高了代碼的可讀性。

代碼寫的真棒_怎么讓ai寫代碼_代碼寫出來怎么用

像,源代碼中是“重置參數(shù)”,AI改成“初始化權(quán)重”,也完全說得通。

DOBF模型目前除了還支持C++和Java。

編碼不規(guī)范的人畢竟是少數(shù),這個模型更廣泛的用途是恢復(fù)故意做混淆以保護(hù)知識產(chǎn)權(quán)的代碼,比如這種:

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

代碼寫好后,把不影響編譯運(yùn)行的部分,批量替換成人類難以分辨的符號,給破譯增加難度。

在這之前也有掩碼語言模型( )用于恢復(fù)被遮蔽的文本。

用于恢復(fù)代碼的有哈工大&微軟開發(fā)的和之前開發(fā)的,但效果都不如最新的DOBF。

DOBF超過它們靠的不是模型架構(gòu)上的創(chuàng)新或數(shù)據(jù)集的完善,而是提出了新的預(yù)訓(xùn)練任務(wù)。

合理的任務(wù)指導(dǎo)AI學(xué)習(xí)

之前的掩碼語言模型多是隨機(jī)選擇要掩蔽的部分,經(jīng)常會選到括號逗號這種對AI來說沒什么難度的。

DOBF的做法是指定遮蔽變量名、函數(shù)名和類名并讓AI去恢復(fù),這個任務(wù)難度更大,能迫使AI學(xué)到更深層的規(guī)律。

另外還用相同的符號替代多次出現(xiàn)的同一名稱,這樣可以防止AI發(fā)現(xiàn)有的名字可以復(fù)制粘貼之后學(xué)會偷懶走捷徑。

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

像上圖中的變量V3,AI從第3行的定義可以看出這個變量是List類型,再一看第5行調(diào)用的是pop(0)。

這不是先進(jìn)先出嘛,AI就會命名成(隊列)而不是(堆棧)了。

更厲害的還在后面,DOBF通過代碼內(nèi)容甚至能判斷出相應(yīng)函數(shù)是生成斐波那契數(shù)列和做向量點(diǎn)積的。

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

DOBF在架構(gòu)上其實(shí)沒有特別的設(shè)計,只是為了公平對比分別訓(xùn)練了兩個和、層數(shù)一樣的模型。

成功的關(guān)鍵之處就在于合理的訓(xùn)練任務(wù)。