日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VMprotect静态跟踪 字节码反编译

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VMprotect静态跟踪 字节码反编译 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • VMprotect靜態跟蹤
    • (1)虛擬執行特點:
    • (2)執行引擎的虛擬執行
    • (3)分析條件跳轉的兩條出邊
  • 字節碼反編譯
    • (1)中間表示語言
    • (2)指令化簡和優化
    • **常數收縮:**
    • **活躍變量分析:**
    • **刪除無關代碼:**
    • (3)轉換匯編指令——樹模式匹配
    • (4)歸類映射寄存器
    • (5)轉換匯編指令——動態規劃
    • (6)寄存器染色
    • **(一)基本塊內的寄存器輪轉:**
    • **(二)基本塊間的寄存器輪轉:**
    • (三)寄存器的二義性問題
    • Push\Pop的二義性:
    • (四)識別寄存器的二義性步驟

VMprotect靜態跟蹤

(1)虛擬執行特點:

  • 虛擬執行是靜態分析與動態執行的一個折中辦法
  • 虛擬執行時對內存訪問做了一定的控制以防止出現異常
    允許讀寫靜態內存與堆棧訪問
    忽略其他內存訪問與修改
  • 解決了異常問題后,就可以從入口點一直虛擬執行到出口了

    (2)執行引擎的虛擬執行

    分析虛擬機的一般傳統方法:

    • 找到關鍵位置
    • 動態執行并使用記錄斷點記錄數據
    • 輸出記錄日志

    優點:

    • 尋找關鍵位置時間相對較短

    缺點:

    • 多路徑時只能走其中一條路徑
    • 分析多個虛擬機時要重復做相同的工作

    虛擬執行方法:

    • 虛擬執行代碼
    • 根據已分析字節碼靈活控制代碼

    流程:

    • 輸出記錄日志

    優點:

    • 虛擬執行不會對系統造成傷害
    • 完整的字節碼流程

    缺點:

    • 指令正確但操作數的值不可靠
    • 復雜度較高,開發時間較久

    (3)分析條件跳轉的兩條出邊

    因為虛擬執行是不依賴運行時信息的,所以它無法判斷應該走哪一條,必須把兩條邊都走過一遍

    • 基本塊(BasicBlock)執行前備份運行時環境
    • 執行到跳轉處分析指令流,獲得修改路徑關鍵點
    • 退回基本塊起始位置
    • 重新執行并控制路徑

    字節碼反編譯

    (1)中間表示語言

    VMP的Hanlder只能算是低級中間語言,缺少一些例如數據依賴,流程走向等信息,還不滿足反編譯的條件。需要將其轉換為包含更多信息的高級中間語言形式

    Push c Push b Add. d Pop EFL Pop A

    轉換后:

    Stk1=push c Stk2=push b Stk3,Stk4=Add. d stk2,stk1 EFL=stk4 a=stk3

    轉換后:

    Stk1=c Stk2=b Stk3,Stk4=Add. d stk2,stk1 EFL=stk4 A=stk3

    優點:

  • 去掉了對堆棧的依賴,轉為直接關聯變量
  • 表達式被轉換成SSA(靜態單賦值)形式,方便對指令做優化處理
  • (2)指令化簡和優化

    常數收縮:

    Push 1A2FBCA0 Push F80499D8 Add. d Pop EFL

    采用常數收縮后:

    Push 12345678

    活躍變量分析:

    Stk0=Ctx24 Stk1=Ctx10 Stk2,EFL1=Add. d Stk0,Stk1 Ctx28=EFL1 Ctx30=Stk2 Stk3=Ctx30 Stk4=1111 Stk5,EFL2=Add. d Stk3,Stk4 Ctx28=EFL2 Ctx34=Stk5

    去除中間變量后:

    Ctx30,Ctx28=Add. d Ctx24,Ctx10 Ctx34,Ctx28=Add. d Ctx30,1111

    去除無用變量后:

    Ctx30=Add. d Ctx24,Ctx10 Ctx34,Ctx28=Add. d Ctx30,1111

    刪除無關代碼:

    VMP在生成的字節碼中夾雜了一些自己的指令流,這些指令與原匯編代碼沒有任何關系,且對還原分析沒有任何好處,只會起到干擾的作用,需要根據特征制定一些規則來識別這些垃圾指令

    (3)轉換匯編指令——樹模式匹配

  • 文本表達轉換為樹形表達
  • 收集轉換規則(這是最麻煩的一個過程,需要分析VMP將匯編生成字節碼的特征來收集將字節碼逆向轉換回去的規則,這是一個不得不做的體力活)
  • 使用匹配規則迭代匹配匯編指令
  • Ctx30=Add. d Ctx24,Ctx10 Ctx34,Ctx28=Add. d Ctx30,1111

    匹配結果如下:

    (4)歸類映射寄存器

    經過迭代后的最終結果是這樣:

    Add Ctx30(Ctx24),Ctx10 Add Ctx34(Ctx30),1111

    雖然已經轉換為匯編指令,但是還無法確定寄存器到底是哪一個,以目前所知的信息也的確無法判斷,步過,我們可以盡可能的確定一些信息,以供后面的分析參考。

    在轉換規則中,預先明確定義了Add指令的第一個參數與結果是同一個寄存器(其他指令也是差不多,類似xchg的指令除外),所以可以推理得到,在指定的區別內Ctx34,Ctx30,Ctx24,是同一個寄存器,這樣后面在專門針對寄存器識別的分析時,就可以一下確定這四個寄存器所映射的寄存器了

    (5)轉換匯編指令——動態規劃

    首先來看兩段指令

    mov eax ,dword ptr[dei+0x100] add edi,100

    其中第一條里面包含了第二條的指令,第一條的權值應該設得更高

    add edi,100 Lea ebx,[edi+100]

    兩條指令僅僅是目標寄存器不同,兩條指令的權值應該相等

    所謂動態規劃,通俗的講就是制定一些規則,根據實際情況來選擇最終匹配結果
    這里的意思是對每一個匹配規則設一個權值,使用計算后值最大的那個匹配規則來進行轉換
    第二段的情況有些特殊,其中兩條指令唯一的不同只有目標操作數
    。Add指令認為目標操作數與源操作數1相同,而lea指令無此限制。當出現權值一樣的情況時,可以同時作為結果,在識別出寄存器后,再根據實際情況來匹配規則,在這兩個指令中選出更像的哪一個。

    (6)寄存器染色

    要識別前面所代表的寄存器,要從以下幾個方面進行分析:

  • 初始化虛擬機時各項所映射的寄存器
  • 根據匯編轉換規則映射或者結束映射某項到某寄存器
  • 退出虛擬機時通過彈出各項時確定各項最終映射的寄存器
  • 從這三方面可以大體推理出各項所映射的寄存器

    但僅僅是這樣的話只有在沒有跳轉指令的字節碼中,成功率才最高。因為還得考慮寄存器輪轉

    (一)基本塊內的寄存器輪轉:

    基本塊內的寄存器輪轉比較容易簡單,只要轉換規則正確,就可以識別出寄存器

    (二)基本塊間的寄存器輪轉:


    在執行set.jmp之前,將Context中所有位置的值都臨時存放到了堆棧中,跳向目標地址后又再全部把它彈出到不同位置中去,這樣就完成了一次輪換

    它比基本塊內的寄存器輪轉更麻煩,因為其中涉及到了二義性的問題

    (三)寄存器的二義性問題

    寄存器的二義性問題是一個很嚴肅的問題,因為如果不能正確分析和處理,將會在成一子放錯,滿盤皆輸的局面。
    寄存器的二義性由指令的二義性衍生出,要解決指令的二義性,需要先解決寄存器的二義性問題。

    Push\Pop的二義性:

    Push\Pop在VMP中存在一種二義性,即傳值與傳引用。

    傳值:
    當pop指令的作用是傳值時,表示員項中國的值放到目標項中去,所映射的寄存器不變。

    傳引用:
    當pop指令的作用是傳引用時,不但將值從源項放到目標項中去,且目標項所映射的寄存器也將被覆蓋

    傳值是一般情況,即匯編指令的Push\Pop指令時,傳引用時特殊情況,如寄存器輪換等。

    Add與Lea等其他指令的二義性:
    這兩條指令廣義上講也是Push\Pop的二義性:

    為Add指令時,pop指令的含義為傳引用

    為Lea指令時,pop指令的含義為傳值

    (四)識別寄存器的二義性步驟

  • 根據轉換規則盡可能確定一些特性,縮小可能的寄存器范圍
  • 無法判斷的寄存器將其加入此項的可能性列表中,并建立起傳遞鏈表
  • 退出虛擬機時可知各項真實的寄存器,排除其他可能的寄存器
  • 確定寄存器后,再重新排除有二義性的指令
  • 總結

    以上是生活随笔為你收集整理的VMprotect静态跟踪 字节码反编译的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。