自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.Net8 AOT+VMP簡(jiǎn)單的逆向分析

開發(fā) 前端
VMP本身就是個(gè)虛擬機(jī),它把AOT的匯編代碼,進(jìn)行解析,組合,變形之后形成匯編代碼運(yùn)行。了解了這一點(diǎn),我們就知道上面的內(nèi)存快照只不過是它運(yùn)行時(shí)候的表現(xiàn),而實(shí)際上Exe里面的代碼未必會(huì)是這種表現(xiàn)。

1.前言

測(cè)試下VMP加密.NET的強(qiáng)度,選了最新的.Net8+AOT編譯,用VMP給它加殼。最后逆向下,簡(jiǎn)單的分析,本篇看下。

2.概述

一.前奏

首先一段簡(jiǎn)單的C#代碼:

namespace Test_{
    internal class Program{
        static void Main(string[] args) {
            Console.WriteLine("hello, World!");
            Console.ReadLine();
        }
    }
 }

把這段代碼編譯成AOT:

1.csproj里面添加 <PublishAot>true</PublishAot>
2.dotnet publish  -r win-x64 -c Release

編譯完成之后在路徑

bin\release\net8.0\win-x64\publish

找到Test_.exe,然后對(duì)它進(jìn)行VMP加密。這里用的是VMP3.7.1。為了最大強(qiáng)度加密,把它所有加密全選上,如下圖:

圖片圖片


最后得到一個(gè)獨(dú)立的Exe文件Test_.vmp.exe。把這個(gè)Exe運(yùn)行之后,拍攝一個(gè)內(nèi)存快照,它的堆棧如下

00 00000000`0014fad8 00007fff`00cc65cb     ntdll!NtReadFile+0x14
01 00000000`0014fae0 00000001`40140e2b     KERNELBASE!ReadFile+0x7b
02 00000000`0014fb50 00000001`401419d9     Test__vmp+0x140e2b
03 00000000`0014fc10 00000001`401418d1     Test__vmp+0x1419d9
04 00000000`0014fc60 00000001`40143bed     Test__vmp+0x1418d1
05 00000000`0014fca0 00000001`400e0796     Test__vmp+0x143bed
06 00000000`0014fd00 00000001`400e0857     Test__vmp+0xe0796
07 00000000`0014fd50 00000001`401440ce     Test__vmp+0xe0857
08 00000000`0014fda0 00000001`401413d2     Test__vmp+0x1440ce
09 00000000`0014fde0 00000001`4007b455     Test__vmp+0x1413d2
0a 00000000`0014fe10 00000001`4016bc0b     Test__vmp+0x7b455
0b 00000000`0014fe40 00000001`4006e15e     Test__vmp+0x16bc0b
0c 00000000`0014fea0 00000001`400694b4     Test__vmp+0x6e15e
0d 00000000`0014fef0 00007fff`029426ad     Test__vmp+0x694b4
0e 00000000`0014ff30 00007fff`0370aa68     kernel32!BaseThreadInitThunk+0x1d
0f 00000000`0014ff60 00000000`00000000     ntdll!RtlUserThreadStart+0x28

因?yàn)樗T诹薘eadLine()這個(gè)托管函數(shù)上面,又因?yàn)橥泄艽a進(jìn)行了AOT,所以它這里的堆棧其實(shí)就是非托管棧。

注意這個(gè)堆棧里面的第10行,也即編號(hào)09哪一行

09 00000000`0014fde0 00000001`4007b455     Test__vmp+0x1413d2

這里就是.Net8預(yù)編代碼AOT的托管Main入口的非托管表現(xiàn)。

Test__Test__Program__Main

看下它的內(nèi)容:

