成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊虛擬機保護的技術

云計算 虛擬化
所謂虛擬機保護技術,是指將代碼翻譯為機器和人都無法識別的一串偽代碼字節流;在具體執行時再對這些偽代碼進行一一翻譯解釋,逐步還原為原始代碼并執行。

[[224947]]

虛擬機概覽

所謂虛擬機保護技術,是指將代碼翻譯為機器和人都無法識別的一串偽代碼字節流;在具體執行時再對這些偽代碼進行一一翻譯解釋,逐步還原為原始代碼并執行。

這段用于翻譯偽代碼并負責具體執行的子程序就叫作虛擬機VM(好似一個抽象的CPU)。它以一個函數的形式存在,函數的參數就是字節碼的內存地址。

將虛擬機應用到商業中的保護殼現有三款:Vmprotect,themida和 execrypt。

虛擬機架構

我們知道,代碼中的指令多種多樣,組織形式也千變萬化;虛擬機不可能針對每一種具體情況都進行翻譯處理。必須對所有可能遇到的指令先進行抽象歸類,然后分解為若干簡單的小指令,再交由各個專門的子程序(handler)去處理。

學過編譯原理的同學應該都知道三元式代碼吧,也叫做3地址代碼(three adress code)。即不論多么復雜的賦值公式,都可以分解為數個3地址代碼式序列。(什么是3地址代碼,1段3地址代碼只完成1次運算,譬如1次二目運算、1次比較,或者1次分支跳轉運算。)

與此類似,不論多么復雜的指令,都可以分解為一串不可再分割的原子指令序列。

虛擬機(CPU)的體系架構可分為3種,基于堆棧的(Stack based),基于寄存器的(Register based)和3地址機器。我們只講述基于堆棧的虛擬機架構(Stack based);這種架構的虛擬機需要頻繁操作堆棧,其使用的虛擬寄存器(虛擬的eax、ebx等等)保存在堆棧中;每個原子指令的handler都需要push、pop。

現在的CPU都有大量的寄存器,堆棧一般只是在函數傳遞參數時使用(譬如PC機用的x86系列CPU)。但也有一些CPU只操作內存,沒有堆棧,也沒有寄存器。使用這種CPU的機器稱之為3地址機器。

基于堆棧的CPU或虛擬機沒有臨時變量、寄存器的概念,所有的東西都放入堆棧。由于指令中不需要指定操作數,所以其指令相對基于寄存器的要短。也因此相對簡單,在嵌入式系統中運用較多。用于保護代碼,我們也選擇這種。

舉例,譬如指令add,基于堆棧的CPU首先從堆棧里Pop兩個數,然后將兩數相加,再把和Push到堆棧。Add指令只占用1個字節。而基于寄存器的CPU對應指令為 add Reg1,Reg2,需要3個字節。請仔細想象一下沒有寄存器的CPU,它的指令是怎樣的,該會是多么簡潔。當然,指令簡潔帶來的缺點就是效率低下。

我們這里談的虛擬機保護技術,就是把基于寄存器的CPU代碼,改造成基于堆棧的CPU的偽代碼。然后再由基于堆棧的虛擬機(CPU)對偽代碼解釋執行。

指令系統

關鍵在于設計一個虛擬的基于堆棧的虛擬機(CPU)的指令系統。這個指令系統越簡潔,復用性越高越好。

還是以add 指令為例。X86系列CPU的add指令有許多格式,譬如:add reg,imm 、add reg,reg、add reg,mem、add mem,reg等等。而基于堆棧的虛擬機CPU則沒有這么多花樣,就一個單單的add指令,參數和返回都是在堆棧里。

我們需要為我們的虛擬機CPU模擬實現這樣的add命令:

而原有的add命令的參數,我們需要翻譯為 push 命令 。根據push 的對象不同,需要不同的實現:

有Push指令了,也得有Pop指令:

