轉帖|使用教程|編輯:陳津勇|2019-11-14 11:54:26.550|閱讀 723 次
概述:VMProtect是一款虛擬機保護軟件,是目前最為流行的保護殼之一。本文手動分析了VMProtect加密的x64驅動導入表,歡迎閱讀。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
VMProtect是由俄羅斯人PolyTech開發的,是一個利用偽指令虛擬機的保護軟件,也是當前最強大的虛擬機保護軟件之一,它適用于Windows平臺本地編譯的目標程序,支持EXE、DLL、SYS。
經過VMProtect處理的軟件,分析難度將大大增加。越來越多的軟件優先考慮使用VMProtect來保護自己的產品。
VMP保護的導入表會把FF 25 offset (call qword ptr[rip+offset])修改為E8 call。
跟進去可以看到先保存了rdi,后面rdi會用于堆棧平衡以及修正返回地址。
然后返回地址也就是+BE081 int 3那一行的地址被保存到rdi。
rdi被加一之后又填充回返回地址,也就是讓返回地址跳過int 3指向正確的BE082 test eax, eax那一行。
這幾步相當于解密導入函數地址,從[imagebase+37DF6+14B606] + 3DDC1A68處取出函數地址放入[rsp]中。
我們用模擬器驗證一下。
[imagebase+37DF6+14B606] + 3DDC1A68 確實= fffff800007165c8=RtlGetVersion uint64_t RtlGetVersion_import = 0; uc_mem_read(ctx.m_uc, ctx.m_ImageBase + 0x37DF6 + 0x14B606, &RtlGetVersion_import, 8); RtlGetVersion_import += 0x3DDC1A68; std::wstring RtlGetVersion_importfrom; FakeAPI_t *RtlGetVersion_importapi = NULL; if (ctx.FindAPIByAddress(RtlGetVersion_import, RtlGetVersion_importfrom, &RtlGetVersion_importapi)) *outs << "[ ctx.m_ImageBase + 0x37DF6 + 0x14B606]+0x3DDC1A68 = " << std::hex << RtlGetVersion_import << "name: " << RtlGetVersion_importapi->ProcedureName << "\n";
最后一步retn直接飛向[rsp]也就是剛才計算出的API地址并讓最開始push rdi 減少的rsp恢復。
按照這個思路稍加修改甚至可以實現一鍵脫vmp殼,只要用腳本定位所有api call的地址,修復導入表。
慧都16周年·技術服務月,軟件商城優惠券不限量免費領取,購VMProtect享折上折>>>
掃描關注“慧聚IT”微信公眾號,及時獲取最新動態及最新資訊
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: