選單

剛入職就寫了個bug,把幾萬使用者搞藍色畫面了···

這幾天看到公司有校招的同學不斷入職,抬頭一看又是7月9號了呀。

昨天7月9號,不算實習,正式工作滿7年了,7年光陰,彈指一揮間。

七年前的昨天,簽訂勞動合同加入我的第一家公司:百度。

說來也挺奇怪,我本來校招投遞的崗位是C/C++開發崗,結果由於面試過程中,面試官看我在核心技術、逆向分析技術和底層系統程式設計上上有一些經驗,於是把我分到了核心攻防組,做驅動開發。

那時候我們團隊分了兩個方向:

1、漏洞安全攻防

2014年,正是微軟宣佈停止對Windows XP技術支援的時候,為了守護國內數量眾多的XP使用者(說是守護,其實就是搶佔市場),各個安全廠商都開始推出XP安全防禦產品,其中比較出名的就是360的XP盾甲。

國內的信安評測機構CNCERT搞了一個XP安全挑戰賽,隔幾個月就來一次PK,在不同的XP電腦上分別裝上各家的安全產品,然後使用一些漏洞EXP進行攻擊,看看誰守得住。主要的幾個玩家就是360、騰訊電腦管家、金山毒霸、北信源,還有就是百度。

咱們團隊中的漏洞安全攻防組就是負責這個方向,把XP上能使用的漏洞基本上全都擼了一遍,然後把更高系統Win7、Win8上的一些安全機制(比如DEP、ASLR等等)透過核心驅動的方式移植到XP上去,以增強XP的安全能力,抵禦安全攻擊,贏得比賽。

我記得360的XP盾甲做了一個功能,Windows XP啟動時,伴隨啟動進度條的出現,會出現經典的LOGO,360把這個logo改了,居然改成了360的logo,當時年輕的我被震的一愣一愣的,居然還有這種騷操作。

不過很快,身邊的同事就拿到ntldr進行了逆向分析,找到了360這一招的原理,我們也照貓畫虎,把這個LOGO換成了咱們百度的,不過沒有推到產品上,估計會被噴的,只當是技術研究罷了。

團隊中的成員好多都是從360挖過來的大牛,那段時間,跟著這些大佬們學到了許多東西,我在二進位制漏洞方面入門差不多就是那個時候。

2、競品攻防對抗

我主要的精力是放在這一塊的。如果說前面第一個方向是和漏洞攻擊做對抗,那這個方向就是和競爭對手打交道,這一部分更加有意思。

競品對抗分為三塊,安裝、啟動與最佳化、反解除安裝。

安裝,就是競爭對手會想進一切技術手段對我們的產品進行圍追堵截,如果你的電腦上安裝了競品,可能你下載了一個百度防毒的安裝包,安裝莫名報錯,各種依賴缺失,甚至連安裝包都下載不成功,各種情況都有。

實際上,是競爭對手的產品在背後作祟,當它識別到百度的產品在安裝時,會各種使絆子,一開始透過檔案MD5來識別,我們官方釋出的每一個安裝包的MD5都會第一時間被競爭對手拉入黑名單,一遇到直接就被幹。

後來我們改了策略,安裝包下載自動隨機生成,每一次下載的MD5都不一樣,這樣才勉強逃過絞殺,不過對手也不是吃素的,後面又改成檔案特徵識別,比如檔案內部含有“baidu”等字串,就列入黑名單,那段時間,百度網盤和百度音樂等幾款客戶端軟體還因此被殃及過。沒辦法,我們只好再次抹掉這些特徵,或者進行加密,不讓它們明文出現。

再後來,對手改成了透過檔案圖示來識別對手,提取PE檔案的圖示識別是不是我們,總之,在這個過程拉鋸了很多回,非常有意思,各種損招都有。

啟動與最佳化,這是更有意思的部分。躲過了安裝這才是闖過了第一關,接下來的日子,每一天都充滿了危機。

可能某一天,使用者什麼也沒做,我們的產品就起不來了,這叫開機啟動使絆子,讓我們起不來。

還可能競品可能彈個窗告訴你:記憶體吃緊,趕緊最佳化。然後你一點加速球,對手就把我們的程序幹掉了,甚至把我們直接都解除安裝了,檔案、程序、登錄檔啥也沒了,消失的悄無聲息。

那我需要做的當然就是對抗競品的這些騷操作,解除安裝必須由使用者手動透過控制面板或者我們自己的解除安裝軟體發起,需要識別競品的解除安裝行為,攔截刪檔案、殺程序、刪登錄檔等一系列操作。

任何一個安全產品都有主動防禦的功能,直接呼叫系統API進行上面的操作肯定會被我們的主動防禦攔截掉,對手也深知這一點。所以,想要幹掉我們,對手得在核心模式下,用驅動調一些比較底層的函式繞過我們的安全防禦。

那我們要做的就是和它進行對抗,直接的核心硬碰硬不是好辦法,一不小心容易把電腦幹藍色畫面,我們選擇了比較巧妙的一招:攔截通訊。

對手要搞我們,他們處於Ring3模式下的應用程式總得和他們的Ring0模式下的核心驅動程式通訊吧,就是DeviceIOControl,所以我們逆向了他們的通訊協議,一旦發現要搞的目標是我們,就把這條訊息攔截掉,這樣他們的驅動收不到訊息,也就不知道要搞我們了。

在這一部分,我們進行了好幾個月的對抗,對手不斷變化通訊協議,不斷變化通訊的裝置名稱,甚至加密傳輸,我們也就見招拆招,兵來將擋,水來土掩。

後來發現我們總是攔截他們的通訊,他們決定不再通訊了,先把這事情記錄起來,記錄到檔案、登錄檔等各種地方,等到關機的時候,我們的驅動程式已經停掉了,他們再來幹這事,或者放到開機的時候,他們的驅動比我們先載入,我們還沒起來就被幹掉。

於是戰場又轉移到了關機和開機時刻,驅動停止順序上,比誰後解除安裝,最後留下來的就有後發優勢,可以進行復活操作,兩邊互相搶,結果就是使用者的電腦可能關機關半天都關不了。除了關機順序,還會逆向分析它到底把資訊記錄到了哪裡,把這個資訊刪掉,也能自保。

在這過程中,又對抗拉鋸了好幾個月,比較有意思的是,對手似乎和我們達成了某種“默契”,專挑每週五下班的時候,更新他們新的策略,讓我們加班,真是太不講武德了。

隨著我們DAU的不斷增長,除了一味的防守,我們也開始嘗試給競品使使絆子,也讓他們嚐嚐這種滋味兒,正所謂以彼之道,稍加修改,還施彼身,其樂無窮,我們也來解除安裝他們,刪他們檔案,殺他們程序,刪他們登錄檔。

剛剛入職就參與這種專案,著實對技術是有非常大的挑戰,不管是逆向分析,加解密技術,還是核心攻防技術,除錯分析技術,程式設計功底都是非常大的考驗,那段時間寫程式碼非常謹慎,因為一個不小心,可能就會導致成千上萬的使用者電腦藍色畫面。沒錯,我就因為寫了一個bug,好像是一個指標釋放後未及時置空,導致上萬的使用者電腦藍色畫面了,把剛剛入職不久的我嚇得半死。

故事的結尾,可能大家想不到,我們一直和競品A做對抗,和另一個競品B聯合對抗A,頗有種三國時代,聯吳抗曹的味道。但在臨近年關的時候,競品B突然在背後狠狠捅了我們一刀,全面解除安裝我們,一個週末,DAU掉了近千萬,年終目標頃刻化為烏有。

那段日子,百度為了推廣他的安全產品,做了不少過分的事情,各種捆綁,全家桶,很多中高層領導為了KPI,寧願犧牲口碑。因為和競品做對抗,導致產品怎麼也解除安裝不掉,被使用者罵的很慘。據說競品B要搞我們的原因就是不小心推廣到了他們公司一個高管的電腦上,還死活解除安裝不掉,於是才有了後面的事情,當然這只是道聽途說,不知真假。

後來,我也厭倦了這樣的產品和工作,如果是和病毒木馬做鬥爭倒也罷了,拿使用者的電腦當戰場互相拼殺,實在不是什麼光彩的事情。

恰逢我也想謀求技術轉型,於是開始轉向新的方向,咱們下次再聊。