基于堆棧的虛擬機指令系統就是這樣簡單的:單字節的動作指令(譬如add、dec),以及各式各樣的push、pop等堆棧操作指令。沒有復雜的寄存器與內存操作。我們需要把x86的CPU指令翻譯成虛擬機CPU的指令,譬如:

Call指令相對麻煩一點,因為Call的函數未必是虛擬機的偽代碼了。所以碰到Call指令,就要退出虛擬機,交由真實的CPU去處理了。代碼類似下面:

其余,要注意標志位的處理、不可模擬指令,以及指令的優化。還有異常處理,這里就不展開了。

VStartVM是虛擬機的入口,負責保存運行環境(各個寄存器的值)、以及初始化堆棧(虛擬機使用的變量全部在堆棧中)。

Bytecode是偽代碼;VMDispatcher對偽代碼逐個閱讀處理,然后分發給下面的各個子程序(Handler)。

加殼程序先把已知的X86指令解釋成了字節碼,放在PE文件中,然后將原處代碼刪掉,改成類似的代碼進入虛擬機執行循環。

VStartVM初始化后,堆棧情形如下:

edi指向VMcontext;esi指向偽代碼的地址;ebp指向真實堆棧的棧頂; 這三個寄存器在VM內不要再改了。

VMContext是虛擬機VM使用的虛擬環境結構:

VM之所以使用堆棧保存自己的寄存器結構,是考慮到多線程程序的兼容。

大家都知道脫殼時的堆棧平衡原理吧。同樣的,虛擬機在執行翻譯后的程序代碼時,也不可以隨便變動原來的堆棧地址。還需經常檢查在堆棧中的VMcontext結構不被沖掉。

責任編輯:武曉燕 來源: 看雪學院
相關推薦

2019-03-20 14:29:46

Linux虛擬內存

2018-11-29 09:13:47

CPU中斷控制器

2021-04-28 08:35:52

區塊鏈技術開發

2017-12-26 14:56:44

虛擬化基礎知識

2020-11-06 07:10:21

5G定位

2023-07-06 13:56:14

微軟Skype

2020-09-08 06:54:29

Java Gradle語言

2024-03-08 09:51:12

Linux網絡性能

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2022-02-09 16:23:07

網絡安全零信任技術

2022-06-17 11:03:11

5G安全隱私

2018-06-07 13:17:12

契約測試單元測試API測試

2021-08-01 09:55:57

Netty時間輪中間件

2023-09-27 16:39:38

2024-10-28 21:02:36

消息框應用程序

2021-12-06 09:43:01

鏈表節點函數

2021-07-16 11:48:26

模型 .NET微軟

2023-09-20 23:01:03

Twitter算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产片侵犯亲女视频播放 | 国产精品久久久久aaaa樱花 | 国产在线观看一区 | 国产乱一区二区三区视频 | 日本不卡一区 | 99精品在线观看 | 国产精品美女www爽爽爽视频 | 亚洲免费一区 | 久久久精品日本 | 亚洲高清在线 | 97超碰人人 | 毛片一区二区三区 | 欧美精品网站 | 亚洲视频中文字幕 | 久久av在线播放 | 亚洲精品4| 黄色一级免费观看 | 国产精品欧美大片 | 久久久精品| 欧美成年人网站 | 91九色麻豆| 国产精品亚洲成在人线 | 欧美精品tv | 日韩在线一区二区 | 黄色精品 | 不卡的av一区 | 99精品国产一区二区三区 | 久久成人18免费网站 | 亚洲欧美日韩国产综合 | 久久久久黄 | 久热免费在线 | 午夜影院普通用户体验区 | 日韩欧美国产成人一区二区 | 亚洲精品久久久一区二区三区 | 欧美综合视频 | 全免一级毛片 | 日韩快播电影 | 亚洲精品乱码久久久久v最新版 | 一区二区三区国产视频 | 亚洲精品女优 | 91精品国产一区二区三区 |