逆向破解入門之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 原創,歡迎分享本文,轉載請保留出處

「其他文章」