自己寫的程序被殺毒軟體殺了怎麼辦?

自己編程,然後發給別人用。別人的殺毒軟體把我自己編寫的.exe當病毒了,或者電子郵件服務直接就禁止我發送。我確信我的程序沒有任何過分功能,只是讀取本地文件、分析數據、繪製圖表而已。於是有這樣幾個問題:

1.殺毒軟體辨認病毒的原理是什麼?為什麼我寫的.exe會被認為是病毒?

2.自己的程序發給別人用,如何避免被殺毒軟體殺了?


我們先來看一下什麼情況下一個文件會被認為是病毒

1.調用了危險的系統功能

殺毒軟體一般會內置「行為模式」引擎,如果一個可執行文件調用了某些被殺毒軟體認為是「危險」或者「可疑」的系統調用,那麼比較容易被判定為病毒。這些可疑的行為包括且不僅限於「對系統文件的操作」、「對其他進程的操作」、「對特定註冊表項的操作」等等。

現實生活中如果一個人在機場鬼鬼祟祟,行為可疑,肯定也會被攔下來仔細盤查。

2.使用了加密或者加殼等方式使得殺毒軟體無法進行檢測;

有些程序,並沒有調用危險的系統應用,但因為防盜版或者反破解的需求,對自己進行了加密保護,這會導致部分殺毒軟體無法對程序進行檢測,好比一個人經過地鐵安檢口的時候堅決不肯對自己攜帶的旅行箱進行X光掃描,那麼被安檢人員認為是可疑人員是非常順理成章的。

3.符合了其他惡意軟體的條件

現代的殺毒軟體不僅僅只處理計算機病毒,對垃圾廣告、欺詐釣魚、黑客工具、外掛破解等等也會進行不同程度的處理,特別是有相關公司或者朝陽群眾舉報的情況下。

4.使用了危險的第三方開發工具/組件;

有時候雖然開發者自己並沒有手寫病毒,但是因為使用的第三方工具/組件本身被污染了,也會導致編譯出來的程序是惡意代碼,這樣的話被殺毒軟體檢測到就不奇怪了。

類似經過海關的時候,幫陌生人攜帶了行李,這個行李里存放了毒品,這種行為也是構成違法犯罪的。

5.誤報

不可否認的是,防病毒軟體始終未能(以後估計也很難)徹底解決誤報的問題,可能是因為你的程序有一小段二進位代碼剛好和某個病毒的變種符合,也可能是因為防病毒公司的人寫特徵的時候不小心疏忽,雖然概率不高,但出現被誤報的情況還是存在的。

那麼自己的文件被判定為病毒後,應該怎麼處理呢?

1.自查;

請根據上述的情況對自己的代碼和程序進行自查,也可以通過點擊防病毒軟體的報警信息進一步了解報警的詳細原因,找到被判定為病毒的理由。

2.添加數字簽名或放入白名單;

防病毒軟體通常有一整套白名單機制來防止誤報的出現,包括數字簽名、用戶白名單和投訴機制。數字簽名是指開發者使用一個能唯一標識自己身份的密鑰對自己的程序進行簽名,從而使得防病毒軟體可以識別出開發者的信息,類似於現實生活中的「無犯罪記錄證明」,添加了合適數字簽名的程序可以直接通過大部分殺毒軟體的檢測。或者用戶可以手動添加白名單告訴殺毒軟體某個程序是我可以信任的(類似業主打電話告訴門衛某人是我的訪客)。如果上述方法都不行,還可以通過向防病毒軟體廠商直接投訴的方法來避免被誤報。

3.修改後綴、加密壓縮傳輸;

如果臨時有程序需要傳輸,又不願意大動干戈去做白名單,可以簡單地通過修改後綴名、加密壓縮的方式避免被郵件系統的殺毒模塊誤刪。


一、殺毒軟體辨認病毒的原理是什麼?

每一家安全公司的檢測和匹配方式都不相同。

常見的有傳統的特徵碼匹配、靜態動態啟發等技術,關於火絨的反病毒引擎更詳細的內容可以參考以下文檔:

火絨反病毒掃描引擎:技術白皮書

http://bbs.huorong.cn/thread-18372-1-1.html

火絨反病毒掃描引擎:虛擬沙盤技術簡介

http://bbs.huorong.cn/thread-18373-1-1.html

