甚麼是加密?甚麼是解密?
我想我根本不用在廢話一次
今天我是要分享自己對這些東西研究成果
我會簡化很多繁瑣過程來盡量達到易讀性
一樣先告知應有具備條件
至少看得懂組語、有能力處理IO文件、會寫程式
使用的工具 X64DBG、HXD、IDA
用來講解的檔案
首先我們看一下這張圖
這張圖用在實驗檔案上是大同小異的
我們先用X32開啟程式
喔對了它本身有簡單的防DEBUG功能
F9執行遊戲直到
像這樣
loading...顧名思義就是在載入資料,載入DATA所有的資料
所以這邊得出了一個重點,它正常在處理所有加密的文件IO
而如果你是資工生,你一定有操作過如何處理文件IO(FOPEN之類的)
所以我們點選x32功能的符號找到檔案名稱 ->右鍵->點選跟隨入口點
我們將跳到程式指定的地方
然後對其目標右鍵 -> 搜尋 - >當前模組 ->字串引用
幸運的話我們可以從字串中獲得有用的消息(這邊一定有 不然怎麼做教學)
回到剛剛的文件IO問題,當我們使用FOPEN這類功能時,它一定有一個參數必須設定
這邊講了需要檔名和重要的(((模式)))
所以我們來找找字串是否有((模式))的字串
這之前我們先用HXD打開
其中的一個檔案來看看
很明顯地告訴我們這是一個二進制文檔了(binary file)
所以fopen的模式必定是讀取二進制文檔的模式
所以我在搜尋字串的地方打上rb
變成這樣
我們可以看到一些字串是符合我們需要的,但是好像不只一個
因為我們不知道那些是在哪個時候運用的,所以我全部都下斷點(F2)
然後reload程式
F9直到下斷點的地方
這邊將是第一個觸發 fopen功能的地方
但是我們要如何知道加解密演算法的地方呢???
我無法告訴你快速取得的方法,一切都看造化
不過呢我們目前可以知道絕對是在這個位址的後面
還有這個是很久以前的東西,在安全保護方面做得很簡單
我原本是慢慢分析出來的,直到我發現他們的字串引用
"Decode"
點選第一個
到這邊我也了解到了這個程式用到一些功能會先推入字串再來做操作
所以我們打開IDA
到這個位址
IDA很好的幫我們把命名這個變數名稱
這張圖還出現了另一個自動命名的變數名稱
所以這邊跟解密演算法是89不離10了
往下拉還發現了中文字串
有意思喔(看來老外的資料是拉亞洲的資料)
拉到後面後整個不演了
發現解密演算法 0x9B0C00開始 0x09B0C20結束
我們回到X32DBG觀看
準備來分析這段程式碼的作用
在0x9B0C02的地方下斷點然後按F9讓他跑到這邊
首先我們發現了bl 會得到 byte ptr ss:[esp+24]的數據,al 則是byte ptr ds:[ecx+esi]的數據
然後再把bl的東西放到dl裡面,al的東西再覆蓋到bl,然後dl跟0x55做and邏輯
al跟0xAA做and邏輯,做完後al再跟bl做or邏輯,得到的答案就是解密的資料
而這個解密資料(al)放回byte ptr ds:[ecx+esi]裡面,ecx加一,ecx跟ebp做比較,
如果ecx大於ebp就跳出這個迴圈,如果沒有將用al的數據給bl的數據做鑰匙
這邊在簡單整理一下(虛擬碼)
-----------------------------------------------------------------------------------------------------
從中得知al是要解的數據,bl是解密的鑰匙,ebp是數據大小
我們重開隨便找一段文件資料來做實驗
ebp是數據大小所以我去找一個比較大的資料片段做實驗
這段資料大小0x0011BD5F(1162591) 長度
還有它的鑰匙是 0x2f
我們可以從ecx+esi*1 看到它的資料頭
點選資料視窗 -> ctrl + G -> 選上ecx+esi*1
看到了記憶體隨機配置的位址後
我將使用HXD拉資料
請打開HXD ->附加->開啟記憶體->點選實驗的程式
變成這樣
然後跳到你得知的位址
我這邊是0x1027C020
跳到這邊後它的資料如果你怕不正確可以自行跟x32dbg顯示的自行比對
之後請點選編輯->選擇區塊
我們得知長度是0x011BD5F
所以我先打上去了
確定後它會框起這些資料,複製起來並新增一個空白文件貼上去
儲存起來
然後比對一下加密文件跟解密文件
然後用自己解密的文件跟程式解密的文件做比對
底部
你會發現我的code會多一個2F
不過原因是甚麼不重要去掉就好(我是廢物敗類窩囔廢)
從這邊可以發現解密如此簡單,那加密回去呢?再這邊其實也是很簡單
這邊程式流程是向下,那我們逆向就是往上,如何往上?
首先把解密文件的資料顛倒
用HxD 看看文件
從第一格字母就看得出 pak變成kap了
然後再使用解密code來加密還原
看一下顛倒的解密和加密
看得出它已被加密,最後呢,再把加密的文件再顛倒回來
拿它來跟還沒做解密前取到的加密資料做比對
底
到這邊你可以發現我的頭端跟底端又差了一點點,
多0x7、少0x2F(不知道自己錯在哪 因為我是廢物敗類窩囔廢)
總而言之我的作法雖然不完全正確,但是不影響其中內容的差別
今天的就把研究成果都發出來了