天天看點

如何寫更安全的代碼?

如何寫更安全的代碼?

技術背景

作為程式開發人員,我們害怕,聽到開發的代碼,被測試出bug;我們更害怕,聽到我們所開發出來的産品上線了,被新手安全研究員給反彙編逆向破解,代碼功能直接被人給盜取了。下面根據我自己的一些項目經驗,跟大家分享兩點如何能開發出相對安全的代碼。以下方案不局限于任何語言代碼開發,是一個相對通用的安全編碼方案。

如何寫更安全的代碼?

字元串的安全方案

如何寫更安全的代碼?

直接使用字元串

不建議使用理由:直接定義使用字元串,因為字元串是一個常量,是以我們直接能在靜态反彙編中直接看到字元串的資料資訊。

如何寫更安全的代碼?

下圖可以很清晰的看懂字元串資訊”ntdll.dll”,這樣就把代碼的字元串資訊直接暴露給大家,這樣大家就可以通過字元串資訊做一些對代碼不安全的事情了。

如何寫更安全的代碼?
如何寫更安全的代碼?

字元串指派到數組使用

建議使用理由:将字元串寫到數組裡面并進行指派,使得字元串存放在堆裡面,這樣在程式的字元串常量資訊就無法直接看到字元串資訊,這樣進行靜态分析(IDA)的時候字元串資訊就沒有展示了,這個需要進行動态分析(ollydbg)才能分析到字元串資訊。

如何寫更安全的代碼?

下圖展示的是通過将字元串資訊存儲在數組中的彙編代碼,在實際的彙編代碼中展示的是一串資料,而不是直接的字元串,這就無法直接看到字元串資訊去了解代碼,要想了解這串字元串資訊,那麼就需要去做動态調試分析。進而加強代碼的安全性。

如何寫更安全的代碼?
如何寫更安全的代碼?

調用系統函數安全方案

如何寫更安全的代碼?

直接調用系統的函數

不建議使用理由:我們在編碼過程中,有很多功能系統都已經有提供的函數接口,一般情況下我們都是直接調用系統函數直接進行實作功能。但你知道嗎?你這樣直接調用系統函數在一些場景下是不安全的,當你的程式在被安全逆向研究的時候,直接可以通過程式的導入表,以及反彙編看到調用的系統函數,這樣我們隻要一查下系統函數的功能,那麼就可以知道大概的功能點,還有隻要一挂鈎(HOOK技術)上系統的函數,那麼你所調用的系統函數的功能就失效了。

如何寫更安全的代碼?

下圖展示上面函數通過調用系統函數實作的彙編代碼。大家可以直接通過展示的系統函數去分析功能。

如何寫更安全的代碼?
如何寫更安全的代碼?

自定義實作函數再調用函數

建議使用理由:我們對于關鍵功能函數建議還是采用自己去實作函數功能,再去調用,這樣可以加強程式被直接分析的難度,進而加強程式的安全性。

如何寫更安全的代碼?

下圖是自定義實作函數調用的彙編代碼,可以從下面彙編代碼看到關鍵函數是自己實作的,那麼要了解該函數功能就需要進入到函數内部去做分析。這進而加強了關鍵函數功能的相對安全。

如何寫更安全的代碼?
如何寫更安全的代碼?

總結

最後說明,以上是經過項目實踐總結出來的安全開發方案。我們在項目開發中需要寫高内聚,低耦合的代碼,同樣也需要寫一些沒有bug的代碼,更需要寫一些更加相對安全的代碼,更需要寫一些能增加逆向破解者分析程式的難度(注:這裡會有專業人士會說代碼直接加VMP保護,不啥問題都沒有了嗎?不過這這裡隻進行說明代碼開發的一點安全思路),這個才是我們程式員的終極目标,希望本文所闡述的思想能夠讓大家有所啟發。

如何寫更安全的代碼?