火絨反病毒掃描引擎:「腳本行為沙盒」簡介

http://bbs.huorong.cn/thread-19546-1-1.html

二、為什麼我寫的.exe會被認為是病毒呢?

1.安全軟體廠商的誤報

如果程序本身沒有包含惡意代碼或有類似病毒的行為,安全軟體報毒了那就是誤報,原因是安全軟體對病毒「特徵」提取有誤導致,這應該是極少發生的情況。

但是,近些年某些安全軟體的誤報非常常見,其主要原因還是因為安全公司在反病毒引擎等關鍵技術上缺少積累和研究,短時間內為了更高的檢測率和更快響應速度,盲目依賴大數據和「人工智慧「,犧牲了檢測質量,導致的誤報增多。

舉例說明導致誤報增多的可能原因:

1)盲目依賴大數據和「人工智慧「,帶來的誤報

以加殼為例,在此之前,我們先了解一下「殼」與「病毒混淆器」:

早期的「殼」通常以壓縮目標程序為目的,隨著軟體知識產權意識的萌發,以保護程序代碼及數據為目的的「殼」應運而生。這些「壓縮殼」、「加密殼」和「保護殼」由於加殼程序公開(免費或收費),所以安全工程師可以對」加殼「的過程和結果進行分析,從而通過代碼識別程序是否被「加殼」、加了何種「殼」,進而「脫殼」,並可以將這種「脫殼」邏輯嵌入到反病毒引擎的掃描邏輯中,在一定程度上「解決」了「殼」的對抗。

近10年,很多病毒作者通過「殼」和感染型病毒常用的多態、變形等技術編寫非公開的「私有殼」對病毒代碼進行保護,這類「殼」往往不僅包括上述公開「保護殼」的功能,並且外層的「殼」代碼還會通過各種手段干擾、誤導、對抗反病毒引擎的識別,安全領域為此類「殼」起了個更為「高大上」的名字:「病毒混淆器」,其比較典型的混淆手段就包括代碼變形、入口偽裝……

如果沒有有效的反病毒引擎作支撐,只是利用大數據和「人工智慧「作判斷。

那麼安全軟體只能通過文件的外層特徵,猜測其內容是否為病毒,直接導致了因為無法分辨 正常加殼軟體和病毒混淆器而導致誤報率上升。

總結來說:在計算機學習鑒別病毒時,特徵是否有價值十分重要。「有價值的特徵」+」好的演算法「才能發揮作用。但一些安全軟體為了更快的響應速度、更高的檢測率,只提取到了被「混淆」的「特徵,則會犧牲檢測質量,產生誤報。

也正因為是上面的原因,才會在「坊間"流傳有加殼誤報這種說法。其實使用正常加密工具保護自己軟體的知識產權,和病毒使用「混淆器」加密了免殺是不一樣的。

在火絨的這篇報告中對病毒混淆器有詳細說明:

代碼戰爭:偽裝和狙殺——從「殼」到「病毒混淆器」

http://www.huorong.cn/info/147210475737.html

而火絨自帶的反病毒引擎可以通過「通用脫殼」技術,無視代碼變形,戳穿外層「偽裝」成正常編譯器的病毒,直接對原始內容進行檢測,從而極大的減少誤報。

2)寬泛的病毒定義加白名單的「濫用」,帶來的誤報

有的時候為了高檢測率,某些安全廠商會選擇添加一些非常寬泛的病毒定義,再使用白名單作排除。

在這種情況下,誤報的原因不在開發者使用了什麼加密工具和開發工具(比如易語言),而是安全廠商的檢測機制存在問題。

沒有收錄的軟體都面臨被誤報的可能,即使現在沒有誤報,也不排除將來不會因為安全廠商為了提高檢測率而被誤報。

2.軟體作者的開發環境存在病毒

1)程序員的開發環境存在感染型病毒,即使軟體本身的代碼沒有問題,但是編譯出來的程序如果被感染,也會攜帶病 毒代碼。

2)程序員使用的開發庫如果染毒,引入這個庫的程序也會存在惡意代碼。

舉例:Virus/Induc,該病毒通過感染Delphi庫文件中的SysConst.dcu文件,在使用被感染的Delphi庫生成的文件都會攜帶病毒代碼。

3)程序員使用的開發工具染毒或者引入包含惡意代碼的第三方庫,則編譯的程序也會攜帶病毒。

