新版飛信聊天記錄逆向分析全過程


自學逆向有段時間了,今天來一帖!

直接進入正題:

安裝飛信,登錄飛信,制造一點聊天記錄。
在 C:\Users\%用戶名%\Documents\Fetion\"飛信號" 路徑下發現了一個文件 V5_History.dat (可以在飛信設置里面點擊打開歷史記錄文件位置直接過去)
看名稱就知道啦,飛信數據庫文件就是這貨。
UE打開觀察此文件,一看就知道肯定經過加密的。不做多的解釋
<ignore_js_op>
打開飛信主目錄,觀察飛信目錄中的dll。
看dll名稱,猜測消息記錄處理的dll,飛信主目錄內發現目錄 Data\History,目錄中有個History.dll,猜測這貨是處理歷史記錄的dll
於是打開OD,OD打開Fetion.exe,ALT+E 跟隨History.dll,大概喵了幾眼,然后CTRL+N查看模塊中的名稱,
發現一個_FhOpenDB,看名稱就知道這是干嘛的了,根據OD顯示,此函數出自Fhlib.dll,於是用 eXeScope 查看此dll的導入導出信息
在導入信息中發現導入了ADVAIP.DLL(非常重要!!!!),此DLL是Windows自帶的加密算法庫,於是打開 IDA Pro,准備開始分心Fhlib.dll.
在Import表里面發現了 CryptCreateHash、CryptHashData、CryptDeriveKey、CryptDestroyHash等很顯眼的函數!!
感覺告訴我,這就是解碼部分,
於是逆向了這部分代碼,完成過后用OD跟蹤,確定這幾個函數的可變參數內容,哈哈,最重要的生產hash和key的密鑰居然是飛信號,立刻打開VS寫代碼,
一舉成功,成功將V5_History.dat解碼,用UE打開觀察解碼后的文件,我艹!!文件簽名好熟悉,這不是我常用的 sqlite3 么?而sqlite3是個輕量級小型開源數據庫。
接着用數據庫可視化查看工具查看數據庫內容,聊天記錄一覽無遺。破解成功。
附上代碼!!!

[C++]  純文本查看 復制代碼
01 * - 將解密的數據庫文件放入系統臨時目錄
02 */
03 int IS_FetionV5History::DeCryptFetionDB()
04 {
05 HCRYPTPROV hProv = NULL;
06 HCRYPTHASH hHash = NULL;
07 LPCTSTR lpszPwd = (LPCTSTR)szFetionNum;//密碼,飛信號
08 HCRYPTKEY hKey = NULL;
09  
10 CryptAcquireContext(&hProv, 0, "Microsoft Enhanced Cryptographic Provider v1.0", 1, 0xF0000000);
11 CryptCreateHash(hProv,0x8004,0,0,&hHash);
12 CryptHashData(hHash,(const BYTE *)lpszPwd,strlen((const char *)lpszPwd),0);
13 CryptDeriveKey(hProv,0x6801,hHash,0,&hKey);
14 CryptDestroyHash(hHash);
15  
16 /**************************************************************/
17 HANDLE pInFile,pOutFile;//文件句柄
18 DWORD dwReadLen = 0x400 ,dwReadSize ,dwWriteSize;//想要讀取的數據長度;實際讀取文件大小;實際寫入數據
19  
20 {//打開源文件
21 pInFile = ::CreateFile(strEvidencePath.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING,
22 FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_READONLY, NULL); //用這個函數比OpenFile好
23 if( pInFile == INVALID_HANDLE_VALUE)
24 {
25 CloseHandle(pInFile); //一定注意在函數退出之前對句柄進行釋放。
26 return -1;
27 }
28 }
29 {//打開寫入文件
30 pOutFile = ::CreateFile(strDstPath.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
31 FILE_ATTRIBUTE_NORMAL, NULL); //用這個函數比OpenFile好
32 if( pOutFile == INVALID_HANDLE_VALUE)
33 {
34 CloseHandle(pOutFile); //一定注意在函數退出之前對句柄進行釋放。
35 return -1;
36 }
37 }
38 /**************************************************************/
39 BYTE szBuf[0x400 + 1] = {0}; //__in__out 輸入加密內容,輸出解密后內容
40  
41 //循環讀取文件
42 do
43 {
44 ReadFile(pInFile, szBuf, dwReadLen, &dwReadSize, NULL);
45  
46 if (dwReadLen < dwReadSize)
47 CryptDecrypt(hKey,0,TRUE,0,szBuf,&dwReadLen);
48 else
49 CryptDecrypt(hKey,0,TRUE,0,szBuf,&dwReadSize);
50 //寫入文件
51 WriteFile(pOutFile,szBuf,dwReadSize,&dwWriteSize,NULL);
52  
53 memset(szBuf,0,0x400 + 1);
54 }while( dwReadSize == dwReadLen);
55  
56 CloseHandle(pInFile);
57 CloseHandle(pOutFile);
58 return 0;
59 }//DeCryptFetionDB()

https://www.0xaa55.com/forum.php?mod=viewthread&tid=1787&extra=page%3D1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM