首页
社区
课程
招聘
[原创]I Pack You加密壳:实现页粒度的动态解密和惰性加密
发表于: 2026-5-24 16:17 1764

[原创]I Pack You加密壳:实现页粒度的动态解密和惰性加密

2026-5-24 16:17
1764

上一篇文章:I Pack You:实现基本的软件壳框架

搭建好基本框架之后,我又向框架中添加了一些基础的静态反调试功能,这篇文章主要记录一下如何实现页粒度的动态解密与惰性加密。

之前我们是在stub中一次性解密整个text段,这种方式很难对抗动态分析,因为解密之后内存中的代码就是明文了,很容易被dump下来。

为了增强壳的强度,我需要分多次解密text段,同时对使用较少的代码片段重新加密,待到其需要使用时在解密。这样一来,内存中很难出现完整的代码明文,对被加壳软件的保护力度得到了提升。

为了实现动态解密,我需要一种机制:在遇到加密的代码时暂停执行程序,将执行权转交到解密过程中。

操作系统的分页机制与Windows VEH很好地满足了我们的需求。我们将代码的状态(加密或解密)与内存的非法访问关联起来,通过VEH处理相关异常,实现动态解密和加密的功能。

采用VEH是因为它较于SEH更简单,不依赖于pdata等存储的信息,简化了stub的设计。

基本思想是这样的:

这是一个非常简单的策略,主要代码如下:

上面的代码为动态解密搭建好了框架,MyVEH函数需要判断异常的类型是否为内存的非法访问,同时还要判断发生异常的地址是否位于text段中:

解密流程由DecryptTextPage实现,在解密之后,我们需要把页面的权限设置为可读可执行:

如果拿着上面的框架去给一个程序加壳,那么有的程序能运行,有的不能运行。

通过调试VEH发现,出错的地址都在页尾附近。这是因为如果刚好有一条指令,它刚好占用了当前页页末和下一页页头部分的内存,那么这条指令就会被划分为两部分:已经解密的前半部分和加密的后半部分。如果前半部分刚好可以解释为一条新的指令,那么在触发下一页的解密流程前,CPU就会执行这条错误的指令。

这带来了很严重的后果:破坏了线程的上下文。CPU执行了一条错误的指令,再次读取指令时即使下一页解密了,但是读取到的字节已经不是原指令的起始字节了。

图片描述

主要矛盾是页面大小的固定性和amd64处理器指令的不定长性。我们在解密的时候不能只解密发生错误的页面,还要解密下一页面头部的若干字节,这样即使有指令跨页,那它也不会被分割为已解密的前半部分和未解密的后半部分。

为此我们需要将第二页面的权限设置为可读的,这样CPU就不会得到错误的指令。**但是当CPU尝试执行这条跨页指令时,依然会遇到违法访问,异常地址所在的页面仍旧是第一页面。也就是说,VEH会反复检查第一页面是否解密,发现已经解密了,返回让程序继续执行,程序执行跨页指令继续遇到访问违规异常,VEH又尝试解密第一页面。**这样就会得到一个死循环。

图片描述

我们可以设计这样一个机制:如果一个页面反复进入VEH处理到达一定次数后,我们就对它的下一页进行解密并设置可执行权限。这样就跳出了死循环。

将上面的解决方案组合起来,我设计了一个结构体管理页面信息:

每页对应一个结构体对象,这些对象通过数组管理。

同时更新我们的解密流程:


[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 0
打赏
分享
最新回复 (2)
雪    币: 3802
活跃值: (2499)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
dc4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6b7L8%4c8S2N6r3!0a6k6V1c8G2L8$3#2Q4x3V1k6F1L8%4c8Q4x3X3c8T1P5h3k6J5L8$3^5`.
2026-5-24 19:38
1
雪    币: 514
活跃值: (375)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
Saileaxh 8ecK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6b7L8%4c8S2N6r3!0a6k6V1c8G2L8$3#2Q4x3V1k6F1L8%4c8Q4x3X3c8T1P5h3k6J5L8$3^5`.
这个项目我之前没听说过。用page和VEH是我自己想出来的,还有很多不足。这个项目给了我很好的参考,感谢分享,祝君好运
2026-5-24 22:24
1
游客
登录 | 注册 方可回帖
返回