舉例:2015年的XcodeGhost,開發工具染毒導致開發出的APP帶毒。

當然這種情況還是很少見的:)

三、自己的程序發給別人用,如何避免被殺毒軟體殺了?

直接上報給安全軟體公司,自己不用做任何測試,也不用去想怎麼避免。誤報了就直接找安全軟體公司反饋問題,反饋的時候最好提供誤報文件和報毒日誌,如果安全公司確認是誤報了,那就是他們的工作失誤,不但會在第一時間解決並且還會感謝你。

關於「添加數字簽名或放入白名單」,以及「修改後綴、加密壓縮傳輸」

小編對於 @shotgun 的答案中提到的「添加數字簽名或放入白名單」,以及「修改後綴、加密壓縮傳輸」兩種方法不太認同。這兩種方法其實並不能解決實際問題。

1.「添加數字簽名或放入白名單」

是否是病毒和數字簽名無關。添加數字簽名無法解決題主的問題,病毒就是病毒,有數字簽名也不能使安全軟體不報毒。

隨手拿出一個有數字簽名的病毒的例子:流氓軟體化身「衛士」攜帶病毒對抗安全軟體 - 知乎專欄 https://zhuanlan.zhihu.com/p/24726433)

其次是將報毒文件加入白名單。如果是加入安全軟體的本地白名單,無法避免他人使用時繼續報毒。

如果是安全廠商因為誤報了你的程序,要求你的軟體加入它的白名單,這就是在用錯誤的方法掩飾他們的誤報。誤報就是誤報,如果安全廠商不去積極修改自己的錯誤,反而要求開發者使用其他方式幫他們解決誤報。也許有一天寫一個「HelloWorld」程序,都會被檢測為病毒。

2.「修改後綴、加密壓縮傳輸」

是否是病毒和文件後綴名無關。加密壓縮傳輸就算可以暫時不被安全軟體報毒,但是解壓之後依然會被檢測為病毒。

上面這兩種方法都是治標不治本,看似解決了問題,但事實上使用者還是存在安全軟體報毒問題。這就導致了——很多安裝包「提示」下載者安裝時關閉或忽略安全軟體。此時如果是上文所說的開發環境染毒情況,那這樣的做就會使安全軟體的防護失去意義,電腦面臨中毒的風險。

火絨希望軟體作者在遇到安全軟體誤報自己軟體的時候,及時和安全廠商溝通,從根本上解決問題。

在這裡,也呼籲大家,不要輕易的關閉、忽略甚至刪除安全軟體。只要是沒有病毒行為,沒有包含惡意代碼,安全軟體就不會報毒。如果是安全軟體的誤報,無論是上述提到的哪一種情況,最應該做的不是避開問題,而是上報給安全公司溝通解決。這樣對於安全公司來說也是完善自身,更好的為用戶服務的過程。

回答完畢,感謝邀請~

_______________________________________

歡迎關注火絨實驗室機構號!

關於我們:

什麼是知乎「機構帳號」?哪些機構可能進駐知乎?會帶來什麼樣的影響? - 知乎 https://www.zhihu.com/question/48487733/answer/141801543

其他回答:

為什麼現在殺毒軟體免費了有的人反而不滿意了? - 知乎 https://www.zhihu.com/question/30102906/answer/140800312

最新文章:

遊戲外掛網站暗藏病毒——盜號、鎖首等數種危害並舉 - 知乎專欄 https://zhuanlan.zhihu.com/p/26569214


第一步 買個簽名

第二步 寫一個內核驅動,簽名

第三步 看誰不爽就關誰,不讓關就卸過濾驅動之後刪文件重啟,再不行就BSOD

最重要的一步 "本程序不與任何種類的反病毒程序兼容,請自行添加白名單或尋找替代程序"


不知道是什麼殺毒軟體,360和小紅傘的確比較敏感(嗯,就是誤報多的意思)

360甚至識別你的程序沒有描述什麼的都會報警,主動防禦。所以如果能加簽名,加個簽名,基本上能讓所有殺毒軟體閉嘴。

不是做殺毒出身,說說自己理解的殺毒軟體原理:

  • 比較文件hash,如果跟惡意病毒一樣,就認為是惡意的
  • 關鍵幾塊代碼片段,如果跟惡意病毒一樣,就認為是惡意的
  • 關鍵的幾塊數據,如果跟惡意病毒一樣,就認為是惡意的
  • 如果發現你調用了一些API可能是惡意病毒經常調用的鏈路,也會認為是惡意的。


