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、加密流程的合理性比加密演算法本身的強度更重要。
⑵ 現在最好的,im即時聊天軟體,開源的是哪個
FlamingoIM
FlamingoIM是一款輕量級開源即時通訊軟體,其伺服器端、PC端和安卓端都是native應用,自主開發通信協議和界面庫,無第三方庫包裝。適用於理解即時通訊本身的業務。
開發語言:Server:C++,PC:C++,Android:Java,IOS:Objective-C
功能包括網路相關實現。提供兩部高清技術講解視頻,方便學習編譯、部署、架構、模塊實現及學習方法。
鏈接:pan..com/s/1eVaiNR... 提取碼: p6rp
部分截圖展示。
TeamTalk
TeamTalk是蘑菇街開源的一款即時通訊IM,代碼地址為github.com/balloonwj/Te...
開發語言:Server:C++,PC:C++,Android:Java,IOS:Objective-C,Web管理:php
提供源碼解析專題,覆蓋伺服器端、db_proxy_server、msg_server、login_server、msf、file_server、route_server等。
提供服務端網路拓撲圖和客戶端運行截圖。
tinode
服務端代碼使用Go開發,地址為tinode/chat。提供搭建服務部分截圖。
CppGuide
推薦給C/C++開發者的學習資料,涵蓋語言、網路編程、操作系統原理、項目源碼分析、學習方法、閱讀書籍、簡歷指導和求職技巧。
⑶ java實現即時通訊是怎麼做到的
你可以直接找源碼或者使用第三方的sdk做一些開發。可以考慮接入ZEGO即時通訊SDK來實現搏盯,支持Android java開發,集基銀和成方便搏雀,一對一、一對多聊天都可快速搭建,重要的是不擔心消息會丟失,千萬級並發也穩定,可以節省90%開發時間,在線人數無上限。
⑷ 用 SWIG 生成 Java 代碼(IM SDK)
美信拓撲技術分享系列 0x02:Floo-android 開源和高級 API 介紹 代碼開源在 Github,你可以參照生成其他語言版本的 IM SDK。閱讀本文你可以了解: SWIG,一個聯結 C/C++ 軟體與其它各種高級編程語言的開發工具; 一個在生產環境實際使用的 SWIG 案例; 一個跨平台雲服務 IM SDK 的典型設計; 即時通訊 IM 業務 與 API 設計。
SWIG 是一個聯結 C/C++ 軟體與其它各種高級編程語言的開發工具。它主要用於封裝 C/C++ 寫的軟體庫,使之可以被其他高級編程語言調用。現在它支持的高級編程語言包括 Javascript,Perl,PHP,Python,Tcl,Ruby,C#,D,Golang,Java(包括Android),Lua,OCaml,Octave,Scilab,以及 R 語言。美信拓撲的 IM SDK 利用了 SWIG 進行 Java 版本的本地庫封裝。
開源這個庫的主要目的是為了介紹 SWIG 框架,讓開發者了解自動生成代碼的便利性和效率。另一個目的是為了讓開發者能夠根據需要,使用 SWIG 生成其他語言版本的 SDK。如果你使用了 SWIG 並生成了其他語言版本的 SDK,請告訴我們,我們會給予神秘禮物。
美信拓撲跨平台 IM SDK 的設計和實踐主要通過以下架構實現:底層使用 C++ 實現,各平台(Android、iOS、Linux 等)在此基礎上再行封裝,以實現多平台復用。在設計中,美信拓撲使用了先進的多雲架構,包括公有雲服務和私有雲部署,為億級用戶和千萬並發提供支撐。
如何掌握 IM API?一個典型的 IM SDK 包含 40 余類幾百個方法,需要同時兼顧分層設計和靈活性,保證協議實現的質量,支持事件通知和自定義協議等。在移動網路下,要保證消息的有序投遞、軟實時和可靠性,需要全新設計和優化的 IM 協議。
從業務角度看,IM 有三條主線:消息、用戶和關系。消息的核心是聊天,包括單聊與群聊,涉及發送、接收、內容處理等。用戶方面涉及身份設計、登陸鑒權、信息展示等。關系包括好友、群組和黑名單的管理。
美信拓撲的 IM SDK 包含四個主要服務類:BMXUserService、BMXChatService、BMXRosterService 和 BMXGroupService。此外,類庫分為低級 API(同步調用介面)和高級 API(非同步調用介面)兩大部分。
代碼生成使用了 SWIG,生成的 Java 代碼通過 JNI 方式調用底層 C++ 類庫,大部分介面均為同步。高級 API 則使用了更為友好的數據結構,並完成了非同步機制封裝。類庫分為低級 API、高級 API 和工具類三部分。
代碼結構簡單,IM API 相關的頭文件和 so 文件已經放在工程里,運行命令指定輸出 Java 代碼的包名和 floo 頭文件的地址即可。生成代碼的 SWIG 定義文件放在 ./swig/floo.i 里。詳細代碼可以去倉庫里查看。
總的來說,使用 SWIG 生成的代碼性能接近直接調用底層庫,且提供了高級 API 的非同步調用介面,方便開發者集成。美信拓撲 IM SDK 為開發者提供了一個完整的 IM 功能集,包括消息、用戶和關系管理等,適合各種 IM 應用場景。