美文网首页
自写保护壳交流——指令的膨胀和花指令的插入

自写保护壳交流——指令的膨胀和花指令的插入

作者: 看雪学院 | 来源:发表于2019-04-09 18:33 被阅读0次

从准备写壳到到现在已经有半年多的时间了,期间代码框架重构了很多次。

总体架构共有三部分:PE部分、混淆虚拟化部分、保护部分。

目前 PE部分只写了简单的操作,没有对代码段的压缩和对导入表的处理。虚拟化部分,框架大概写蹦了5、6次(目前可以做到简单指令的模拟和对重定位的支持)最近一次是在2个月以前,将架构改成vmp 3.x的链式寻址的时候,又写蹦了框架,现在还没有整合。

本帖就说一下近期在写的混淆部分:

目前在写代码混淆膨胀部分,目前的设定框架是由3块组成:

1. 代码块的拆分

2. 全局地址管理器

3. 混淆过程

一、代码块的拆分

二、混淆地址管理器

混淆地址管理器,也叫全局地址管理器,因为vm框架也是用这个地址管理器。 在代码混淆过程中,你并不知道接下来的代码区块将会被膨胀到多大,所以必须要一个地址管理器来确定下一区块的大小。

首先要将地址分块,按照去除重定位(401000 处加载基址)的方式分配地址:

代码块1:address 0x40B016 

代码块2:address  xxx

代码块3:address  xxx

使用地址管理器将代码块的地方分配并连接起来达到如下效果:

混淆分块后效果图:

三、混淆过程步骤

使用 代码块的拆分+地址管理器 -> 将代码块划分成一个个小的地址快来进行管理

首先划分区块,并将区块打上属性标签。

1. 区块划分

[DBGLOG]:代码块0,区块属性 JCC

mov eax, 0x1

cmp eax, 0x2

jz 0x40100e

[DBGLOG]:代码块1,区块属性 NULL

add eax, 0x1

inc eax

[DBGLOG]:代码块2,区块属性 JCC

mov eax, eax

add eax, 0x1

cmp eax, 0x1

jnz 0x40101d

[DBGLOG]:代码块3,区块属性 NULL

mov eax, eax

add eax, 0x1

[DBGLOG]:代码块4,区块属性 JCC

add eax, 0x1

dec eax

cmp eax, 0x2

jz 0x40102b

[DBGLOG]:代码块5,区块属性 NULL

mov eax, eax

add eax, 0x1

[DBGLOG]:代码块6,区块属性 JCC

mov eax, eax

mov eax, eax

dec eax

cmp eax, 0x3

jnz 0x40103a

[DBGLOG]:代码块7,区块属性 NULL

mov eax, eax

add eax, 0x1

[DBGLOG]:代码块8,区块属性 End

sub eax, 0x1

mov eax, eax

2. 将代码区块使用地址管理器分配地址:

[DBGLOG] 地址:00401000,代码块:0

[DBGLOG] 地址:0040100a,代码块:1

[DBGLOG] 地址:0040100e,代码块:2

[DBGLOG] 地址:00401018,代码块:3

[DBGLOG] 地址:0040101d,代码块:4

[DBGLOG] 地址:00401026,代码块:5

[DBGLOG] 地址:0040102b,代码块:6

[DBGLOG] 地址:00401035,代码块:7

[DBGLOG] 地址:0040103a,代码块:8

3. 添加简易重定位支持

这里对于混淆引擎来说使用到的全局变量应该交由PE部分去处理,但我这边偷懒直接使用vmp的重定位方式(/尴尬)

4. 指令处理

对于混淆虚拟化来说代码的本质是等价替换,这里以举一个最简单的例子push 0x123456 :

我的方式 主要是对0x123456 进行处理,首先拿到0x123456 这个立即数 对0x123456进行加法,

异或 等操作 imm = ( 0x123456+0x111111 ) ^ 0x22222 = 0x216745在混淆代码中表现出来:

正常代码块:

代码块拆分:

代码混淆部分+花部分 :

里面去除了对某些指令的膨胀(比方xor)相对比较简单,新手项可以看未加壳部分,要求是逆出key

CrackMe :

Crackme_pack.exe(点击左下角阅读原文下载)

原始的未混淆部分:

Crackme_原始.exe(点击左下角阅读原文下载)

写在最后:

自己的工程参考了很多很多代码(多到我也记不清了,就不一一署名),先谢谢前辈们无私的奉献。

本文由看雪论坛 Wszzy 原创

转载请注明来自看雪社区

相关文章

  • 自写保护壳交流——指令的膨胀和花指令的插入

    从准备写壳到到现在已经有半年多的时间了,期间代码框架重构了很多次。 总体架构共有三部分:PE部分、混淆虚拟化部分、...

  • Vim的常用指令

    Vim的常用指令 1.移动 2.插入 2.1 普通模式进入插入模式 以下指令可以从普通模式进入插入模式,并会在相应...

  • 机器指令、汇编指令、系统调用(OS Kernel)、标准库、应用

    目录概述硬件 — CPU指令集:机器指令、汇编指令操作系统内核Kernel及系统调用、实现说明壳层Shell目前的...

  • 第十四章

    第十四章 指令的规则指令都以#开始在指令的符号之间可以插入任意数量的空格或水平制表符指令总是在第一个换行符处结束,...

  • Angular 动态组件加载

    1.首先定义一个辅助指令 辅助指令用来标记 动态组件 的插入点 2.定义需要动态插入的组件 3.定义Service...

  • 2020-05-27

    #QXDM 插入指令 def start(): value = input('Plese input:') ...

  • Angular 指令,管道,服务

    1. 指令 Directive 指令是 Angular 提供的操作 DOM 的途径。指令分为属性指令和结构指令...

  • 虚拟机保护逆向入门

    前言 软件防逆向工程与逆向工程相伴发展,早期的有花指令,反调试技术,代码混淆与加密,加压缩壳或者加密壳等等保护手段...

  • 微信小程序云开发 云数据库的操作

    云数据库 1初始化 2 插入数据 3 查 4 更新数据 5 删除数据 6查询指令 & 逻辑指令 云数据库查询指令 ...

  • 常用交易指令

    国际上常用的交易指令有:市价指令、限价指令、止损指令和取消指令等。我国期货交易所规定的交易指令有两种:限价指令和取...

网友评论

      本文标题:自写保护壳交流——指令的膨胀和花指令的插入

      本文链接:https://www.haomeiwen.com/subject/adiiiqtx.html