根據你的描述,並不存在病毒特徵

你先做個測試。

在斷網環境下右鍵掃描你的程序,如果被殺,可能是匹配到了特徵碼,屬於誤報,嘗試下把功能拆成幾個模塊或者放到單獨的dll里試試。如果不報毒,繼續往下看。

直接運行程序,如果在運行前報毒,看下是不是報的未知風險程序,360在網購模式下對未知程序是很敏感的,這種情況下沒有好辦法,只能打簽名。

如果是運行後報毒,則是主動防禦或者沙盒分析這一步沒過關,說明你軟體的有些行為觸發了殺軟的閾值,被認為是危險行為。例如,是否載入啟動項,是否釋放了另一個可執行文件,是否遠程下載可執行文件並運行了,等等。

如果斷網條件下沒被殺而是聯網後被殺,則是妥妥的雲查殺,原因同上一樣。

最後檢查下你的編譯器,一定要從官網下載,而且不要用迅雷。


殺毒軟體辨認病毒的原理是什麼 :

你沒給殺毒軟體交錢。他就認為你是病毒。


刪掉殺毒軟體

//

用班裡的編譯器寫c,生成的exe永遠被殺


殺毒軟體辨認病毒的原理是什麼?為什麼我寫的.exe會被認為是病毒?

一、 特徵碼掃描識別:將收集到的正常文件信息與病毒特徵庫進行對照,如果信息與其中的任何一個病毒特徵符合,殺毒軟體即判斷此文件被病毒感染。

抽取的特徵碼需要具有特殊性,不易與普通正常程序代碼重合;抽取的代碼要有適當長度,一方面維持特徵碼的唯一性,另一方面保證病毒掃描時候不需要佔用太多的資源開銷

1、 文件特徵碼 單一或複合特徵碼

2、 內存特徵碼 單一或複合特徵碼

3、 文件HASH校驗

病毒特徵碼可能出現誤報,導致正常文件被殺

二、啟發式掃描識別: 根據掃描特定的行為或多種行為的組合來判斷一個程序是否是病毒,需要載入驅動,來截獲系統函數調用(HOOK程序)

程序調用的API或者程序讀取的目錄、註冊表等行為有可能被誤識別為惡意操作

三、虛擬沙盒:通過讓文件運行在虛擬環境中,監控文件運行的一切行為,利用虛擬機技術可以發現大部分的變形病毒和大量的未知病毒。

四、雲端識別:通過將疑似高危的代碼段發送遠端的威脅情報平台進行域名、IP、HASH、特徵等的識別綜合判斷是否為病毒文件

讀取本地文件、分析數據這裡面調用的函數有可能匹配到了靜態特徵或者行為特徵,導致軟體被殺。電子郵件服務禁止你的程序發送是不是通過NIDS匹配到了部分特徵

自己的程序發給別人用,如何避免被殺毒軟體殺了?

1、 加花、夾殼的方式來繞過殺毒軟體

2、 嘗試修改調用到的「讀寫、分析」函數,用功能類似的函數代替嘗試,如果不行的話,嘗試定為修改特徵碼

3、 如果是公司研發的程序,可以進行數字簽名


偷偷告訴你,你保護費沒交

或者上傳論壇解除誤報,這個看心情


多半是啟發查殺,你軟體的行為肯定和某些病毒類似所以就被報了

如果用得人很多,簽名然後去報白名單。

人少你就一步步注釋模塊看那個部分除了問題吧


所以,還不快卸了殺毒軟體


刪了殺軟


是360嗎?之前寫的程序就360報有病毒,就去查了一下,結果發現是白名單機制。

你把自己的程序打包發給他們,會幫你添加到白名單里。就不報了。


二分法

網上找找免殺工具,有教程,定義哪裡的指紋,然後定位程序代碼。


推薦閱讀:

體積小的軟體佔用內存就小嗎?
在Linux下,如何強制讓GCC靜態鏈接?
多線程網路編程中如何合理地選擇線程數?
補碼10000000為什麼可以表示-128?
造輪子厲害是一種什麼樣的體驗?

TAG:編程 | 信息安全 | 殺毒軟體 | 反病毒 |