逆向破解入門之VM下浮點演算法提取(附練習程式和原始碼)

語言: CN / TW / HK

前言: 0.說到這個技術可能很多人知道,沒吃過豬肉但見過豬跑,目前來說,很多網路驗證還是用到了相關的東西,本地設計一個相對來說複雜的運算,服務端同樣設計一個一模一樣的運算,本地計算機產生一個隨機數或多個,通過網路傳送到伺服器,伺服器得到一個運算結果和本地的做比較,如果結果不同,那麼則視為非法使用軟體。那麼伺服器演算法和本地是一致的,所以只要得到本地演算法就等於拿到伺服器演算法了。

1.首先準備一份E原始碼.如圖,本次任務就是在vm狀態下找到下面四個數值。

2.將原始碼編譯成exe,然後用OD載入,觀察彙編程式碼。如圖,相關程式碼已經註釋。

3.首先在無殼狀態下,單步跟蹤一下他的演算法,最好能逆出來,如果無殼都不會,那麼加殼就不談了。

4.學會使用OD RunTrace功能,View->Run Trace->logToFile 。然後到需要記錄程式碼的開始點跟蹤記錄,這個不會的自己練習一下

5.簡單的程式設計(print("hello world! \n"))

6.上vmp3.1殼子,殼中提取原理,因vmp沒有對浮點指令的模擬執行,也就是浮點指令還是浮點指令fadd 還是 fadd,不像是push ebp 可能已經面目全非變成幾百上千行的咱不認識的東西,那麼根據這個特性,咱們利用OD的RunTrace功能,在vm中記錄下程式碼,一直到浮點運算結束完畢,這個結束點可以根據情況自行把握記錄下的程式碼,必然存在fild,fadd等加減乘除,所以可以把相關的浮點程式碼提取出來,記錄下地址,再到OD裡面動態跟蹤,即可大概率得到浮點演算法。

7.這麼一小段程式碼trace了近37萬行,可見vmp的可怕,簡單的東西無限複雜,這就是它。

8.處理trace檔案提取浮點運算程式碼

//c#程式碼 拖入檔案處理匹配文字

private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
            StreamReader sr =new StreamReader(path, System.Text.Encoding.GetEncoding("gb2312"));
            string line;
            int count = 0;
            while ((line = sr.ReadLine()) !=null)
            {
                if (line.Contains("fadd") || line.Contains("fsub") || line.Contains("fmul") || line.Contains("fdiv"))
                {
                    textBox1.AppendText(count.ToString()+" :"+ line +"\n");
                    count++;
                }

            }
            sr.Close();
        }

得到結果:

9.OD跟蹤提取演算法

完結,有不懂的兄弟,可以對照例子練習一下,還有一點沒有說道,就是浮點比較,這個大家自己研究一下,步驟基本上不變,比上面的過程更加簡單。

題外話:感覺寫文章比做影片要累的多,錄個影片可能半小時搞定,寫文章就得好幾個小時總結,截圖之類。希望老哥們能給點評分鼓勵一下,後面還會寫一些自己總結的東西。

本篇文章的練習程式和原始碼在下方帖子連結中,歡迎下載並交流溝通

逆向破解入門之VM下浮點演算法提取(附練習程式和原始碼) - 『脫殼破解區』 - 大神論壇 |脫殼破解|易語言|病毒分析|www.dslt.tech

版權宣告:本文由 lichunfeng 原創,歡迎分享本文,轉載請保留出處

「其他文章」