導航:首頁 > 源碼編譯 > mir編譯技術

mir編譯技術

發布時間:2025-01-29 06:23:19

A. 一起來找茬:記一起 clang 開啟 -Oz 選項引發的血案

在位元組跳動終端技術團隊的日常維護和定製工作中,我們關注並推動了開源 LLVM 及 Swift 工具鏈的優化在業務場景中的應用。然而,即使面對復雜而精細的編譯器,我們也遇到了挑戰。本文將分享一次在使用 clang 開啟-Oz 優化選項時發現的編譯器缺陷事件。

公司的視頻組件為了減小包體大小,在編譯時選擇使用-Oz級別,以追求代碼體積上的極致優化。然而,在實現過程中,我們發現視頻組件在導出視頻時會出現內存暴漲現象,最終導致 OOM(Out of Memory)閃退,並且這一問題能夠穩定重現。

通過使用 Instruments 和 Xcode 的 Memory Graph 功能,我們觀察到了大量的 GLFramebuffer 對象被創建,每個對象持有 2MB 的 CVPixelBuffer,從而導致內存佔用大量增加。預期中這些 GLFramebuffer 應該通過復用機制避免重復創建,但日誌分析顯示,每次獲取時都沒有可用的 buffer,導致不斷創建新的 buffer。

我們發現 buffer 的復用依賴於 -[GLFramebuffer unlock] 方法的調用,但觀察到這些 buffer 會在導出任務結束後才被解鎖。於是,我們著手尋找導致解鎖延遲的原因。通過代碼閱讀,我們發現 GLFramebuffer 由一個 SampleData 對象持有,並在 -[SampleData dealloc] 方法中進行解鎖。然而,在使用 autoreleasepool 時,SampleData 對象被推入堆棧並堆積起來,導致內存暴漲,符合我們觀察到的 buffer 批量解鎖的現象。

在 ARC(Automatic Reference Counting)環境下,對象的生命周期管理依賴於特定的 C 函數,如 objc_autoreleaseReturnValue 和 objc_autorelease。然而,當編譯器開啟-Oz 優化級別時,該缺陷導致了 SampleData 對象在不應該進入 autoreleasepool 的情況下被推入,從而觸發內存管理相關的優化失效。

為了解決這一問題,我們首先需要關閉 ARC,並在工程中添加一個類以觸發 autorelease 的斷點。通過執行特定操作並結合上下文分析,我們發現內存暴漲現象是由於 -[CompileReaderUnit processSampleData:] 方法中的優化失效導致的。

經過對比,開啟-Os 優化級別時,LLVM 的 MIR outliner 功能能夠有效減少代碼體積。然而,在-Oz 優化級別下,由於 Machine Outliner 的默認啟用,導致了編譯器在代碼復用和優化之間的權衡不當,進而影響了 ARC 優化的執行。

通過對視頻組件代碼邏輯的深入分析,我們發現開啟-Oz 後,特定的匯編代碼生成邏輯未能正確處理 ARC 的生命周期管理,導致原本應該被快速釋放的對象被推入了 autoreleasepool,從而引發了內存管理問題。

為了修復這一缺陷,我們需要關注優化級別的選擇以及編譯器與 ARC 之間的交互。位元組跳動終端技術團隊在處理類似問題時,不僅需要對編譯器優化有深入理解,還需對 ARC 的工作原理有清晰認知,以確保代碼在不同優化級別下的正確行為。

綜上所述,這一事件揭示了開發者在使用編譯器優化時的疏忽,以及編譯器在處理特定優化場景時的潛在缺陷。通過深入分析和優化策略的調整,我們能夠有效解決此類問題,提高代碼質量和系統的穩定性。

B. 如何用java語言對即時通訊軟體進行加密

一、Java軟體加密基本思路
對於應用軟體的保護筆者從兩個方面進行考慮,第一是阻止盜版使用軟體,第二是阻止競爭對手對軟體反編譯,即阻止對軟體的逆向工程。
1、阻止盜版
在軟體運行時對自身存在的合法性進行判斷,如果認為自身的存在和運行是被授權的、合法的,就運行;否則終止運行。這樣即使軟體可以被隨意復制,只要盜版用戶沒有相應的授權信息就無法使用軟體。
2、阻止反編譯
對編譯產生的Class文件加密處理,並在運行時進行解密,解密者無法對軟體進行反編譯。
二、Java軟體加密的總體流程
為了保護用Java語言開發的軟體,我們設計並實現了一個實用、高強度的加密演算法。以下稱需要保護的Java軟體為「受保護程序」,稱對「受保護程序」進行加密保護的軟體為「加密程序」。對軟體加密保護的流程如圖1所示。