00000001`4007b440 4883ec28        sub     rsp,28h
00000001`4007b444 488d0d6dc52200  lea     rcx,[Test__vmp+0x2a79b8 (00000001`402a79b8)]
00000001`4007b44b e8905f0c00      call    Test__vmp+0x1413e0 (00000001`401413e0)
00000001`4007b450 e86b5f0c00      call    Test__vmp+0x1413c0 (00000001`401413c0)
00000001`4007b455 90              nop
00000001`4007b456 4883c428        add     rsp,28h
00000001`4007b45a c3              ret

這里剛好的是托管示例的機(jī)器碼調(diào)用,注意它只是內(nèi)存里面的表現(xiàn)

二:虛擬機(jī)原理

這里需要簡(jiǎn)單了解下虛擬機(jī)的原理,虛擬機(jī)會(huì)根據(jù)傳遞進(jìn)來的代碼,對(duì)這些代碼進(jìn)行,解析,組合,變形等等之后,組合成新的機(jī)器碼在機(jī)器上運(yùn)行。這里的VMP本身就是個(gè)虛擬機(jī),它把AOT的匯編代碼,進(jìn)行解析,組合,變形之后形成匯編代碼運(yùn)行。了解了這一點(diǎn),我們就知道上面的內(nèi)存快照只不過是它運(yùn)行時(shí)候的表現(xiàn),而實(shí)際上Exe里面的代碼未必會(huì)是這種表現(xiàn)。

這里看下,hello World字符串

00000001`4007b444 488d0d6dc52200  lea     rcx,[Test__vmp+0x2a79b8 (00000001`402a79b8)]

它指向的就是字符串實(shí)例的MethodTable,hello world字符串清晰可見:

00000001`402a79b8  88 41 20 40 01 00 00 00-0d 00 00 00 48 00 68 00  .A @........h.e.
00000001`402a79c8  6c 00 6c 00 6f 00 2c 00-20 00 57 00 6f 00 72 00  l.l.o.,. .W.o.r.
00000001`402a79d8  6c 00 64 00 21 00 00 00-00 00 00 00 00 00 00 00  l.d.!...........

但是這些代碼只是內(nèi)存的表現(xiàn),而實(shí)際上存儲(chǔ)在Exe里面可能是加密過的字符串,這里是解析之后,最后運(yùn)行的結(jié)果。如果想要修改掉這串字符,那么得找到這串字符ASCII單個(gè)byte加密的地方。

三:特征碼

我們可以看到字符串的操作取地址lea指令后面是立即數(shù):

00000001`4007b444 488d0d6dc52200  lea     rcx,[Test__vmp+0x2a79b8 (00000001`402a79b8)]

一般來說,這種取地址不會(huì)混淆,所以這里在Test_.vmp.exe的整個(gè)匯編里面搜索一下特征

lea rcx 后面跟立即數(shù)的

結(jié)果如下:

000000014067AA6D: 48 8D 0C 06    lea   rcx,[000000014067B101]

地址:000000014067AAE4如下:

000000014067B101: 93                 xchg        eax,ebx
000000014067B102: 32 C0              xor         al,al
000000014067B104: CB                 retf
000000014067B105: 02 68 B0           add         ch,byte ptr [rax-50h]

可以看到地址:000000014067B106有個(gè)0x68,還記得上面的hello World字符串嘛,首字母h的ASCII就是0x68。

OK,要找的就是這個(gè)地方了,在十六進(jìn)制編輯器里面把它改成0x67,然后保存運(yùn)行下Test_.vmp.exe。字符串hello World變成了gello World,如下圖。

圖片圖片

非常簡(jiǎn)單的一個(gè)例子,帶大家玩玩VMP。如果你對(duì)以上感興趣,可以點(diǎn)擊下面卡片關(guān)注我。帶你玩好玩的技術(shù)。

責(zé)任編輯:武曉燕 來源: 江湖評(píng)談
相關(guān)推薦

2023-07-11 00:17:58

.Net8AOTC

2023-07-09 23:55:16

C++RoslynILC

2023-11-17 13:42:06

.NET8C#工具

2023-07-14 08:29:55

AOT.Net程序

2023-10-07 10:16:18

.Net8GC內(nèi)存

2023-12-15 17:09:28

.NET8Primitives性能

2023-11-06 10:03:01

.Net8類型轉(zhuǎn)換

2023-11-17 08:52:32

.NET8C#

2024-08-30 09:21:28

2025-04-02 07:40:30

2024-11-07 12:33:47

2023-12-27 07:33:54

2018-11-06 09:31:34

物聯(lián)網(wǎng)分析AoT物聯(lián)網(wǎng)

2024-11-12 07:28:39

2017-10-21 21:58:18

符號(hào)執(zhí)行AngrCTF

2025-02-24 02:00:00

.NET8Web開發(fā)

2024-09-29 15:21:01

2009-10-09 17:40:38

VB.Net問題集

2010-01-15 15:39:14

VB.NET Sub過

2009-10-13 09:24:57

VB.NET Dock
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)