三、加密演算法分析設計
1、用戶信息提取器設計
為了防止用戶發布序列號而導致「一次發行,到處都是」的盜版問題,提取用戶機器中硬體相關的、具有唯一性的信息——用戶計算機的硬碟分區C的序列號,並要求用戶將此信息與用戶名一起返回,之後用「序列號生成器」根據用戶返回信息生成一個唯一合法的軟體注冊序列號發回用戶,用戶即可使用此號碼注冊使用軟體。
這個信息提取器使用Winclows 32匯編以一個獨立的小程序方式實現,程序代碼如圖2所示。

2、序列號生成器與序列號合法性判斷函數的設計
序列號生成器與序列號合法性判斷函數中運用RSA加密演算法。在序列號生成器中是使用私鑰將用戶返回的信息(硬碟序列號,用戶名)進行加密得到相應的注冊序列號;在序列號合法性判斷函數中使用私鑰將用戶輸入的注冊序列號解密,再與(硬碟序列號,用戶名)進行比較,一致則調用程序裝載器將程序其他部分解密裝入內存,初始化刪環境並運行程序主體;否則退出。
RSA加密演算法的實現需要使用大數運算庫,我們使用MIRACL大數庫來實現RSA計算,序列號生成器的主要代碼如下:
char szlnputString[]=」機器碼和用戶名組成的字元串」;
char szSerial[256]=[0];//用於存放生成的注冊碼
bign,d,c,m; //MIRACL中的大數類型
mip→IBASE=16; //以16進制模式
n= mlrvar(0); //初始化大數
d= mirvar(0);
c= mirvar(0); //C存放輸入的字元串大數
m= mlrva(o);
bytes to big( len, szlnputString,c);
//將輸入字元串轉換成大數形式並存入變數c中
cinstr(n,」以字元串形成表示的模數」);//初始化模數
cinstr(d,」以字元串形成表示的公鑰」)://初始化公鑰
powmod(c,d,n,m); //計算m=cdmod n
cotstr(m,szSerial);//m的16進制字元串即為注冊碼
序列號合法性檢測函數的主要代碼如下:
char szlnputStringL]=」機器碼和用戶名組成的字元串」;
char szSerial[ 256]=」用戶輸入的序列號」
bign,e,c,m; //MIRACL中的大數類型
mip→IBASE=16; //以16進制模式
cinstr(m,szSerial); //將序列號的16進制轉成大數形式
cinstr(n,」模數n的字元串形式」);//初始化模數n
cinstr(e,」字元串形式的公鑰」);//初始化公鑰
if compare(m,n)==-1) //m<n時才進行解密
{
powmod(m,e,n,c);//計算m=me mod n
big_to _bytes(0,c,szSerial,0); //轉為字元串
return lstrcmp( szlnputString,szSerial);
}
3、強耦合關系的設計
如果在序列號合法性檢測函數中簡單地使用圖3所示流程:

解密者可以使用以下幾種手段進行攻擊:
(1)修改「判斷合法性子函數」的返回指令,讓它永遠返回正確值,這樣可以使用任意的序列號,安裝/使用軟體。
(2)修改判斷後的跳轉指令,使程序永遠跳到正確的分支運行,效果和上一種一樣。
(3)在「判斷合法性子函數」之前執行一條跳轉指令,繞過判斷,直接跳轉到「正常執行」分支運行,這樣可以不用輸入序列號安裝/使用軟體。
為阻止以上攻擊手段,筆者在程序中增加了「序列號合法性檢測函數」與程序其他部分「強耦合」(即增強其與程序其他部分的關聯度,成為程序整體密不可分的一部分,一旦被修改程序將無法正常工作)的要求(見圖1),並且設置一個「完整性檢測函數」用於判斷相關的代碼是否被修改過。當然,基於同樣的原因,「完整性檢測函數」也必須與程序其他部分存在「強耦合」關系。
強耦合關系通過以下方式建立:
在程序其他部分的函數(例如函數A)中隨機的訪問需要強耦合的「序列號合法性檢測函數」和「完整性檢測函數」,在調用時隨機的選擇使用一個錯誤的序列號或是用戶輸入的序列號,並根據返回結果選擇執行A中正常的功能代碼還是錯誤退出的功能代碼,流程如圖4所示。

經過這種改進,如果破解者通過修改代碼的方式破解將因「完整性檢測」失敗導致程序退出;如果使用SMC等技術繞過「序列號合法性判斷函數」而直接跳至序列號正確時的執行入口,在後續的運行中,將因為隨機的耦合調用失敗導致程序退出。破解者要破解軟體將不得不跟蹤所有進行了耦合調用的函數,這顯然是一個艱巨的任務。
4、完整性檢測函數的設計
我們使用CRC演算法算出需進行完整性檢測的文件的校驗碼,並用RSA加密演算法的公鑰(不同於序列號合法性檢測中的公鑰/私鑰對)將其加密存放在特定的文件中,在檢測時先用CRC演算法重新生成需進行完
整性檢測的文件的校驗碼,並用私鑰將保存的校驗碼解密,兩者相比較,相等則正常運行;否則退出。
5、程序載入器的設計
與編譯成機器碼執行的程序不同,Java程序只能由Java虛擬機解釋執行,因此程序載入器的工作包括:初始化Java虛擬機;在內存中解密當前要運行的class文件;使解密後的c:lass文件在虛擬機中運行,在
需要時解密另一個class文件。圖5是用於初始化JVM的代碼:

以上介紹了我們設計的針對Java軟體的加密保護方法,其中綜合運用了多種加密技術,抗破解強度高;使用純軟體保護技術,成本低。經筆者在Windows系列平台上進行測試,運行穩定,效果良好。
在研宄開發過程中,我們還總結出加密保護軟體的一些經驗:
1、對關鍵代碼和數據要靜態加密,再動態解密執行;要結合具體的工作平台使用反跟蹤/調試技術;
2、要充分利用系統的功能,如在Windows下使用DLL文件或驅動程序形式能得到最大的豐又限,可以充分利用系統具有的各種功能;
3、如果可能應該將關鍵代碼存放在不可禚復制的地方;
4、序列號要與機器碼等用戶信息相關以阻止鹽復布序列號;
5、加密流程的合理性比加密演算法本身的強度更重要。

C. explorer.exe病毒!

這個木馬殺除比較棘手,。

這個木馬進入計算機後,產生主要的三個文件是:interapi32.dll,interapi64.dll,exp1orer.exe特別狡猾的是容易和Explorer.exe混淆。它是數字1不是字母l。這個病毒入駐進程以後,會大量的消耗系統資源,並會跟著資源管理器一同啟動。殺除方法如下:

1、關閉Xp系統的還原功能。具體的可以進入組策略查找或是右擊我的電腦屬性,關閉系統還原功能。

2、然後在運行鍵入regedit,打開注冊表編輯器。刪除以下鍵值

[HKEY_CLASSES_ROOT\\CLSID\\{081FE200-A103-11D7-A46D-C770E4459F2F}]
@="hookmir"

[HKEY_CLASSES_ROOT\\CLSID\\{081FE200-A103-11D7-A46D-C770E4459F2F}\\InprocServer32]
@="C:\\\\WINNT\\\\system32\\\\interapi64.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\\CLSID\\{081FE200-A103-11D7-A46D-C770E4459F2F}\\ProgID]
@="interapi64.classname"

[HKEY_CLASSES_ROOT\\interapi64.classname]
@="hookmir"

[HKEY_CLASSES_ROOT\\interapi64.classname\\Clsid]
@="{081FE200-A103-11D7-A46D-C770E4459F2F}"

[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellExecuteHooks]
"{081FE200-A103-11D7-A46D-C770E4459F2F}"="hookmir"

3、重新啟動系統,進入文件夾選項菜單,單擊查看選項卡,顯示隱藏的文件和文件夾,顯示系統文件,擴展名。然後在Windows/WINNT(2000/NT)/system32下找到interapi32.dll,interapi64.dll,exp1orer.exe三個文件,將其刪除就可以了。
(註:exp1orer.exe偽裝成了jpg的圖片格式圖標。小心謹慎。還有文件夾選項卡在殺除病毒後可以自己把它改回到原來的狀態)

還有這些情況你也能造成你說的那些後果

進程名稱: explorer 或者 explorer.exe

所在路徑: (系統安裝目錄盤)C:\windows\explorer.exe
進程全稱: Microsoft Windows Explorer
中文名稱: 微軟windows資源管理器

描述:
Windows 資源管理器,可以說是 Windows 圖形界面外殼程序,它是一個有用的系統進程。 注意它的正常路徑是 C:\Windows 目錄,否則可能是 W32.Codered 或 W32.mydoom.b@mm 病毒。

explorer.exe出錯的幾種可能原因:
1.系統資源不足。如果機器配置低的話建議不要同時開啟太多應用程序。另外可適當加大虛擬內存,特別是經常玩大型游戲。這種情況下升級機器是最根本的解決辦法呵呵。

2.系統文件損壞。檢查explorer.exe的文件大小,正常情況下應該顯示為237k或者238k,如果大小不一致,可運行sfc/scannow掃描系統文件。若explorer.exe程序本身損壞,可以從別的機器上拷貝一個explorer.exe文件到本機,調用任務管理器,接入explorer.exe進程,然後新建任務拷貝新的文件到系統盤\WINNT(2000)或\WINDOWS(XP)目錄下。

3.軟體沖突(特別是右鍵第三方載入項)。譬如輸入法,清華紫光輸入法3.0版本有的時候會出現explorer.exe出錯,取消清華紫光輸入法,用其他輸入法輸入會沒有問題。清華紫光輸入法4.0版本未發現類似問題。蘋果美化版的rar惹的禍,把它卸載了暫時就沒有這個錯誤了,你也可以看是不是安裝了蘋果美化版的rar,有的話,也可以卸載了來看一下。
裝了酒精120%或者酒精52%虛擬光碟機,在番茄 的系統中很容易出現explorer.exe錯誤。卸載有時候會解決問題 。

4.病毒。(wc98pp.dll)
網路協議處理器 - 電子書編譯工具Web Compiler相關。
wc98pp.dll文件本身並沒有影響,很多計算機上都有此文件,但是當explorer.exe出錯的時候,刪除此文件可以解決問題,然後從注冊表中搜索相關鍵值刪除。
usign.dll,有人提到這個文件與wc98pp.dll兩個文件類似,刪除這兩個文件可以清除IE中不斷跳出小廣告。在公司的計算機中未發現此文件。

5.windows升級造成的
大家都知道我們用的是盜版xp,既然是盜版的,肯定會出現各種各樣的錯誤.微軟也不是sb,肯定會搞一些問題來懲罰我們,所以建議大家不要上網自動更新,並且把自動更新關掉(實際上這個更新沒p用)

6.系統內核錯誤。此類情況暫時無法解決,重新安裝系統。

7.內存問題。有人通過更換內存,解決了這個問題,所以這應該是個原因,不過如果這個出問題就比較麻煩了,所以先考慮前面幾個原因。

8.其他原因。計算機運行某個程序等待時間過長,比如讀取數據,尤其是光碟或者外界設備的數據的時候,也會出現explorer.exe出錯。

exeplorer.exe是系統的外殼。這個文件因為開機就被載入到內寸中。所以這個文件通常不會損壞。發生錯誤是因為注冊表的中與exeplorer關聯的項發生異常。原因很多,不好查找。所以一般只有重新安裝系統。如果嫌麻煩,使用啟動盤啟動系統,在恢復控制台中修復

閱讀全文

與mir編譯技術相關的資料

熱點內容
程序員的等級有哪些 瀏覽:725
小學編程教師試講15分試講視頻 瀏覽:225
wincc編譯在哪 瀏覽:474
華為演算法比賽 瀏覽:551
linux防火牆開發 瀏覽:858
plc編程顯示該口不存在 瀏覽:146
命令與征服序列號 瀏覽:594
pdf格式轉化jpg格式的文件 瀏覽:300
新浪收發件伺服器ip地址 瀏覽:875
endnotepdf打開pdf 瀏覽:291
直面演算法與霸權 瀏覽:809
伺服器和工控電腦維保都做什麼 瀏覽:115
文件包加密管理 瀏覽:396
錄加密視頻 瀏覽:13
程序員的上班生活 瀏覽:45
百度網頁下載的軟體在哪個文件夾 瀏覽:551
演算法設計指南pdf 瀏覽:11
蘋果手機安卓系統會顯示什麼 瀏覽:267
命令方塊英文名 瀏覽:875
存在即合理演算法 瀏覽:1002